From 6d3a8a8b76b68da07b186e81a8bd9854210ed996 Mon Sep 17 00:00:00 2001 From: AntiTopQuark Date: Fri, 22 Nov 2024 17:15:26 +0000 Subject: [PATCH] [FEAT MERGE] patch 3A from 4_2_x_release to master Co-authored-by: rolandqi Co-authored-by: WeiXinChan --- deps/easy/src/io/easy_baseth_pool.c | 5 +- deps/easy/src/io/ev_epoll.c | 1 - deps/oblib/src/common/ob_balance_filter.cpp | 2 +- deps/oblib/src/common/ob_clock_generator.cpp | 6 +- deps/oblib/src/common/ob_clock_generator.h | 2 + deps/oblib/src/lib/CMakeLists.txt | 11 + deps/oblib/src/lib/alloc/memory_dump.cpp | 15 +- deps/oblib/src/lib/alloc/memory_dump.h | 15 +- .../src/lib/ash/ob_active_session_guard.cpp | 323 +- .../src/lib/ash/ob_active_session_guard.h | 424 +- .../ash/ob_ash_bkgd_sess_inactive_guard.cpp | 37 + .../lib/ash/ob_ash_bkgd_sess_inactive_guard.h | 34 + deps/oblib/src/lib/lock/cond.h | 7 + deps/oblib/src/lib/lock/ob_latch.cpp | 28 +- deps/oblib/src/lib/lock/ob_latch.h | 93 +- deps/oblib/src/lib/lock/ob_scond.h | 2 +- deps/oblib/src/lib/lock/ob_thread_cond.cpp | 2 +- .../src/lib/mysqlclient/ob_mysql_result.h | 75 + deps/oblib/src/lib/ob_define.h | 1 + deps/oblib/src/lib/ob_lib_config.cpp | 4 +- deps/oblib/src/lib/ob_lib_config.h | 35 +- .../lib/objectpool/ob_concurrency_objpool.h | 4 + .../src/lib/oblog/ob_base_log_writer.cpp | 2 + .../oblib/src/lib/oblog/ob_log_compressor.cpp | 3 +- deps/oblib/src/lib/queue/ob_dedup_queue.cpp | 1 + deps/oblib/src/lib/queue/ob_lighty_queue.cpp | 1 + deps/oblib/src/lib/queue/ob_priority_queue.h | 24 +- deps/oblib/src/lib/restore/ob_storage.cpp | 1 + .../src/lib/restore/ob_storage_cos_base.cpp | 2 +- .../src/lib/restore/ob_storage_oss_base.cpp | 2 +- .../src/lib/restore/ob_storage_s3_base.cpp | 2 +- deps/oblib/src/lib/signal/ob_signal_utils.cpp | 8 +- .../src/lib/stat/mock_diagnostic_info.cpp | 31 + deps/oblib/src/lib/stat/ob_di_cache.cpp | 468 +- deps/oblib/src/lib/stat/ob_di_cache.h | 268 +- deps/oblib/src/lib/stat/ob_diagnose_info.cpp | 330 +- deps/oblib/src/lib/stat/ob_diagnose_info.h | 231 +- .../oblib/src/lib/stat/ob_diagnostic_info.cpp | 284 + deps/oblib/src/lib/stat/ob_diagnostic_info.h | 361 ++ .../lib/stat/ob_diagnostic_info_container.cpp | 533 ++ .../lib/stat/ob_diagnostic_info_container.h | 178 + .../src/lib/stat/ob_diagnostic_info_guard.cpp | 380 ++ .../src/lib/stat/ob_diagnostic_info_guard.h | 285 + .../lib/stat/ob_diagnostic_info_summary.cpp | 360 ++ .../src/lib/stat/ob_diagnostic_info_summary.h | 204 + .../src/lib/stat/ob_diagnostic_info_util.cpp | 57 + .../src/lib/stat/ob_diagnostic_info_util.h | 39 + deps/oblib/src/lib/stat/ob_latch_define.cpp | 2 +- deps/oblib/src/lib/stat/ob_latch_define.h | 10 +- deps/oblib/src/lib/stat/ob_session_stat.cpp | 52 +- deps/oblib/src/lib/stat/ob_session_stat.h | 158 - deps/oblib/src/lib/stat/ob_stat_template.cpp | 41 +- deps/oblib/src/lib/stat/ob_stat_template.h | 272 +- .../src/lib/statistic_event/ob_stat_event.cpp | 18 +- .../src/lib/statistic_event/ob_stat_event.h | 19 +- deps/oblib/src/lib/string/ob_string.h | 2 +- deps/oblib/src/lib/task/ob_timer.cpp | 2 + .../src/lib/thread/ob_reentrant_thread.cpp | 23 +- .../src/lib/thread/ob_reentrant_thread.h | 5 +- .../src/lib/thread/ob_simple_thread_pool.ipp | 8 +- deps/oblib/src/lib/thread/ob_tenant_hook.cpp | 11 +- deps/oblib/src/lib/thread/ob_thread_name.h | 3 + deps/oblib/src/lib/thread/thread.cpp | 13 +- deps/oblib/src/lib/thread/threads.cpp | 2 + .../src/lib/utility/ob_hang_fatal_error.cpp | 3 +- deps/oblib/src/lib/utility/ob_macro_utils.h | 16 +- deps/oblib/src/lib/utility/utility.cpp | 1 + deps/oblib/src/lib/utility/utility.h | 37 +- .../lib/wait_event/ob_inner_sql_wait_type.h | 98 + .../src/lib/wait_event/ob_wait_event.cpp | 43 +- deps/oblib/src/lib/wait_event/ob_wait_event.h | 116 +- deps/oblib/src/lib/xml/ob_xml_util.cpp | 4 + deps/oblib/src/rpc/ob_request.cpp | 6 + deps/oblib/src/rpc/ob_request.h | 27 +- .../oblib/src/rpc/ob_rpc_request_operator.cpp | 11 + deps/oblib/src/rpc/ob_rpc_request_operator.h | 4 +- .../src/rpc/obmysql/ob_2_0_protocol_utils.cpp | 1 + .../rpc/obmysql/ob_mysql_request_utils.cpp | 2 +- deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp | 24 +- deps/oblib/src/rpc/obmysql/obsm_struct.h | 2 + deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp | 9 +- deps/oblib/src/rpc/obrpc/ob_rpc_endec.h | 3 + deps/oblib/src/rpc/obrpc/ob_rpc_packet.h | 5 + .../src/rpc/obrpc/ob_rpc_processor_base.cpp | 3 + deps/oblib/src/rpc/obrpc/ob_rpc_proxy.h | 1 + deps/oblib/src/rpc/obrpc/ob_rpc_proxy.ipp | 37 +- deps/oblib/src/rpc/pnio/io/eloop.c | 4 +- deps/oblib/unittest/CMakeLists.txt | 4 +- deps/oblib/unittest/lib/CMakeLists.txt | 4 +- .../oblib/unittest/lib/stat/test_di_cache.cpp | 40 +- .../unittest/lib/stat/test_diagnose_info.cpp | 236 +- .../lib/stat/test_diagnostic_info.cpp | 192 + .../unittest/lib/stat/test_stat_template.cpp | 19 +- .../unittest/lib/trace/test_trace_event.cpp | 2 + .../lib/unittest_diagnostic_info_util.h | 50 + hotfuncs.txt | 34 +- mittest/mtlenv/mock_tenant_module_env.h | 1 + observer.prof.1702984872675 | 71 +- src/diagnose/lua/ob_lua_api.cpp | 6 +- src/diagnose/lua/ob_lua_handler.cpp | 6 +- .../archiveservice/ob_archive_fetcher.cpp | 2 + .../archiveservice/ob_archive_sequencer.cpp | 3 + .../archiveservice/ob_archive_service.cpp | 2 + .../archiveservice/ob_archive_timer.cpp | 2 +- src/logservice/archiveservice/ob_ls_mgr.cpp | 2 + src/logservice/cdcservice/ob_cdc_service.cpp | 2 +- src/logservice/libobcdc/src/CMakeLists.txt | 2 +- src/logservice/ob_garbage_collector.cpp | 2 +- src/logservice/palf/log_block_mgr.cpp | 2 +- src/logservice/palf/log_cache.cpp | 1 - src/logservice/palf/log_loop_thread.cpp | 2 +- src/logservice/palf/log_throttle.cpp | 2 +- src/logservice/palf/palf_env_impl.cpp | 2 +- src/logservice/palf/palf_handle_impl.cpp | 4 +- .../restoreservice/ob_log_restore_service.cpp | 2 + .../ob_remote_fetch_log_worker.cpp | 1 + .../restoreservice/ob_remote_log_writer.cpp | 2 +- src/observer/CMakeLists.txt | 3 + .../ob_dbms_sched_job_master.cpp | 8 +- src/observer/main.cpp | 3 +- src/observer/mysql/ob_mysql_end_trans_cb.cpp | 6 +- .../mysql/ob_mysql_request_manager.cpp | 11 +- src/observer/mysql/ob_query_response_time.cpp | 475 +- src/observer/mysql/ob_query_response_time.h | 116 +- src/observer/mysql/ob_query_retry_ctrl.cpp | 129 + src/observer/mysql/ob_query_retry_ctrl.h | 17 +- src/observer/mysql/obmp_base.cpp | 8 +- src/observer/mysql/obmp_connect.cpp | 17 +- src/observer/mysql/obmp_disconnect.cpp | 4 +- src/observer/mysql/obmp_query.cpp | 58 +- src/observer/mysql/obmp_query.h | 4 +- src/observer/mysql/obmp_reset_connection.cpp | 5 +- src/observer/mysql/obmp_stmt_close.cpp | 1 - src/observer/mysql/obmp_stmt_execute.cpp | 49 +- src/observer/mysql/obmp_stmt_execute.h | 3 +- src/observer/mysql/obmp_stmt_fetch.cpp | 40 +- .../mysql/obmp_stmt_get_piece_data.cpp | 23 +- src/observer/mysql/obmp_stmt_prepare.cpp | 27 +- .../mysql/obmp_stmt_send_long_data.cpp | 21 +- .../mysql/obmp_stmt_send_piece_data.cpp | 21 +- src/observer/mysql/obsm_conn_callback.cpp | 6 + src/observer/mysql/obsm_handler.cpp | 5 + src/observer/net/ob_net_queue_traver.cpp | 236 + src/observer/net/ob_net_queue_traver.h | 96 + src/observer/ob_inner_sql_connection.cpp | 310 +- src/observer/ob_inner_sql_connection.h | 32 +- src/observer/ob_inner_sql_connection_pool.cpp | 11 +- src/observer/ob_inner_sql_connection_pool.h | 4 +- src/observer/ob_inner_sql_read_context.cpp | 2 +- src/observer/ob_inner_sql_result.cpp | 6 +- src/observer/ob_inner_sql_result.h | 6 +- src/observer/ob_inner_sql_rpc_processor.cpp | 2 +- .../ob_resource_inner_sql_connection_pool.cpp | 4 +- src/observer/ob_root_service_monitor.cpp | 2 +- src/observer/ob_server.cpp | 16 +- src/observer/ob_server_reload_config.cpp | 4 + src/observer/ob_server_schema_updater.cpp | 2 + src/observer/ob_signal_handle.cpp | 2 + src/observer/ob_srv_deliver.cpp | 119 +- src/observer/ob_srv_deliver.h | 1 + src/observer/ob_srv_task.h | 6 + src/observer/ob_uniq_task_queue.h | 2 + src/observer/omt/ob_multi_level_queue.h | 1 + src/observer/omt/ob_multi_tenant.cpp | 76 +- src/observer/omt/ob_multi_tenant.h | 1 + src/observer/omt/ob_tenant.cpp | 6 +- src/observer/omt/ob_tenant.h | 12 +- src/observer/omt/ob_tenant_node_balancer.cpp | 7 +- src/observer/omt/ob_tenant_srs.cpp | 1 + src/observer/omt/ob_th_worker.cpp | 42 +- src/observer/omt/ob_th_worker.h | 1 + src/observer/report/ob_ls_table_updater.cpp | 2 +- .../report/ob_tablet_table_updater.cpp | 2 +- src/observer/table/ob_table_audit.h | 1 - .../ob_table_query_and_mutate_processor.cpp | 1 + src/observer/table/ob_table_rpc_processor.cpp | 6 +- src/observer/table/ob_table_rpc_processor.h | 1 - .../table/ob_table_rpc_processor_util.h | 61 +- .../table_load/ob_table_load_coordinator.cpp | 2 +- .../ob_table_load_task_scheduler.cpp | 1 - src/observer/virtual_table/ob_all_latch.cpp | 18 +- .../ob_all_virtual_res_mgr_sys_stat.cpp | 500 ++ .../ob_all_virtual_res_mgr_sys_stat.h | 81 + .../ob_all_virtual_session_event.cpp | 64 +- .../ob_all_virtual_session_event.h | 4 +- .../ob_all_virtual_session_stat.cpp | 38 +- .../ob_all_virtual_session_stat.h | 4 +- .../ob_all_virtual_session_wait.cpp | 51 +- .../ob_all_virtual_session_wait.h | 4 +- .../ob_all_virtual_session_wait_history.cpp | 43 +- .../ob_all_virtual_session_wait_history.h | 4 +- .../virtual_table/ob_all_virtual_sql_stat.cpp | 706 +++ .../virtual_table/ob_all_virtual_sql_stat.h | 154 + .../ob_all_virtual_ss_local_cache_info.cpp | 3 +- .../ob_all_virtual_sys_event.cpp | 15 +- .../virtual_table/ob_all_virtual_sys_stat.cpp | 5 +- .../virtual_table/ob_gv_sql_audit.cpp | 2 +- .../ob_information_kvcache_table.cpp | 28 +- .../ob_information_query_response_time.cpp | 103 +- .../ob_information_query_response_time.h | 5 +- src/observer/virtual_table/ob_virtual_ash.cpp | 158 +- src/observer/virtual_table/ob_virtual_ash.h | 2 +- .../ob_virtual_data_access_service.cpp | 4 + .../ob_virtual_table_iterator_factory.cpp | 20 + src/pl/diagnosis/ob_pl_sql_audit_guard.cpp | 23 +- src/pl/diagnosis/ob_pl_sql_audit_guard.h | 3 + src/pl/ob_pl.cpp | 172 + src/pl/ob_pl.h | 27 + src/pl/ob_pl_compile.cpp | 4 +- src/pl/ob_pl_resolver.h | 1 + .../ob_dbms_workload_repository.cpp | 4702 +++++++++++++---- .../sys_package/ob_dbms_workload_repository.h | 111 +- .../backup/ob_backup_base_service.cpp | 1 + .../ddl_task/ob_index_build_task.cpp | 1 + .../freeze/ob_freeze_reentrant_thread.cpp | 4 +- src/rootserver/ob_ddl_service.cpp | 2 +- .../ob_disaster_recovery_task_mgr.cpp | 37 +- .../ob_disaster_recovery_task_mgr.h | 4 +- src/rootserver/ob_empty_server_checker.cpp | 14 +- src/rootserver/ob_empty_server_checker.h | 2 - src/rootserver/ob_lost_replica_checker.cpp | 16 +- src/rootserver/ob_lost_replica_checker.h | 1 - src/rootserver/ob_ls_recovery_reportor.cpp | 2 +- src/rootserver/ob_root_inspection.cpp | 1 + src/rootserver/ob_root_service.cpp | 1 - src/rootserver/ob_rs_reentrant_thread.cpp | 5 +- src/rootserver/ob_rs_reentrant_thread.h | 3 +- src/rootserver/ob_rs_thread_checker.cpp | 2 +- src/rootserver/ob_tenant_info_loader.cpp | 2 +- src/rootserver/ob_tenant_thread_helper.cpp | 3 +- src/rootserver/ob_thread_idling.cpp | 1 + src/share/CMakeLists.txt | 2 + .../ob_shared_memory_allocator_mgr.h | 2 +- src/share/ash/ob_active_sess_hist_list.cpp | 95 +- src/share/ash/ob_active_sess_hist_list.h | 178 +- src/share/ash/ob_active_sess_hist_task.cpp | 85 +- src/share/ash/ob_active_sess_hist_task.h | 9 +- src/share/ash/ob_ash_refresh_task.cpp | 238 + src/share/ash/ob_ash_refresh_task.h | 45 + src/share/ash/ob_di_util.cpp | 235 + src/share/ash/ob_di_util.h | 44 + .../ob_lcl_batch_sender_thread.cpp | 3 +- src/share/detect/ob_detect_manager.cpp | 2 +- .../ob_inner_table_schema.11101_11150.cpp | 220 + .../ob_inner_table_schema.12401_12450.cpp | 2629 +++++++++ .../ob_inner_table_schema.12451_12500.cpp | 135 + .../ob_inner_table_schema.12501_12550.cpp | 695 +++ .../ob_inner_table_schema.15401_15450.cpp | 2545 +++++++++ .../ob_inner_table_schema.15451_15500.cpp | 1070 ++++ .../ob_inner_table_schema.21001_21050.cpp | 4 +- .../ob_inner_table_schema.21251_21300.cpp | 4 +- .../ob_inner_table_schema.21301_21350.cpp | 2 +- .../ob_inner_table_schema.21351_21400.cpp | 16 +- .../ob_inner_table_schema.21401_21450.cpp | 4 +- .../ob_inner_table_schema.21451_21500.cpp | 714 +++ .../ob_inner_table_schema.21501_21550.cpp | 204 + .../ob_inner_table_schema.21551_21600.cpp | 102 + .../ob_inner_table_schema.21601_21650.cpp | 204 + .../ob_inner_table_schema.25201_25250.cpp | 2 +- .../ob_inner_table_schema.25251_25300.cpp | 255 + .../ob_inner_table_schema.28001_28050.cpp | 4 +- .../ob_inner_table_schema.28101_28150.cpp | 4 +- .../ob_inner_table_schema.28201_28250.cpp | 561 ++ .../ob_inner_table_schema.28251_28300.cpp | 153 + .../ob_inner_table_schema.451_500.cpp | 1488 ++++++ .../ob_inner_table_schema.501_550.cpp | 834 +++ .../ob_inner_table_schema.50451_50500.cpp | 408 ++ .../ob_inner_table_schema.50501_50550.cpp | 272 + .../ob_inner_table_schema.60451_60500.cpp | 273 + .../ob_inner_table_schema.60501_60550.cpp | 182 + src/share/inner_table/ob_inner_table_schema.h | 356 +- .../inner_table/ob_inner_table_schema.lob.cpp | 2 +- .../ob_inner_table_schema_constants.h | 148 + .../inner_table/ob_inner_table_schema_def.py | 2655 +++++++++- .../ob_inner_table_schema_misc.ipp | 104 +- .../sys_package/dbms_ash_internal_body.sql | 9 + .../sys_package/dbms_workload_repository.sql | 37 +- .../dbms_workload_repository_body.sql | 709 +-- .../dbms_workload_repository_body_mysql.sql | 28 +- .../dbms_workload_repository_mysql.sql | 22 +- src/share/inner_table/table_id_to_name | 83 + src/share/io/ob_io_define.cpp | 2 +- src/share/io/ob_io_struct.cpp | 4 +- .../location_cache/ob_location_service.cpp | 1 + src/share/ls/ob_ls_recovery_stat_operator.cpp | 3 + src/share/ls/ob_ls_status_operator.cpp | 2 + src/share/ob_autoincrement_service.cpp | 10 + src/share/ob_bg_thread_monitor.cpp | 2 +- src/share/ob_cluster_version.cpp | 14 + src/share/ob_cluster_version.h | 2 + src/share/ob_ddl_task_executor.cpp | 5 +- src/share/ob_dml_sql_splicer.cpp | 17 + src/share/ob_dml_sql_splicer.h | 1 + src/share/ob_local_device.cpp | 3 + src/share/ob_occam_thread_pool.h | 3 + src/share/ob_occam_time_guard.h | 3 +- src/share/ob_server_blacklist.cpp | 2 +- src/share/ob_service_epoch_proxy.cpp | 1 + src/share/ob_tablet_autoincrement_service.cpp | 1 + src/share/ob_task_define.cpp | 2 +- src/share/ob_tenant_info_proxy.cpp | 1 + src/share/object/ob_obj_cast.cpp | 37 +- src/share/parameter/ob_parameter_seed.ipp | 21 +- src/share/ratelimit/ob_rl_mgr.cpp | 7 +- src/share/rc/ob_tenant_base.cpp | 41 +- src/share/rc/ob_tenant_base.h | 7 + src/share/resource_manager/ob_cgroup_ctrl.cpp | 3 +- src/share/resource_manager/ob_cgroup_ctrl.h | 14 +- src/share/resource_manager/ob_group_list.h | 2 +- src/share/restore/ob_restore_type.cpp | 5 - src/share/restore/ob_restore_type.h | 2 +- src/share/rpc/ob_batch_rpc.cpp | 4 +- .../scheduler/ob_tenant_dag_scheduler.cpp | 3 + src/share/schema/ob_ddl_trans_controller.cpp | 1 + .../ob_multi_version_schema_service.cpp | 3 +- src/share/stat/ob_opt_system_stat_cache.cpp | 1 + src/share/tablet/ob_tablet_to_ls_operator.cpp | 1 + src/share/wr/ob_wr_collector.cpp | 1639 +++++- src/share/wr/ob_wr_collector.h | 381 +- src/share/wr/ob_wr_service.cpp | 32 +- src/share/wr/ob_wr_service.h | 16 +- src/share/wr/ob_wr_snapshot_rpc_processor.cpp | 179 +- src/share/wr/ob_wr_snapshot_rpc_processor.h | 10 +- src/share/wr/ob_wr_stat_guard.h | 11 +- src/share/wr/ob_wr_task.cpp | 98 +- src/share/wr/ob_wr_task.h | 17 +- src/sql/CMakeLists.txt | 1 + src/sql/das/ob_das_ref.cpp | 4 + src/sql/das/ob_das_retry_ctrl.cpp | 18 +- src/sql/das/ob_das_rpc_processor.cpp | 47 +- src/sql/das/ob_das_rpc_processor.h | 8 +- src/sql/das/ob_das_task.cpp | 2 +- src/sql/das/ob_das_task.h | 14 +- src/sql/das/ob_data_access_service.cpp | 8 +- src/sql/engine/cmd/ob_kill_executor.cpp | 3 + src/sql/engine/dml/ob_dml_service.cpp | 4 +- src/sql/engine/expr/ob_expr_column_conv.cpp | 2 +- src/sql/engine/expr/ob_expr_func_sleep.cpp | 1 - src/sql/engine/ob_des_exec_context.cpp | 3 +- src/sql/engine/ob_operator.cpp | 4 +- src/sql/engine/ob_operator.h | 24 +- src/sql/engine/ob_physical_plan.cpp | 1 + src/sql/engine/ob_physical_plan.h | 1 + src/sql/engine/px/ob_dfo_mgr.cpp | 3 + src/sql/engine/px/ob_px_admission.cpp | 3 + src/sql/engine/px/ob_px_rpc_processor.cpp | 13 +- src/sql/engine/px/ob_px_scheduler.cpp | 2 +- src/sql/engine/px/ob_px_target_mgr.cpp | 3 +- src/sql/engine/px/ob_px_task_process.cpp | 21 +- src/sql/engine/px/ob_px_worker.cpp | 1 - .../ob_external_table_access_service.cpp | 12 + src/sql/engine/table/ob_table_scan_op.cpp | 10 +- .../executor/ob_remote_executor_processor.cpp | 43 +- src/sql/executor/ob_task.cpp | 8 + src/sql/monitor/ob_exec_stat.h | 40 +- src/sql/monitor/ob_sql_stat_record.cpp | 656 +++ src/sql/monitor/ob_sql_stat_record.h | 342 ++ src/sql/ob_end_trans_callback.cpp | 32 +- src/sql/ob_end_trans_callback.h | 4 + src/sql/ob_i_end_trans_callback.h | 4 + src/sql/ob_result_set.cpp | 6 + src/sql/ob_spi.cpp | 3 + src/sql/ob_sql_context.cpp | 2 + src/sql/ob_sql_context.h | 49 +- src/sql/ob_sql_trans_control.cpp | 15 +- src/sql/optimizer/ob_join_order.cpp | 2 +- src/sql/parser/ob_sql_parser.cpp | 5 +- src/sql/plan_cache/ob_lib_cache_register.h | 1 + src/sql/plan_cache/ob_pc_ref_handle.cpp | 2 + src/sql/plan_cache/ob_pc_ref_handle.h | 2 + .../resolver/cmd/ob_alter_system_resolver.cpp | 8 - src/sql/resolver/cmd/ob_show_resolver.cpp | 2 +- src/sql/session/ob_basic_session_info.cpp | 77 +- src/sql/session/ob_basic_session_info.h | 40 +- src/sql/session/ob_sql_session_info.cpp | 93 +- src/sql/session/ob_sql_session_info.h | 11 +- src/sql/session/ob_sql_session_mgr.cpp | 7 +- src/storage/access/ob_block_row_store.cpp | 1 + src/storage/access/ob_multiple_merge.cpp | 1 + src/storage/access/ob_sstable_row_getter.cpp | 7 + .../access/ob_sstable_row_multi_getter.cpp | 7 + src/storage/access/ob_sstable_row_scanner.cpp | 7 + .../compaction/ob_mview_compaction_util.cpp | 1 - .../compaction/ob_partition_merge_iter.cpp | 11 +- .../compaction/ob_partition_merge_iter.h | 3 +- .../compaction/ob_tablet_merge_task.cpp | 2 - src/storage/ddl/ob_ddl_redo_log_writer.cpp | 4 +- .../high_availability/ob_rebuild_service.cpp | 1 + .../ob_storage_ha_diagnose_service.cpp | 1 + .../ob_storage_ha_service.cpp | 1 + .../high_availability/ob_transfer_service.cpp | 1 + src/storage/memtable/ob_lock_wait_mgr.cpp | 2 +- src/storage/ob_bloom_filter_task.cpp | 1 - .../ob_lock_inner_connection_util.cpp | 8 +- .../ob_tenant_snapshot_service.cpp | 1 + .../tmp_file/ob_tmp_file_thread_job.cpp | 2 +- .../tmp_file/ob_tmp_file_thread_wrapper.cpp | 2 +- src/storage/tx/ob_dup_table_util.cpp | 1 + src/storage/tx/ob_gts_source.cpp | 1 + .../tx/ob_standby_timestamp_service.cpp | 2 +- src/storage/tx/ob_trans_define_v4.cpp | 13 + src/storage/tx/ob_trans_define_v4.h | 4 +- src/storage/tx/ob_trans_event.cpp | 148 +- src/storage/tx/ob_trans_service_v4.cpp | 2 +- src/storage/tx/ob_ts_mgr.cpp | 2 +- src/storage/tx/ob_tx_loop_worker.cpp | 4 +- .../tx/ob_xa_inner_table_gc_worker.cpp | 13 +- src/storage/tx/ob_xa_trans_event.cpp | 56 - .../tx/ob_xa_trans_heartbeat_worker.cpp | 2 +- src/storage/tx/wrs/ob_black_list.cpp | 3 + .../ob_tenant_weak_read_cluster_service.cpp | 2 + .../tx/wrs/ob_tenant_weak_read_service.cpp | 2 + src/storage/tx_storage/ob_access_service.cpp | 24 + src/storage/tx_storage/ob_ls_service.cpp | 8 +- .../tx_storage/ob_tablet_gc_service.cpp | 4 +- src/storage/tx_storage/ob_tx_leak_checker.h | 13 +- .../r/mysql/information_schema.result | 81 + .../all_virtual_sys_parameter_stat.result | 5 + .../r/mysql/desc_sys_views_in_mysql.result | 698 ++- .../r/mysql/desc_sys_views_in_sys.result | 872 ++- .../mysql/desc_virtual_table_in_mysql.result | 240 + .../r/mysql/desc_virtual_table_in_sys.result | 240 + .../r/mysql/inner_table_overall.result | 36 + unittest/CMakeLists.txt | 2 +- .../mysql/test_query_response_time.cpp | 71 +- unittest/share/CMakeLists.txt | 1 + unittest/share/test_ash_index.cpp | 77 +- unittest/share/test_latch.cpp | 1 - unittest/share/test_wr.cpp | 65 + .../storage_perf/ob_storage_perf_read.cpp | 5 - unittest/sql/session/test_session_mgr.cpp | 1 - 431 files changed, 35830 insertions(+), 5576 deletions(-) create mode 100644 deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.cpp create mode 100644 deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.h create mode 100644 deps/oblib/src/lib/stat/mock_diagnostic_info.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info.h create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_container.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_container.h create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_guard.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_guard.h create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_summary.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_summary.h create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_util.cpp create mode 100644 deps/oblib/src/lib/stat/ob_diagnostic_info_util.h create mode 100644 deps/oblib/src/lib/wait_event/ob_inner_sql_wait_type.h create mode 100644 deps/oblib/unittest/lib/stat/test_diagnostic_info.cpp create mode 100644 deps/oblib/unittest/lib/unittest_diagnostic_info_util.h create mode 100644 src/observer/net/ob_net_queue_traver.cpp create mode 100644 src/observer/net/ob_net_queue_traver.h create mode 100644 src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.cpp create mode 100644 src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.h create mode 100644 src/observer/virtual_table/ob_all_virtual_sql_stat.cpp create mode 100644 src/observer/virtual_table/ob_all_virtual_sql_stat.h create mode 100644 src/share/ash/ob_ash_refresh_task.cpp create mode 100644 src/share/ash/ob_ash_refresh_task.h create mode 100644 src/share/ash/ob_di_util.cpp create mode 100644 src/share/ash/ob_di_util.h create mode 100644 src/sql/monitor/ob_sql_stat_record.cpp create mode 100644 src/sql/monitor/ob_sql_stat_record.h create mode 100644 unittest/share/test_wr.cpp diff --git a/deps/easy/src/io/easy_baseth_pool.c b/deps/easy/src/io/easy_baseth_pool.c index 5b6d890746..044a369604 100644 --- a/deps/easy/src/io/easy_baseth_pool.c +++ b/deps/easy/src/io/easy_baseth_pool.c @@ -18,6 +18,7 @@ pthread_t ob_pthread_get_pth(void *ptr); void ob_set_thread_name(const char* type); int64_t ob_update_loop_ts(); void ob_usleep(const useconds_t v); +void ob_idle_usleep(const useconds_t v); /** * start */ @@ -242,7 +243,9 @@ static void *easy_baseth_pool_monitor_func(void *args) while(tp->stoped == 0) { ob_update_loop_ts(); - ob_usleep(us); + { + ob_idle_usleep(us); + } ev_tstamp now = ev_time(); easy_thread_pool_for_each(th, tp, 0) { ev_tstamp last = th->lastrun; diff --git a/deps/easy/src/io/ev_epoll.c b/deps/easy/src/io/ev_epoll.c index ca12e52b40..a43ba1048a 100644 --- a/deps/easy/src/io/ev_epoll.c +++ b/deps/easy/src/io/ev_epoll.c @@ -66,7 +66,6 @@ int ob_epoll_wait(int __epfd, struct epoll_event *__events, int __maxevents, int __timeout); - static void epoll_modify (EV_P_ int fd, int oev, int nev) { diff --git a/deps/oblib/src/common/ob_balance_filter.cpp b/deps/oblib/src/common/ob_balance_filter.cpp index 066c9f642a..1380fa8d30 100644 --- a/deps/oblib/src/common/ob_balance_filter.cpp +++ b/deps/oblib/src/common/ob_balance_filter.cpp @@ -144,7 +144,7 @@ void ObBalanceFilter::run1() for (int64_t i = 0; i < bucket_node_num_; i++) { bucket_nodes_[i].cnt = 0; } - ::usleep(REBALANCE_INTERVAL); + ob_usleep(REBALANCE_INTERVAL, true); } } diff --git a/deps/oblib/src/common/ob_clock_generator.cpp b/deps/oblib/src/common/ob_clock_generator.cpp index bd70b4409d..a66c60c142 100644 --- a/deps/oblib/src/common/ob_clock_generator.cpp +++ b/deps/oblib/src/common/ob_clock_generator.cpp @@ -18,6 +18,8 @@ #include "lib/time/ob_time_utility.h" #include "lib/thread/ob_thread_name.h" #include "lib/utility/utility.h" +#include "lib/ash/ob_active_session_guard.h" + using namespace oceanbase::lib; @@ -94,7 +96,7 @@ void ObClockGenerator::run1() lib::set_thread_name("ClockGenerator"); while (!ready_) { - ob_usleep(SLEEP_US); + ob_usleep(SLEEP_US, true/*is_idle_sleep*/); } while (!stopped_) { int64_t retry = 0; @@ -119,7 +121,7 @@ void ObClockGenerator::run1() } else { ATOMIC_STORE(&cur_ts_, cur_ts); } - ob_usleep(SLEEP_US); + ob_usleep(SLEEP_US, true/*is_idle_sleep*/); } } diff --git a/deps/oblib/src/common/ob_clock_generator.h b/deps/oblib/src/common/ob_clock_generator.h index c1d48bbd9c..ce13d00d99 100644 --- a/deps/oblib/src/common/ob_clock_generator.h +++ b/deps/oblib/src/common/ob_clock_generator.h @@ -22,6 +22,7 @@ #include "lib/lock/mutex.h" #include "lib/time/ob_time_utility.h" #include "lib/thread/thread_pool.h" +#include "lib/ash/ob_ash_bkgd_sess_inactive_guard.h" namespace oceanbase { @@ -92,6 +93,7 @@ inline void ObClockGenerator::usleep(const int64_t us) { if (us > 0) { obutil::ObMonitor monitor_; + ObBKGDSessInActiveGuard inactive_guard; (void)monitor_.timed_wait(obutil::ObSysTime(us)); } } diff --git a/deps/oblib/src/lib/CMakeLists.txt b/deps/oblib/src/lib/CMakeLists.txt index 4cf11b8cd3..52b17b3477 100644 --- a/deps/oblib/src/lib/CMakeLists.txt +++ b/deps/oblib/src/lib/CMakeLists.txt @@ -14,6 +14,7 @@ ob_set_subtarget(oblib_lib ALONE geo/ob_geo_func_distance.cpp geo/ob_geo_func_crosses.cpp geo/ob_geo_func_overlaps.cpp + stat/ob_diagnostic_info_util.cpp ) ob_set_subtarget(oblib_lib charset @@ -213,6 +214,10 @@ ob_set_subtarget(oblib_lib common_mixed stat/ob_session_stat.cpp stat/ob_stat_template.cpp statistic_event/ob_stat_event.cpp + stat/ob_diagnostic_info.cpp + stat/ob_diagnostic_info_summary.cpp + stat/ob_diagnostic_info_container.cpp + stat/ob_diagnostic_info_guard.cpp string/ob_hex_utils_base.cpp string/ob_sql_string.cpp string/ob_string.cpp @@ -346,6 +351,7 @@ ob_set_subtarget(oblib_lib utility ob_set_subtarget(oblib_lib ash ash/ob_active_session_guard.cpp + ash/ob_ash_bkgd_sess_inactive_guard.cpp ) ob_set_subtarget(oblib_lib ssl @@ -474,3 +480,8 @@ else() endif() endif() + + +# ATTENTION: add this cpp file as library only if compiled target doesn't need diagnose. like unittest or cdc. +add_library(mock_di stat/mock_diagnostic_info.cpp) +target_include_directories(mock_di PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/deps/oblib/src) diff --git a/deps/oblib/src/lib/alloc/memory_dump.cpp b/deps/oblib/src/lib/alloc/memory_dump.cpp index 89ac988673..70bf6853fd 100644 --- a/deps/oblib/src/lib/alloc/memory_dump.cpp +++ b/deps/oblib/src/lib/alloc/memory_dump.cpp @@ -244,19 +244,6 @@ int ObMemoryDump::check_sql_memory_leak() return ret; } -int ObMemoryDump::load_malloc_sample_map(ObMallocSampleMap &malloc_sample_map) -{ - int ret = OB_SUCCESS; - if (is_inited_) { - ObLatchRGuard guard(iter_lock_, ObLatchIds::MEM_DUMP_ITER_LOCK); - auto &map = r_stat_->malloc_sample_map_; - for (auto it = map.begin(); OB_SUCC(ret) && it != map.end(); ++it) { - ret = malloc_sample_map.set_refactored(it->first, it->second); - } - } - return ret; -} - void ObMemoryDump::print_malloc_sample_info() { int ret = OB_SUCCESS; @@ -324,7 +311,7 @@ void ObMemoryDump::run1() generate_mod_stat_task(); last_dump_ts = current_ts; } else { - ob_usleep(1000); + ob_usleep(1000, true/*is_idle_sleep*/); } } } diff --git a/deps/oblib/src/lib/alloc/memory_dump.h b/deps/oblib/src/lib/alloc/memory_dump.h index bba769bd12..ce5f5be719 100644 --- a/deps/oblib/src/lib/alloc/memory_dump.h +++ b/deps/oblib/src/lib/alloc/memory_dump.h @@ -209,7 +209,20 @@ public: } int generate_mod_stat_task(ObMemoryCheckContext *memory_check_ctx = NULL); int check_sql_memory_leak(); - int load_malloc_sample_map(lib::ObMallocSampleMap& malloc_sample_map); + int load_malloc_sample_map(lib::ObMallocSampleMap &malloc_sample_map) + { + int ret = OB_SUCCESS; + if (is_inited_) { + ObLatchRGuard guard(iter_lock_, ObLatchIds::MEM_DUMP_ITER_LOCK); + lib::ObMallocSampleMap &map = r_stat_->malloc_sample_map_; + for (lib::ObMallocSampleMap::iterator it = map.begin(); OB_SUCC(ret) && it != map.end(); + ++it) { + ret = malloc_sample_map.set_refactored(it->first, it->second); + } + } + return ret; + } + private: void run1() override; void handle(void *task); diff --git a/deps/oblib/src/lib/ash/ob_active_session_guard.cpp b/deps/oblib/src/lib/ash/ob_active_session_guard.cpp index 8564d8249f..389c123926 100644 --- a/deps/oblib/src/lib/ash/ob_active_session_guard.cpp +++ b/deps/oblib/src/lib/ash/ob_active_session_guard.cpp @@ -10,37 +10,330 @@ * See the Mulan PubL v2 for more details. */ +#define USING_LOG_PREFIX SHARE + #include "lib/ash/ob_active_session_guard.h" +#include "lib/stat/ob_diagnose_info.h" +#include "lib/stat/ob_session_stat.h" +#include "rpc/obrpc/ob_rpc_packet.h" +#include "lib/stat/ob_diagnostic_info_guard.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "sql/session/ob_sql_session_info.h" +#include "lib/time/ob_tsc_timestamp.h" +#include "lib/stat/ob_diagnostic_info_util.h" using namespace oceanbase::common; -ActiveSessionStat ObActiveSessionGuard::dummy_stat_; -thread_local ActiveSessionStat ObActiveSessionGuard::thread_local_stat_; +// a sample would be taken place up to 20ms after ash iteration begins. +// if sample time is above this threshold, mean ash execution too slow +constexpr int64_t ash_iteration_time = 40000; // 40ms -ActiveSessionStat *&ObActiveSessionGuard::get_stat_ptr() +extern uint64_t lib_get_cpu_khz(); + +void ObActiveSessionStat::fixup_last_stat(ObWaitEventDesc &desc) { - // before ObActiveSessionGuard constructed, - // ensure it can get the dummy value if anyone call get_stat - RLOCAL_INIT(ActiveSessionStat *, stat, &dummy_stat_); - return stat; + if (fixup_index_ != -1) { + if (OB_LIKELY(fixup_ash_buffer_.is_valid())) { + fixup_ash_buffer_->fixup_stat(fixup_index_, desc); + fixup_ash_buffer_.reset(); + fixup_index_ = -1; + } else { + LOG_WARN_RET(OB_ERR_UNEXPECTED, "fixup index with no fixup buffer.", K_(fixup_index), KPC(this)); + } + } } -ActiveSessionStat &ObActiveSessionGuard::get_stat() +// con only be called from ash sample thread(mutex protected). +void ObActiveSessionStat::set_fixup_buffer(common::ObSharedGuard &ash_buffer) { - return *get_stat_ptr(); + // fixup buffer can only hold one ash buffer. Cannot switch it. + // Otherwise core would happened when set_fixup_buffer coincide with session's reset fixup buffer. + if (OB_LIKELY(!fixup_ash_buffer_.is_valid())) { + fixup_ash_buffer_ = ash_buffer; + } } -void ObActiveSessionGuard::setup_default_ash() +void ObActiveSessionStat::set_sess_active() { - get_stat_ptr() = &dummy_stat_; + if (!is_active_session_) { + is_active_session_ = true; + accumulate_tm_idle_time(); + if (trace_id_.is_invalid()) { + trace_id_ = *common::ObCurTraceId::get_trace_id(); + } + } } -void ObActiveSessionGuard::setup_ash(ActiveSessionStat &stat) +void ObActiveSessionStat::set_sess_inactive() { - get_stat_ptr() = &stat; + last_inactive_ts_ = rdtsc(); + is_active_session_ = false; } -void ObActiveSessionGuard::setup_thread_local_ash() +void ObActiveSessionStat::accumulate_tm_idle_time() { - get_stat_ptr() = &thread_local_stat_; + if (last_inactive_ts_ > 0) { + // When set_sess_inactive() is called, there is some time left after last_ts_. So we mark it as + // extra time to calculat in next round of calc_db_time when session is active again. + const int64_t cur = rdtsc(); + tm_idle_time_ += (cur - last_inactive_ts_) * 1000 / lib_get_cpu_khz(); + } +} + +void ObActiveSessionStat::calc_db_time( + ObDiagnosticInfo *di, const int64_t sample_time, const int64_t tsc_sample_time) +{ + if (oceanbase::lib::is_diagnose_info_enabled()) { + ObActiveSessionStat &stat = di->get_ash_stat(); + const int64_t delta_time = (tsc_sample_time - stat.last_touch_ts_) * 1000 / lib_get_cpu_khz(); + if (OB_UNLIKELY(delta_time <= 0)) { + // ash sample happened before set_session_active + if (delta_time < -ash_iteration_time) { + LOG_INFO("ash sample happened before set_session_active.", K(delta_time), K(sample_time), K_(stat.last_touch_ts)); + } + stat.delta_time_ = 0; + stat.delta_cpu_time_ = 0; + stat.delta_db_time_ = 0; + } else { + const uint64_t cur_wait_begin_ts = stat.wait_event_begin_ts_; + const int64_t cur_event_no = stat.retry_wait_event_no_ > 0 ? stat.retry_wait_event_no_ : stat.event_no_; + if (OB_UNLIKELY(cur_wait_begin_ts != 0 && cur_event_no != 0)) { + // has unfinished wait event + stat.wait_event_begin_ts_ = tsc_sample_time; + const uint64_t cur_wait_time = + (tsc_sample_time - cur_wait_begin_ts) * 1000 / lib_get_cpu_khz(); + if (OB_WAIT_EVENTS[cur_event_no].wait_class_ != ObWaitClassIds::IDLE) { + stat.total_non_idle_wait_time_ += cur_wait_time; + } else { + stat.total_idle_wait_time_ += cur_wait_time; + } + } + const int64_t delta_non_idle_wait_time = stat.total_non_idle_wait_time_ - stat.prev_non_idle_wait_time_; + const int64_t delta_idle_wait_time = stat.total_idle_wait_time_ - stat.prev_idle_wait_time_; + if (OB_UNLIKELY(delta_time < delta_non_idle_wait_time + delta_idle_wait_time)) { + /** + * Because we take sample_time_ in the begining of ash sample iteration. + * So each session's sample actually taken place after sample_time_. Resulting in wait_time > + * delta time. Therefore a negative delta db time would happened. + * Which is fine. the negative db time got fixed up in the next round of calc_db_time + */ + stat.delta_time_ = 0; + stat.delta_db_time_ = 0; + stat.delta_cpu_time_ = 0; + } else { + stat.prev_non_idle_wait_time_ = stat.total_non_idle_wait_time_; + stat.prev_idle_wait_time_ = stat.total_idle_wait_time_; + stat.delta_time_ = delta_time; + stat.delta_db_time_ = delta_time - stat.tm_idle_time_ - delta_idle_wait_time; + stat.delta_cpu_time_ = stat.delta_db_time_ - delta_non_idle_wait_time; + if (stat.delta_db_time_ < 0 || stat.delta_cpu_time_ < 0) { + //When delta_db_time < 0 or delta_cpu_time < 0, + //it indicates that the sampled db_time is invalid. + //A possible reason for this is that the ASH sampling encountered some concurrency issues. + //Therefore, the sampled delta time will be discarded and not recorded. + stat.delta_time_ = 0; + stat.delta_db_time_ = 0; + stat.delta_cpu_time_ = 0; + } + // no need to lock, only this function modifies time model related stats. + if (stat.session_type_ == ObActiveSessionStatItem::SessionType::BACKGROUND) { + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_BKGD_TIME, delta_time); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_BKGD_CPU, stat.delta_cpu_time_); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_BKGD_DB_TIME, stat.delta_db_time_); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_BKGD_NON_IDLE_WAIT_TIME, delta_non_idle_wait_time); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_BKGD_IDLE_WAIT_TIME, delta_idle_wait_time); + } else { + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_DB_TIME, stat.delta_db_time_); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_DB_CPU, stat.delta_cpu_time_); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_NON_IDLE_WAIT_TIME, delta_non_idle_wait_time); + di->add_stat(ObStatEventIds::SYS_TIME_MODEL_IDLE_WAIT_TIME, delta_idle_wait_time); + } + } + } + stat.tm_idle_time_ = 0; + stat.last_touch_ts_ = tsc_sample_time; + } +} +void ObActiveSessionStat::calc_retry_wait_event(ObActiveSessionStat &stat, const int64_t sample_time) +{ + int ret = OB_SUCCESS; + int64_t retry_wait_event_no = stat.retry_wait_event_no_; + if (retry_wait_event_no > 0 && stat.need_calc_wait_event_end_) { + LOG_DEBUG("[retry wait event] end query retry wait event", K(ret), K(stat.session_id_), + K(sample_time), K(stat.curr_query_start_time_), K(stat.last_query_exec_use_time_us_)); + if (stat.curr_query_start_time_ > 0 && + sample_time - stat.curr_query_start_time_ > stat.last_query_exec_use_time_us_) { + // end query retry wait event + stat.end_retry_wait_event(); + if (retry_wait_event_no == ObWaitEventIds::ROW_LOCK_WAIT && stat.need_calc_wait_event_end_) { + stat.block_sessid_ = 0; + } + } else { + LOG_DEBUG("[retry wait event] end query retry wait event", K(ret), K(stat.session_id_), + K(sample_time), K(stat.curr_das_task_start_time_), K(stat.last_das_task_exec_use_time_us_)); + if (stat.curr_das_task_start_time_ > 0 && + sample_time - stat.curr_das_task_start_time_ > stat.last_das_task_exec_use_time_us_) { + // end das retry wait event + stat.end_retry_wait_event(); + } + } + } +} + +void ObActiveSessionStat::begin_retry_wait_event(const int64_t retry_wait_event_no, + const int64_t retry_wait_event_p1, + const int64_t retry_wait_event_p2, + const int64_t retry_wait_event_p3) +{ +#ifdef ENABLE_DEBUG_LOG + if (retry_wait_event_no_ == ObWaitEventIds::ROW_LOCK_WAIT) { + LOG_WARN_RET(OB_ERR_UNEXPECTED, "ASH's retry_wait_event concurrency may occur ", K(retry_wait_event_no_), K(retry_wait_event_no), K(retry_wait_event_p1)); + } +#endif + retry_wait_event_no_ = retry_wait_event_no; + retry_wait_event_p1_ = retry_wait_event_p1; + retry_wait_event_p2_ = retry_wait_event_p2; + retry_wait_event_p3_ = retry_wait_event_p3; +} + +void ObActiveSessionStat::end_retry_wait_event() +{ + retry_wait_event_no_ = 0; + retry_wait_event_p1_ = 0; + retry_wait_event_p2_ = 0; + retry_wait_event_p3_ = 0; + retry_plan_line_id_ = -1; + need_calc_wait_event_end_ = false; +} + +void ObActiveSessionStat::begin_row_lock_wait_event() +{ + if (retry_wait_event_no_ == ObWaitEventIds::ROW_LOCK_WAIT) { + need_calc_wait_event_end_ = false; + // After entering the wait lock queue, query may wait for a long time. + // ASH will no longer calculate the end of the ROW_LOCK waiting event in this case. + } else { + LOG_WARN_RET(OB_ERR_UNEXPECTED, "invalid retry wait event no", K(ret), K(retry_wait_event_no_)); + } +} + +void ObActiveSessionStat::end_row_lock_wait_event() +{ + if (retry_wait_event_no_ == ObWaitEventIds::ROW_LOCK_WAIT) { + end_retry_wait_event(); + block_sessid_ = 0; + } else { + block_sessid_ = 0; + LOG_WARN_RET(OB_ERR_UNEXPECTED, "error wait event no", K(ret), K(retry_wait_event_no_)); + } +} + +void ObActiveSessionGuard::set_sess_active() +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().set_sess_active(); + } +} + +void ObActiveSessionGuard::set_sess_inactive() +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().set_sess_inactive(); + } +} + +const ObActiveSessionStatItem &ObAshBuffer::get(int64_t pos) const +{ + return buffer_[pos]; +} +int64_t ObAshBuffer::copy_from_ash_buffer(const ObActiveSessionStatItem &stat) +{ + int64_t idx = (write_pos_++ + buffer_.size()) % buffer_.size(); + MEMCPY(&buffer_[idx], &stat, sizeof(ObActiveSessionStatItem)); + buffer_[idx].id_ = write_pos_; + if (0 == write_pos_ % WR_ASH_SAMPLE_INTERVAL) { + buffer_[idx].is_wr_sample_ = true; + } + return idx; +} + +int64_t ObAshBuffer::append(const ObActiveSessionStat &stat) +{ + // TODO: optimize performance, eliminate '%' + OB_ASSERT(stat.wait_time_ == 0); + int64_t idx = (write_pos_++ + buffer_.size()) % buffer_.size(); + MEMCPY(&buffer_[idx], &stat, sizeof(ObActiveSessionStatItem)); + buffer_[idx].id_ = write_pos_; + if (0 == write_pos_ % WR_ASH_SAMPLE_INTERVAL) { + buffer_[idx].is_wr_sample_ = true; + } + if (stat.retry_wait_event_no_ > 0) { + // We think retry wait event is more import than normal wait event + buffer_[idx].event_no_ = stat.retry_wait_event_no_; + buffer_[idx].p1_ = stat.retry_wait_event_p1_; + buffer_[idx].p2_ = stat.retry_wait_event_p2_; + buffer_[idx].p3_ = stat.retry_wait_event_p3_; + buffer_[idx].plan_line_id_ = stat.retry_plan_line_id_; + } + return idx; +} + +void ObAshBuffer::fixup_stat(int64_t index, const ObWaitEventDesc &desc) +{ + if (OB_UNLIKELY(index < 0 || index >= write_pos_)) { + // index invalid for fixup, do noting. + } else { + ObActiveSessionStatItem &stat = buffer_[(index + buffer_.size()) % buffer_.size()]; + if (OB_UNLIKELY(stat.wait_time_ != 0 || stat.event_no_ != desc.event_no_)) { + // wait event invalid for fix up, do noting. + } else { + stat.wait_time_ = desc.wait_time_; + stat.p1_ = desc.p1_; + stat.p2_ = desc.p2_; + stat.p3_ = desc.p3_; +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) + const char *bt = lbt(); + int64_t size = std::min(sizeof(stat.bt_) - 1, STRLEN(bt)); + MEMCPY(stat.bt_, bt, size); + stat.bt_[size] = '\0'; +#endif + } + } +} + +void ObAshBuffer::set_read_pos(int64_t pos) +{ + if (OB_UNLIKELY(pos >= write_pos_ || pos < 0)) { + // index invalid for read_pos, do nothing. + } else { + read_pos_ = pos; + } +} + +ObBackgroundSessionIdGenerator &ObBackgroundSessionIdGenerator::get_instance() { + static ObBackgroundSessionIdGenerator the_one; + return the_one; +} +// |<---------------------------------64bit---------------------------->| +// 0b 32b 64b +// +---------------------------+----------------------------------------+ +// | Local Seq | Zero | +// +---------------------------+----------------------------------------+ +// +//Local Seq: 一个server可用连接数,目前单台server最多有INT32_MAX个连接; +//Zero : 置零,保留字段,用于和sql_session做区分 +uint64_t ObBackgroundSessionIdGenerator::get_next_sess_id() { + uint64_t sessid = 0; + const uint64_t local_seq = static_cast(ATOMIC_AAF(&local_seq_, 1)); + sessid |= (local_seq << 32); + LOG_DEBUG("succ to generate background session id", K(local_seq), K(sessid)); + + return sessid; +} + +bool ObBackgroundSessionIdGenerator::is_background_session_id(uint64_t session_id) +{ + return session_id & 0xFFFFF; } diff --git a/deps/oblib/src/lib/ash/ob_active_session_guard.h b/deps/oblib/src/lib/ash/ob_active_session_guard.h index 784c3dda1b..a3ac8af4e1 100644 --- a/deps/oblib/src/lib/ash/ob_active_session_guard.h +++ b/deps/oblib/src/lib/ash/ob_active_session_guard.h @@ -13,20 +13,47 @@ #ifndef _OB_SHARE_ASH_ACTIVE_SESSION_GUARD_H_ #define _OB_SHARE_ASH_ACTIVE_SESSION_GUARD_H_ -#include "lib/lock/ob_spin_lock.h" -#include "lib/list/ob_dlink_node.h" -#include "lib/utility/ob_print_utils.h" -#include "lib/wait_event/ob_wait_event.h" #include "lib/profile/ob_trace_id.h" +#include "lib/wait_event/ob_inner_sql_wait_type.h" +#include "lib/guard/ob_shared_guard.h" // ObShareGuard +#include "lib/ash/ob_ash_bkgd_sess_inactive_guard.h" +#include "lib/container/ob_array.h" + +#define ASH_PROGRAM_STR_LEN 64 +#define ASH_MODULE_STR_LEN 32 +#define ASH_CLIENT_ID_STR_LEN 32 +#define ASH_ACTION_STR_LEN 32 +#define ASH_BACKTRACE_STR_LEN 256 +#define WR_ASH_SAMPLE_INTERVAL 10 + namespace oceanbase { +namespace sql +{ +class ObQueryRetryASHDiagInfo; +} + +namespace observer +{ +class ObVirtualASH; +} + namespace common { +class ObDiagnoseSessionInfo; +class ObDiagnoseTenantInfo; +class ObAshBuffer; +struct ObActiveSessionStat; +class ObDiagnosticInfo; +class ObRetryWaitEventInfoGuard; -struct ActiveSessionStat +// historical ob active session stat for ash. +struct ObActiveSessionStatItem { public: - ActiveSessionStat() + friend struct ObActiveSessionStat; + friend class observer::ObVirtualASH; + ObActiveSessionStatItem() : id_(0), tenant_id_(0), user_id_(0), @@ -38,51 +65,46 @@ public: p1_(0), p2_(0), p3_(0), + plsql_entry_object_id_(OB_INVALID_ID), + plsql_entry_subprogram_id_(OB_INVALID_ID), + plsql_object_id_(OB_INVALID_ID), + plsql_subprogram_id_(OB_INVALID_ID), time_model_(0), trace_id_(), plan_line_id_(-1), - session_type_(false), + session_type_(BACKGROUND), is_wr_sample_(false), - last_stat_(nullptr) + delta_time_(0), + delta_cpu_time_(0), + delta_db_time_(0), + group_id_(0), + tid_(0), + plan_hash_(0), + tx_id_(0), + stmt_type_(0), + tablet_id_(0), + block_sessid_(0), + proxy_sid_(0) { sql_id_[0] = '\0'; -#ifndef NDEBUG + top_level_sql_id_[0] = '\0'; + plsql_entry_subprogram_name_[0] = '\0'; + plsql_subprogram_name_[0] = '\0'; +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) bt_[0] = '\0'; #endif + program_[0] = '\0'; + module_[0] = '\0'; + action_[0] = '\0'; + client_id_[0] = '\0'; } - ~ActiveSessionStat() = default; - void fixup_last_stat(ObWaitEventDesc &desc) + ~ObActiveSessionStatItem() = default; +public: + enum SessionType : bool { - ActiveSessionStat *stat = last_stat_; - if (stat) { - stat->wait_time_ = desc.wait_time_; - stat->p1_ = desc.p1_; - stat->p2_ = desc.p2_; - stat->p3_ = desc.p3_; -#ifndef NDEBUG - const char *bt = lbt(); - int64_t size = std::min(sizeof(stat->bt_) - 1, STRLEN(bt)); - MEMCPY(stat->bt_, bt, size); - stat->bt_[size] = '\0'; -#endif - last_stat_ = nullptr; - } - } - void set_last_stat(ActiveSessionStat *stat) - { - last_stat_ = stat; - } - void reuse() - { - user_id_ = 0; - session_id_ = 0; - plan_id_ = 0; - sql_id_[0] = '\0'; - time_model_ = 0; -#ifndef NDEBUG - bt_[0] = '\0'; -#endif - } + FOREGROUND = 0, + BACKGROUND = 1 + }; public: uint64_t id_; uint64_t tenant_id_; @@ -95,25 +117,28 @@ public: uint64_t p1_; // event parameter 1 uint64_t p2_; // event parameter 2 uint64_t p3_; // event parameter 3 - + int64_t plsql_entry_object_id_; // top pl object id + int64_t plsql_entry_subprogram_id_; // top pl subprogram id + int64_t plsql_object_id_; // current object id + int64_t plsql_subprogram_id_; // current subprogram id union { - uint64_t time_model_; // phase of execution bitmap - struct { - // NEED placehold - uint64_t in_parse_ : 1; - uint64_t in_pl_parse_ : 1; + uint64_t time_model_; // phase of execution bitmap + struct + { + uint64_t in_parse_ : 1; + uint64_t in_pl_parse_ : 1; uint64_t in_get_plan_cache_ : 1; - uint64_t in_sql_optimize_ : 1; - uint64_t in_sql_execution_ : 1; - uint64_t in_px_execution_ : 1; - uint64_t in_sequence_load_ : 1; - uint64_t in_committing_ : 1; - uint64_t in_storage_read_ : 1; - uint64_t in_storage_write_ : 1; - uint64_t in_das_remote_exec_: 1; - uint64_t in_plsql_compilation_ : 1; - uint64_t in_plsql_execution_ : 1; - uint64_t in_filter_rows_: 1; + uint64_t in_sql_optimize_ : 1; + uint64_t in_sql_execution_ : 1; + uint64_t in_px_execution_ : 1; + uint64_t in_sequence_load_ : 1; + uint64_t in_committing_ : 1; + uint64_t in_storage_read_ : 1; + uint64_t in_storage_write_ : 1; + uint64_t in_das_remote_exec_ : 1; + uint64_t in_plsql_compilation_ : 1; + uint64_t in_plsql_execution_ : 1; + uint64_t in_filter_rows_ : 1; uint64_t in_rpc_encode_ : 1; uint64_t in_rpc_decode_ : 1; uint64_t in_connection_mgr_ : 1; @@ -121,20 +146,226 @@ public: }; }; +public: common::ObCurTraceId::TraceId trace_id_; - int32_t plan_line_id_; // which SQL operator the session is processing when sampling + int32_t plan_line_id_; // which SQL operater the session is processing when sampling char sql_id_[common::OB_MAX_SQL_ID_LENGTH + 1]; - bool session_type_; // false=0, FOREGROUND, true=1, BACKGROUND + char top_level_sql_id_[common::OB_MAX_SQL_ID_LENGTH + 1]; + char plsql_entry_subprogram_name_[common::OB_MAX_ASH_PL_NAME_LENGTH + 1]; + char plsql_subprogram_name_[common::OB_MAX_ASH_PL_NAME_LENGTH + 1]; + SessionType session_type_; // false=0, FOREGROUND, true=1, BACKGROUND bool is_wr_sample_; // true represents this node should be sampled into wr. -#ifndef NDEBUG - char bt_[256]; + int64_t delta_time_; + int64_t delta_cpu_time_; + int64_t delta_db_time_; + int32_t group_id_; + int64_t tid_; // record current tid for cpu time verification + int64_t plan_hash_; + int64_t tx_id_; + int64_t stmt_type_; + int64_t tablet_id_; + int64_t block_sessid_; + uint64_t proxy_sid_; //proxy session id + char program_[ASH_PROGRAM_STR_LEN]; + char module_[ASH_MODULE_STR_LEN]; + char action_[ASH_ACTION_STR_LEN]; + char client_id_[ASH_CLIENT_ID_STR_LEN]; +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) + char bt_[ASH_BACKTRACE_STR_LEN]; #endif - TO_STRING_KV("sess_id", session_id_, "id", OB_WAIT_EVENTS[event_no_].event_id_, "event", OB_WAIT_EVENTS[event_no_].event_name_, K_(wait_time)); + TO_STRING_KV(K_(tenant_id), K_(session_id), "event id", OB_WAIT_EVENTS[event_no_].event_id_, + "event", OB_WAIT_EVENTS[event_no_].event_name_, K_(wait_time), K_(time_model), K_(trace_id), + K_(plan_line_id), K_(sql_id), K_(top_level_sql_id), K_(plsql_entry_subprogram_name), + K_(plsql_subprogram_name), K_(session_type), K_(is_wr_sample), K_(delta_time), + K_(delta_cpu_time), K_(delta_db_time), K_(program), K_(module), K_(action), K_(client_id), +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) + K_(bt), +#endif + K_(group_id), K_(tid), K_(plan_hash), K_(tx_id), K_(stmt_type), K_(tablet_id), K_(block_sessid)); +}; + +// record run-time stat for each OB session +struct ObActiveSessionStat : public ObActiveSessionStatItem +{ + friend class ObRetryWaitEventInfoGuard; +public: + ObActiveSessionStat() + : ObActiveSessionStatItem(), + last_touch_ts_(0), + last_inactive_ts_(0), + wait_event_begin_ts_(0), + total_idle_wait_time_(0), + total_non_idle_wait_time_(0), + prev_idle_wait_time_(0), + prev_non_idle_wait_time_(0), + total_cpu_time_(0), + is_active_session_(false), + inner_sql_wait_type_id_(ObInnerSqlWaitTypeId::NULL_INNER_SQL), + pcode_(0), + tm_idle_time_(0), + retry_wait_event_no_(0), + retry_wait_event_p1_(0), + retry_wait_event_p2_(0), + retry_wait_event_p3_(0), + retry_plan_line_id_(-1), + need_calc_wait_event_end_(false), + last_query_exec_use_time_us_(0), + curr_query_start_time_(0), + last_das_task_exec_use_time_us_(0), + curr_das_task_start_time_(0), + fixup_index_(-1), + fixup_ash_buffer_(), + query_retry_ash_diag_info_ptr_(nullptr) + {} + ~ObActiveSessionStat() = default; + void fixup_last_stat(ObWaitEventDesc &desc); + void set_fixup_buffer(common::ObSharedGuard &ash_buffer); + void set_fixup_index(int64_t index) + { + fixup_index_ = index; + } + + void set_event(int64_t event_no, uint64_t p1, uint64_t p2, uint64_t p3) + { + event_no_ = event_no; + p1_ = p1; + p2_ = p2; + p3_ = p3; +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) + const char *bt = lbt(); + int64_t size = std::min(sizeof(bt_) - 1, STRLEN(bt)); + MEMCPY(bt_, bt, size); + bt_[size] = '\0'; +#endif + } + void reset_event() + { + event_no_ = 0; + p1_ = 0; + p2_ = 0; + p3_ = 0; + wait_event_begin_ts_ = 0; +#if !defined(NDEBUG) || defined(ENABLE_DEBUG_LOG) + MEMSET(bt_, 0, sizeof(bt_)); +#endif + } + void set_sess_active(); + void set_sess_inactive(); + void accumulate_tm_idle_time(); + static void calc_db_time( + ObDiagnosticInfo *di, const int64_t sample_time, const int64_t tsc_sample_time); + // timestamp for last ash sample taken place. could be optimized to rdtsc() + // FIXME:but should check rdtsc_is_supported on bootstrap. + void set_ash_waiting(const int64_t event_no, + const int64_t p1 = 0 , + const int64_t p2 = 0, + const int64_t p3 = 0); + void finish_ash_waiting(); + inline sql::ObQueryRetryASHDiagInfo* get_retry_ash_diag_info_ptr() { return query_retry_ash_diag_info_ptr_; } + void begin_retry_wait_event(const int64_t retry_wait_event_no, + const int64_t retry_wait_event_p1, + const int64_t retry_wait_event_p2, + const int64_t retry_wait_event_p3); + void end_retry_wait_event(); + + void begin_row_lock_wait_event(); + void end_row_lock_wait_event(); + static void calc_retry_wait_event(ObActiveSessionStat &stat, const int64_t sample_time); + inline void record_cur_query_start_ts(bool is_in_retry) + { + curr_query_start_time_ = common::ObTimeUtility::current_time(); + need_calc_wait_event_end_ = is_in_retry; + } + inline void record_last_query_exec_use_time_us() + { + last_query_exec_use_time_us_ = common::ObTimeUtility::current_time() - curr_query_start_time_; + need_calc_wait_event_end_ = false; + } + inline bool can_start_das_retry() const { + return retry_wait_event_no_ > 0; + } + inline void record_cur_das_test_start_ts(const int64_t last_das_task_exec_use_time_us, bool is_in_retry) { + curr_das_task_start_time_ = common::ObTimeUtility::current_time(); + last_das_task_exec_use_time_us_ = last_das_task_exec_use_time_us; + need_calc_wait_event_end_ = is_in_retry; + } + inline void stop_das_retry_wait_event() { + end_retry_wait_event(); + } + inline bool is_in_row_lock_wait() { + return retry_wait_event_no_ == ObWaitEventIds::ROW_LOCK_WAIT; + } + private: - // `last_stat_` is for wait time fix-up. + inline void set_retry_ash_diag_info_ptr(sql::ObQueryRetryASHDiagInfo* query_retry_ash_diag_info_ptr) { + query_retry_ash_diag_info_ptr_ = query_retry_ash_diag_info_ptr; + } +public: + int64_t last_touch_ts_; CACHE_ALIGNED // the timestamp of the last sampling or creation + int64_t last_inactive_ts_ CACHE_ALIGNED; //the timestamp when the session was last in an inactive state + int64_t wait_event_begin_ts_; + uint64_t total_idle_wait_time_; // idle wait time in total + uint64_t total_non_idle_wait_time_; // total non-idle wait time in total + uint64_t prev_idle_wait_time_; + uint64_t prev_non_idle_wait_time_; + uint64_t total_cpu_time_; // total cpu time since last ash sample. for cpu-time verification. + bool is_active_session_ CACHE_ALIGNED; + ObInnerSqlWaitTypeId inner_sql_wait_type_id_; + int pcode_ CACHE_ALIGNED; + int64_t tm_idle_time_; // the idle time between two sampling intervals. + int64_t retry_wait_event_no_; + int64_t retry_wait_event_p1_; + int64_t retry_wait_event_p2_; + int64_t retry_wait_event_p3_; + int64_t retry_plan_line_id_; + bool need_calc_wait_event_end_; + int64_t last_query_exec_use_time_us_; + int64_t curr_query_start_time_; //only used to calc retry wait event time + int64_t last_das_task_exec_use_time_us_; + int64_t curr_das_task_start_time_; + + INHERIT_TO_STRING_KV("ObActiveSessionStatItem", ObActiveSessionStatItem, K_(last_touch_ts), + K_(wait_event_begin_ts), K_(total_idle_wait_time), K_(total_non_idle_wait_time), + K_(prev_idle_wait_time), K_(prev_non_idle_wait_time), K_(total_cpu_time), + K_(is_active_session), K_(inner_sql_wait_type_id), K_(pcode), K_(tm_idle_time), + K_(fixup_index), K_(fixup_ash_buffer), K_(retry_wait_event_no), K_(retry_plan_line_id)); + +private: + + // for wait time fix-up. // Fixes-up values unknown at sampling time // So we collect the wait time after the event finish - ActiveSessionStat *last_stat_; + int64_t fixup_index_; + common::ObSharedGuard fixup_ash_buffer_; + sql::ObQueryRetryASHDiagInfo* query_retry_ash_diag_info_ptr_; +}; + +class ObAshBuffer +{ +public: + ObAshBuffer() : write_pos_(0), read_pos_(0), buffer_() {} + ~ObAshBuffer() + { + OB_LOG(INFO, "successfully released one ash buffer", K(buffer_.count()), "size", buffer_.count() * sizeof(sizeof(ObActiveSessionStatItem)), K(this)); + } + const ObActiveSessionStatItem &get(int64_t pos) const; + int64_t copy_from_ash_buffer(const ObActiveSessionStatItem &stat); + int64_t append(const ObActiveSessionStat &stat); + void fixup_stat(int64_t index, const ObWaitEventDesc &desc); + int64_t write_pos() const { return write_pos_; } + int64_t read_pos() const { return read_pos_; } + int64_t size() const { return buffer_.size(); } + int64_t free_slots_num() const { return buffer_.size() - min(buffer_.size(), write_pos_ - read_pos_); } + inline void set_label(const lib::ObLabel &label) { return buffer_.set_label(label); } + inline void set_tenant_id(const uint64_t &tenant_id) { return buffer_.set_tenant_id(tenant_id); } + void set_read_pos(int64_t pos); + int prepare_allocate(int64_t capacity) { return buffer_.prepare_allocate(capacity); } + TO_STRING_KV(K_(write_pos), K(buffer_.count())); +private: + int64_t write_pos_; // current write index for ash stat item. Not written yet. + // When copy one ash buffer to another, read_pos_ will not be copied. + int64_t read_pos_; // current read index for wr snapshot. Not read yet. + common::ObArray buffer_; }; class ObActiveSessionGuard @@ -142,52 +373,35 @@ class ObActiveSessionGuard public: ObActiveSessionGuard() = default; ~ObActiveSessionGuard() = default; - // When Worker execution done, reset the thread local ash_stat_ to dummy_stat_ - // so that we can ensure the session stat will not be accessed after this thread switch - // to any other task - static void setup_default_ash(); - // set ash_stat in session to the thread local ash_stat_ - static void setup_ash(ActiveSessionStat &stat); - static ActiveSessionStat &get_stat(); - static void setup_thread_local_ash(); - static thread_local ActiveSessionStat thread_local_stat_; + // reset ashstat to another thread local variable durning session active period. + static ObActiveSessionStat *get_stat() __attribute__ ((deprecated)); + static void set_sess_active(); + static void set_sess_inactive(); private: - static ActiveSessionStat dummy_stat_; - static ActiveSessionStat *&get_stat_ptr(); + static ObActiveSessionStat *&get_stat_ptr(); DISALLOW_COPY_AND_ASSIGN(ObActiveSessionGuard); }; +class ObBackgroundSessionIdGenerator { +public: + ObBackgroundSessionIdGenerator() : local_seq_(1) {} + ~ObBackgroundSessionIdGenerator() = default; -#define DEF_ASH_FLAGS_SETTER_GUARD(ash_flag_type) \ - class ObActiveSession_##ash_flag_type##_FlagSetterGuard \ - { \ - public: \ - ObActiveSession_##ash_flag_type##_FlagSetterGuard() { \ - ObActiveSessionGuard::get_stat().ash_flag_type##_ = true; \ - } \ - ~ObActiveSession_##ash_flag_type##_FlagSetterGuard() { \ - ObActiveSessionGuard::get_stat().ash_flag_type##_ = false; \ - } \ - private: \ - DISALLOW_COPY_AND_ASSIGN(ObActiveSession_##ash_flag_type##_FlagSetterGuard); \ - }; - -DEF_ASH_FLAGS_SETTER_GUARD(in_parse) -DEF_ASH_FLAGS_SETTER_GUARD(in_pl_parse) -DEF_ASH_FLAGS_SETTER_GUARD(in_get_plan_cache) -DEF_ASH_FLAGS_SETTER_GUARD(in_sql_optimize) -DEF_ASH_FLAGS_SETTER_GUARD(in_sql_execution) -DEF_ASH_FLAGS_SETTER_GUARD(in_px_execution) -DEF_ASH_FLAGS_SETTER_GUARD(in_sequence_load) -DEF_ASH_FLAGS_SETTER_GUARD(in_committing) -DEF_ASH_FLAGS_SETTER_GUARD(in_storage_read) -DEF_ASH_FLAGS_SETTER_GUARD(in_storage_write) - -#undef DEF_ASH_FLAGS_SETTER_GUARD - -#define ACTIVE_SESSION_FLAG_SETTER_GUARD(ash_flag_type) \ - ObActiveSession_##ash_flag_type##_FlagSetterGuard _ash_flag_setter_guard; + static ObBackgroundSessionIdGenerator &get_instance(); + static bool is_background_session_id(uint64_t session_id); + uint64_t get_next_sess_id(); +private: + ObBackgroundSessionIdGenerator *generator_; + volatile uint64_t local_seq_; +}; +#define ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(filed, value) \ + do { \ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); \ + if (OB_NOT_NULL(di) && OB_NOT_NULL(di->get_ash_stat().get_retry_ash_diag_info_ptr())) { \ + di->get_ash_stat().get_retry_ash_diag_info_ptr()->filed = value; \ + } \ + } while (0) } } #endif /* _OB_SHARE_ASH_ACTIVE_SESSION_GUARD_H_ */ diff --git a/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.cpp b/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.cpp new file mode 100644 index 0000000000..a4c55bad4e --- /dev/null +++ b/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.cpp @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE + +#include "lib/ash/ob_ash_bkgd_sess_inactive_guard.h" +#include "lib/ash/ob_active_session_guard.h" +#include "lib/stat/ob_diagnostic_info_guard.h" + +using namespace oceanbase::common; + +ObBKGDSessInActiveGuard::ObBKGDSessInActiveGuard() +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + need_record_ = true; + prev_stat_ = di->get_ash_stat().is_active_session_; + di->get_ash_stat().set_sess_inactive(); + } else { + need_record_ = false; + } +} +ObBKGDSessInActiveGuard::~ObBKGDSessInActiveGuard() +{ + if (need_record_) { + GET_DIAGNOSTIC_INFO->get_ash_stat().is_active_session_ = prev_stat_; + } +} diff --git a/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.h b/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.h new file mode 100644 index 0000000000..2c76ac1eaf --- /dev/null +++ b/deps/oblib/src/lib/ash/ob_ash_bkgd_sess_inactive_guard.h @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef _OB_SHARE_ASH_BKGD_SESS_INACTIVE_GUARD_H_ +#define _OB_SHARE_ASH_BKGD_SESS_INACTIVE_GUARD_H_ + +namespace oceanbase +{ +namespace common +{ + +class ObBKGDSessInActiveGuard +{ +public: + ObBKGDSessInActiveGuard(); + ~ObBKGDSessInActiveGuard(); +private: + bool need_record_; + bool prev_stat_; +}; + +} +} +#endif /* _OB_SHARE_ASH_BKGD_SESS_INACTIVE_GUARD_H_ */ +//// end of header file diff --git a/deps/oblib/src/lib/lock/cond.h b/deps/oblib/src/lib/lock/cond.h index 87f21b1be4..2302c7b28d 100644 --- a/deps/oblib/src/lib/lock/cond.h +++ b/deps/oblib/src/lib/lock/cond.h @@ -15,6 +15,9 @@ #include "lib/time/Time.h" #include "lib/ob_define.h" #include "lib/oblog/ob_log.h" +#include "lib/wait_event/ob_wait_event.h" +#include "lib/stat/ob_diagnose_info.h" + namespace obutil { template class ObMonitor; @@ -82,6 +85,8 @@ Cond::wait_impl(const M& mutex) const LockState state; mutex.unlock(state); + oceanbase::common::ObWaitEventGuard + wait_guard(oceanbase::common::ObWaitEventIds::DEFAULT_COND_WAIT, 0, reinterpret_cast(this)); const int rc = ob_pthread_cond_wait(&_cond, state.mutex); mutex.lock(state); @@ -113,6 +118,8 @@ Cond::timed_wait_impl(const M& mutex, const ObSysTime& timeout) const timespec ts; ts.tv_sec = tv.tv_sec + timeout/1000; ts.tv_nsec = tv.tv_usec * 1000 + ( timeout % 1000 ) * 1000000;*/ + oceanbase::common::ObWaitEventGuard + wait_guard(oceanbase::common::ObWaitEventIds::DEFAULT_COND_WAIT, timeout.toMicroSeconds(), reinterpret_cast(this)); const int rc = ob_pthread_cond_timedwait(&_cond, state.mutex, &ts); mutex.lock(state); diff --git a/deps/oblib/src/lib/lock/ob_latch.cpp b/deps/oblib/src/lib/lock/ob_latch.cpp index 636531a779..a96f1546ca 100644 --- a/deps/oblib/src/lib/lock/ob_latch.cpp +++ b/deps/oblib/src/lib/lock/ob_latch.cpp @@ -15,7 +15,9 @@ #include "lib/stat/ob_diagnose_info.h" #include "lib/utility/ob_print_utils.h" #include "lib/worker.h" - +#include "lib/stat/ob_diagnostic_info_guard.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "share/rc/ob_tenant_base.h" namespace oceanbase { @@ -85,7 +87,8 @@ int ObLatchMutex::try_lock( int ObLatchMutex::lock( const uint32_t latch_id, - const int64_t abs_timeout_us) + const int64_t abs_timeout_us, + const bool is_atomic) { int ret = OB_SUCCESS; uint64_t i = 0; @@ -125,7 +128,7 @@ int ObLatchMutex::lock( reinterpret_cast(this), (uint32_t*)&lock_.val(), 0, - true /*is_atomic*/); + is_atomic); if (OB_FAIL(wait(abs_timeout_us, uid))) { if (OB_TIMEOUT != ret) { COMMON_LOG(WARN, "Fail to wait the latch, ", K(ret)); @@ -156,7 +159,7 @@ int ObLatchMutex::wait(const int64_t abs_timeout_us, const uint32_t uid) { // performance critical, do not double check the parameters int ret = OB_SUCCESS; - ObDiagnoseSessionInfo *dsi = (!record_stat_ ? NULL : ObDiagnoseSessionInfo::get_local_diagnose_info()); + ObDiagnosticInfo *dsi = (!record_stat_ ? NULL : ObLocalDiagnosticInfo::get()); int64_t timeout = 0; int lock = 0; @@ -253,7 +256,7 @@ int ObLatchWaitQueue::wait( int64_t timeout = 0; bool conflict = false; struct timespec ts; - ObDiagnoseSessionInfo *dsi = ObDiagnoseSessionInfo::get_local_diagnose_info(); + ObDiagnosticInfo *dsi = ObLocalDiagnosticInfo::get(); //check if need wait if (OB_FAIL(try_lock(bucket, proc, latch_id, uid, lock_func))) { @@ -274,13 +277,14 @@ int ObLatchWaitQueue::wait( } { - ObLatchWaitEventGuard wait_guard( - ObWaitEventIds::LATCH_WAIT_QUEUE_LOCK_WAIT, - abs_timeout_us / 1000, - reinterpret_cast(this), - (uint32_t*)&latch.lock_, - 0, - true /*is_atomic*/); + // only record physical wait event from caller function + // ObLatchWaitEventGuard wait_guard( + // ObWaitEventIds::LATCH_WAIT_QUEUE_LOCK_WAIT, + // abs_timeout_us / 1000, + // reinterpret_cast(this), + // (uint32_t*)&latch.lock_, + // 0, + // true /*is_atomic*/); ts.tv_sec = timeout / 1000000; ts.tv_nsec = 1000 * (timeout % 1000000); // futex_wait is an atomic wait event diff --git a/deps/oblib/src/lib/lock/ob_latch.h b/deps/oblib/src/lib/lock/ob_latch.h index 5abcc1b6cc..9772bc0f1e 100644 --- a/deps/oblib/src/lib/lock/ob_latch.h +++ b/deps/oblib/src/lib/lock/ob_latch.h @@ -37,53 +37,46 @@ extern bool USE_CO_LATCH; do { \ } while(0) -#define TRY_LOCK_RECORD_STAT(latch_id, spin_cnt, ret) \ - do { \ - if (record_stat_ && lib::is_diagnose_info_enabled()) { \ - ObDiagnoseTenantInfo *di = ObDiagnoseTenantInfo::get_local_diagnose_info(); \ - if (NULL != di) { \ - ObLatchStat *p_latch_stat = di->get_latch_stats().get_or_create_item(latch_id); \ - if (OB_ISNULL(p_latch_stat)) { \ - } else { \ - ObLatchStat &latch_stat = *p_latch_stat; \ - if (OB_SUCC(ret)) { \ - ++latch_stat.immediate_gets_; \ - } else { \ - ++latch_stat.immediate_misses_; \ - } \ - latch_stat.spin_gets_ += spin_cnt; \ - } \ - } \ - } \ - } while(0) +#define TRY_LOCK_RECORD_STAT(latch_id, spin_cnt, ret) \ + // do { \ + // if (record_stat_ && lib::is_diagnose_info_enabled() && \ + // OB_NOT_NULL(ObLocalDiagnosticInfo::get())) { \ + // ObTenantDiagnosticInfoSummaryGuard g(ObLocalDiagnosticInfo::get()->get_tenant_id(), \ + // ObLocalDiagnosticInfo::get()->get_group_id(), true); \ + // ObLatchStat *latch_stat = ObLocalDiagnosticInfo::get_latch_stat(latch_id); \ + // if (NULL != latch_stat) { \ + // if (OB_SUCC(ret)) { \ + // ++latch_stat->immediate_gets_; \ + // } else { \ + // ++latch_stat->immediate_misses_; \ + // } \ + // latch_stat->spin_gets_ += spin_cnt; \ + // } \ + // } \ + // } while (0) -#define LOCK_RECORD_STAT(latch_id, waited, spin_cnt, yield_cnt) \ - do { \ - if (record_stat_ && lib::is_diagnose_info_enabled()) { \ - ObDiagnoseTenantInfo *di = ObDiagnoseTenantInfo::get_local_diagnose_info(); \ - if (NULL != di) { \ - ObLatchStat *p_latch_stat = di->get_latch_stats().get_or_create_item(latch_id); \ - if (OB_ISNULL(p_latch_stat)) { \ - } else { \ - ObLatchStat &latch_stat = *p_latch_stat; \ - ++latch_stat.gets_; \ - latch_stat.spin_gets_ += spin_cnt; \ - latch_stat.sleeps_ += yield_cnt; \ - if (OB_UNLIKELY(waited)) { \ - ++latch_stat.misses_; \ - ObDiagnoseSessionInfo *dsi = ObDiagnoseSessionInfo::get_local_diagnose_info(); \ - if (NULL != dsi) { \ - latch_stat.wait_time_ += dsi->get_curr_wait().wait_time_; \ - if (dsi->get_curr_wait().wait_time_ > 1000 * 1000) { \ - COMMON_LOG_RET(WARN, OB_ERR_TOO_MUCH_TIME, "The Latch wait too much time, ", \ - K(dsi->get_curr_wait()), KCSTRING(lbt())); \ - } \ - } \ - } \ - } \ - } \ - } \ - } while(0) +#define LOCK_RECORD_STAT(latch_id, waited, spin_cnt, yield_cnt) \ + // do { \ + // if (record_stat_ && lib::is_diagnose_info_enabled() && \ + // OB_NOT_NULL(ObLocalDiagnosticInfo::get())) { \ + // ObTenantDiagnosticInfoSummaryGuard g(ObLocalDiagnosticInfo::get()->get_tenant_id(), \ + // ObLocalDiagnosticInfo::get()->get_group_id(), true); \ + // ObLatchStat *latch_stat = ObLocalDiagnosticInfo::get_latch_stat(latch_id); \ + // if (NULL != latch_stat) { \ + // ++latch_stat->gets_; \ + // latch_stat->spin_gets_ += spin_cnt; \ + // latch_stat->sleeps_ += yield_cnt; \ + // if (OB_UNLIKELY(waited)) { \ + // ++latch_stat->misses_; \ + // latch_stat->wait_time_ += ObLocalDiagnosticInfo::get()->get_curr_wait().wait_time_; \ + // if (ObLocalDiagnosticInfo::get()->get_curr_wait().wait_time_ > 1000 * 1000) { \ + // COMMON_LOG_RET(WARN, OB_ERR_TOO_MUCH_TIME, "The Latch wait too much time, ", \ + // K(ObLocalDiagnosticInfo::get()->get_curr_wait()), KCSTRING(lbt())); \ + // } \ + // } \ + // } \ + // } \ + // } while (0) struct ObLatchWaitMode { @@ -102,7 +95,8 @@ public: ~ObLatchMutex(); int lock( const uint32_t latch_id, - const int64_t abs_timeout_us = INT64_MAX); + const int64_t abs_timeout_us = INT64_MAX, + const bool is_atomic = true); int try_lock( const uint32_t latch_id, const uint32_t *puid = NULL); @@ -183,7 +177,10 @@ private: inline void lock_bucket(ObLatchBucket &bucket) { - bucket.lock_.lock(ObLatchIds::LATCH_WAIT_QUEUE_LOCK); + bucket.lock_.lock(ObLatchIds::LATCH_WAIT_QUEUE_LOCK, INT64_MAX/*abs_timeout_us*/, false/*is_atomic*/); + // ObLatchWaitQueue is called by ObLatch and nesting of wait_event occurs. + // Therefore we consider the wait event of ObLatchWaitQueue to be not atomic. + // The implementation of wait event here will be modified later. } inline void unlock_bucket(ObLatchBucket &bucket) diff --git a/deps/oblib/src/lib/lock/ob_scond.h b/deps/oblib/src/lib/lock/ob_scond.h index 64e8e1d3c3..6f856cd172 100644 --- a/deps/oblib/src/lib/lock/ob_scond.h +++ b/deps/oblib/src/lib/lock/ob_scond.h @@ -33,7 +33,7 @@ public: uint32_t get_key() { return ATOMIC_LOAD(&futex_.uval()); } void wait(uint32_t key, int64_t timeout) { if (timeout > 0 && get_key() == key) { - ObWaitEventGuard guard(event_no_, timeout / 1000, reinterpret_cast(this)); + ObWaitEventGuard guard(event_no_, timeout / 1000, reinterpret_cast(this), 0, 0, true); ATOMIC_FAA(&n_waiters_, 1); futex_.wait(key, timeout); ATOMIC_FAA(&n_waiters_, -1); diff --git a/deps/oblib/src/lib/lock/ob_thread_cond.cpp b/deps/oblib/src/lib/lock/ob_thread_cond.cpp index de1069b81e..982501cf26 100644 --- a/deps/oblib/src/lib/lock/ob_thread_cond.cpp +++ b/deps/oblib/src/lib/lock/ob_thread_cond.cpp @@ -79,7 +79,7 @@ int ObThreadCond::wait_us(const uint64_t time_us) ret = OB_NOT_INIT; COMMON_LOG(WARN, "The thread cond has not been inited, ", K(ret), KCSTRING(lbt())); } else { - ObWaitEventGuard guard(event_no_, time_us / 1000, reinterpret_cast(this)); + ObWaitEventGuard guard(event_no_, time_us / 1000, reinterpret_cast(this), 0, 0, true); if (0 == time_us) { if (OB_UNLIKELY(0 != (tmp_ret = ob_pthread_cond_wait(&cond_, &mutex_)))) { ret = OB_ERR_SYS; diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.h b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.h index 9901eec132..23fab8536f 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.h +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.h @@ -240,6 +240,25 @@ } \ } +#define EXTRACT_UINT_FIELD_MYSQL_SKIP_RET(result, column_name, field, type) \ + if (OB_SUCC(ret)) \ + { \ + uint64_t uint_value = 0; \ + if (OB_SUCCESS == (ret = (result).get_uint(column_name, uint_value))) \ + { \ + field = static_cast(uint_value); \ + } \ + else if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) \ + { \ + ret = OB_SUCCESS; \ + field = static_cast(0); \ + } \ + else \ + { \ + SQL_LOG(WARN, "fail to get column in row. ", K(column_name), K(ret)); \ + } \ + } + #define EXTRACT_DATETIME_FIELD_MYSQL_SKIP_RET(result, column_name, field, type) \ if (OB_SUCC(ret)) \ { \ @@ -1603,6 +1622,62 @@ } \ } while (false) +#define EXTRACT_INT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field, type) \ + if (OB_SUCC(ret)) \ + { \ + common::number::ObNumber number_value; \ + char buffer[common::number::ObNumber::MAX_NUMBER_ALLOC_BUFF_SIZE]; \ + ObDataBuffer data_buffer(buffer, sizeof(buffer)); \ + int64_t context_val = -1; \ + if (OB_SUCCESS == (ret = (result).get_number(column_name, number_value, data_buffer))) \ + { \ + if (!number_value.is_valid_int64(context_val)) { \ + field = static_cast(0); \ + SQL_LOG(WARN, "failed to get int64 from number", K(number_value), K(ret)); \ + } \ + else \ + { \ + field = static_cast(context_val); \ + }\ + } \ + else if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) \ + { \ + ret = OB_SUCCESS; \ + field = static_cast(0); \ + } \ + else { \ + SQL_LOG(WARN, "fail to get column in row. ", "column_name", column_name, K(ret)); \ + } \ + } + +#define EXTRACT_UINT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field, type) \ + if (OB_SUCC(ret)) \ + { \ + common::number::ObNumber number_value; \ + char buffer[common::number::ObNumber::MAX_NUMBER_ALLOC_BUFF_SIZE]; \ + ObDataBuffer data_buffer(buffer, sizeof(buffer)); \ + uint64_t context_val = -1; \ + if (OB_SUCCESS == (ret = (result).get_number(column_name, number_value, data_buffer))) \ + { \ + if (!number_value.is_valid_uint64(context_val)) { \ + field = static_cast(0); \ + SQL_LOG(WARN, "failed to get int64 from number", K(number_value), K(ret)); \ + } \ + else \ + { \ + field = static_cast(context_val); \ + }\ + } \ + else if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) \ + { \ + ret = OB_SUCCESS; \ + field = static_cast(0); \ + } \ + else { \ + SQL_LOG(WARN, "fail to get column in row. ", "column_name", column_name, K(ret)); \ + } \ + } + namespace oceanbase { namespace common diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index 9e6d089cb9..c70b0650c2 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -319,6 +319,7 @@ const int64_t OB_MAX_CONSTRAINT_NAME_LENGTH_MYSQL = 64; // Compatible with mysql const int64_t OB_MAX_CONSTRAINT_EXPR_LENGTH = 2048; const int64_t OB_MAX_TABLESPACE_NAME_LENGTH = 128; const int64_t OB_MAX_UDF_NAME_LENGTH = 64; +const int64_t OB_MAX_ASH_PL_NAME_LENGTH = 32; const int64_t OB_MAX_DL_NAME_LENGTH = 128; const int64_t OB_MAX_USER_NAME_LENGTH = 64; // Not compatible with Oracle (Oracle is 128), the logic is greater than when an error is reported const int64_t OB_MAX_USER_NAME_BUF_LENGTH = OB_MAX_USER_NAME_LENGTH + 1; diff --git a/deps/oblib/src/lib/ob_lib_config.cpp b/deps/oblib/src/lib/ob_lib_config.cpp index c6ebef5084..4ff195059a 100644 --- a/deps/oblib/src/lib/ob_lib_config.cpp +++ b/deps/oblib/src/lib/ob_lib_config.cpp @@ -16,8 +16,10 @@ namespace oceanbase namespace lib { -volatile bool ObLibConfig::enable_diagnose_info_ = true; +bool ObLibConfig::enable_diagnose_info_ = true; volatile bool ObLibConfig::enable_trace_log_ = true; +bool ObPerfModeGuard::PERF_MODE_VALUE = false; + } //lib } //oceanbase diff --git a/deps/oblib/src/lib/ob_lib_config.h b/deps/oblib/src/lib/ob_lib_config.h index 808509fd9e..5d720845dc 100644 --- a/deps/oblib/src/lib/ob_lib_config.h +++ b/deps/oblib/src/lib/ob_lib_config.h @@ -17,6 +17,13 @@ namespace oceanbase { + +namespace common +{ +class ObBackGroundSessionGuard; +class ObDiagnosticInfoSwitchGuard; +} + namespace lib { bool is_diagnose_info_enabled(); @@ -31,12 +38,15 @@ class ObLibConfig friend bool is_trace_log_enabled(); friend void reload_trace_log_config(const bool); private: - static volatile bool enable_diagnose_info_ CACHE_ALIGNED; + static bool enable_diagnose_info_ CACHE_ALIGNED; static volatile bool enable_trace_log_ CACHE_ALIGNED; }; class ObPerfModeGuard { + friend class common::ObBackGroundSessionGuard; + friend class common::ObDiagnosticInfoSwitchGuard; + friend class ObEnableDiagnoseGuard; friend bool is_diagnose_info_enabled(); friend bool is_trace_log_enabled(); public: @@ -51,9 +61,30 @@ public: private: static bool &get_tl_instance() { - static thread_local bool in_disable_diagnose_guard = false; + static thread_local bool in_disable_diagnose_guard = PERF_MODE_VALUE; + return in_disable_diagnose_guard; } +private: + static bool PERF_MODE_VALUE; + bool old_value_; +}; + +class ObEnableDiagnoseGuard +{ + friend class common::ObBackGroundSessionGuard; + friend class common::ObDiagnosticInfoSwitchGuard; + friend bool is_diagnose_info_enabled(); + friend bool is_trace_log_enabled(); +public: + explicit ObEnableDiagnoseGuard() : old_value_(ObPerfModeGuard::get_tl_instance()) + { + ObPerfModeGuard::get_tl_instance() = ObPerfModeGuard::PERF_MODE_VALUE; + } + ~ObEnableDiagnoseGuard() + { + ObPerfModeGuard::get_tl_instance() = old_value_; + } private: bool old_value_; }; diff --git a/deps/oblib/src/lib/objectpool/ob_concurrency_objpool.h b/deps/oblib/src/lib/objectpool/ob_concurrency_objpool.h index 65227255d1..018fb662e3 100644 --- a/deps/oblib/src/lib/objectpool/ob_concurrency_objpool.h +++ b/deps/oblib/src/lib/objectpool/ob_concurrency_objpool.h @@ -90,6 +90,10 @@ public: ptr = NULL; } } + void set_nway(int nway) + { + allocator_.set_nway(static_cast(nway)); + } private: ObSliceAlloc allocator_; diff --git a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp index ee63492798..7408cfbe85 100644 --- a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp +++ b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp @@ -28,6 +28,7 @@ #include "lib/thread/ob_thread_name.h" #include "lib/thread/thread.h" #include "lib/thread/protected_stack_allocator.h" +#include "lib/ash/ob_active_session_guard.h" using namespace oceanbase::lib; extern "C" { @@ -293,6 +294,7 @@ void ObBaseLogWriter::do_flush_log() int64_t item_cnt = 0; const uint32_t key = log_flush_cond_->get_key(); if (!need_flush()) { + common::ObBKGDSessInActiveGuard inactive_guard; log_flush_cond_->wait(key, log_cfg_.group_commit_max_wait_us_); } while (OB_LIKELY(need_flush() && !has_stopped_)) { diff --git a/deps/oblib/src/lib/oblog/ob_log_compressor.cpp b/deps/oblib/src/lib/oblog/ob_log_compressor.cpp index f01efed4dd..f356edf507 100644 --- a/deps/oblib/src/lib/oblog/ob_log_compressor.cpp +++ b/deps/oblib/src/lib/oblog/ob_log_compressor.cpp @@ -232,6 +232,7 @@ void ObLogCompressor::log_compress_loop_() { common::ObThreadCondGuard guard(log_compress_cond_); while (!stopped_ && !is_enable_compress() && max_disk_size_ <= 0 && OB_LOGGER.get_max_file_index() <= 0) { + ObBKGDSessInActiveGuard inactive_guard; log_compress_cond_.wait_us(loop_interval_); } } @@ -500,7 +501,7 @@ int ObLogCompressor::compress_single_file_(const char *file_name, char *src_buf, LOG_WARN("failed to write file", K(ret), K(errno), K(compressed_file_name)); } } - usleep(sleep_us); + ob_usleep(sleep_us); } fclose(input_file); fclose(output_file); diff --git a/deps/oblib/src/lib/queue/ob_dedup_queue.cpp b/deps/oblib/src/lib/queue/ob_dedup_queue.cpp index ee3f98038c..075ca207df 100644 --- a/deps/oblib/src/lib/queue/ob_dedup_queue.cpp +++ b/deps/oblib/src/lib/queue/ob_dedup_queue.cpp @@ -398,6 +398,7 @@ void ObDedupQueue::run1() } else { ObThreadCondGuard guard(task_queue_sync_); if (0 == task_queue_.get_total()) { + ObBKGDSessInActiveGuard inactive_guard; if (OB_SUCCESS != (tmp_ret = task_queue_sync_.wait(QUEUE_WAIT_TIME_MS))) { if (OB_TIMEOUT != tmp_ret) { COMMON_LOG_RET(WARN, tmp_ret, "Fail to wait task queue sync, ", K(tmp_ret)); diff --git a/deps/oblib/src/lib/queue/ob_lighty_queue.cpp b/deps/oblib/src/lib/queue/ob_lighty_queue.cpp index 6261b3792c..9cc1a068de 100644 --- a/deps/oblib/src/lib/queue/ob_lighty_queue.cpp +++ b/deps/oblib/src/lib/queue/ob_lighty_queue.cpp @@ -150,6 +150,7 @@ uint64_t ObLightyQueue::wait_push(uint64_t seq, int64_t timeout) uint32_t wait_id = get_cond(seq).get_seq(); uint64_t push_idx = ATOMIC_LOAD(&push_); if (push_idx <= seq) { + ObBKGDSessInActiveGuard inactive_guard; get_cond(seq).wait(wait_id, timeout); } return push_idx; diff --git a/deps/oblib/src/lib/queue/ob_priority_queue.h b/deps/oblib/src/lib/queue/ob_priority_queue.h index 83fd6624de..44d6fc2abc 100644 --- a/deps/oblib/src/lib/queue/ob_priority_queue.h +++ b/deps/oblib/src/lib/queue/ob_priority_queue.h @@ -15,6 +15,7 @@ #include "lib/queue/ob_link_queue.h" #include "lib/lock/ob_scond.h" +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -84,7 +85,10 @@ public: } if (OB_FAIL(ret)) { auto key = sem_.get_key(); - sem_.wait(key, timeout_us); + { + common::ObBKGDSessInActiveGuard inactive_guard; + sem_.wait(key, timeout_us); + } data = NULL; } else { (void)ATOMIC_FAA(&size_, -1); @@ -105,6 +109,15 @@ public: ; } + ObLinkQueue* get_queue(const int i) + { + return &queue_[i]; + } + + int64_t get_prio_cnt() const + { + return PRIO_CNT; + } private: SimpleCond sem_; ObLinkQueue queue_[PRIO_CNT]; @@ -128,6 +141,14 @@ public: { return queue_[i].size(); } + int64_t get_prio_cnt() const + { + return PRIO_CNT; + } + ObLinkQueue* get_queue(const int i) + { + return &queue_[i]; + } int64_t to_string(char *buf, const int64_t buf_len) const { int64_t pos = 0; @@ -208,6 +229,7 @@ private: } } if (OB_FAIL(ret)) { + ObBKGDSessInActiveGuard inactive_guard; cond_.wait(timeout_us); data = NULL; } else { diff --git a/deps/oblib/src/lib/restore/ob_storage.cpp b/deps/oblib/src/lib/restore/ob_storage.cpp index a21d05b66e..45f39ca530 100644 --- a/deps/oblib/src/lib/restore/ob_storage.cpp +++ b/deps/oblib/src/lib/restore/ob_storage.cpp @@ -20,6 +20,7 @@ #include "common/storage/ob_device_common.h" #include "common/storage/ob_io_device.h" #include "lib/atomic/ob_atomic.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { diff --git a/deps/oblib/src/lib/restore/ob_storage_cos_base.cpp b/deps/oblib/src/lib/restore/ob_storage_cos_base.cpp index 2d09c9cb5f..2f68d8d1de 100644 --- a/deps/oblib/src/lib/restore/ob_storage_cos_base.cpp +++ b/deps/oblib/src/lib/restore/ob_storage_cos_base.cpp @@ -46,7 +46,7 @@ void fin_cos_env() OB_LOG(INFO, "force fin_cos_env", K(flying_io_cnt)); break; } - usleep(100 * 1000L); // 100ms + ob_usleep(100 * 1000L); // 100ms flying_io_cnt = ObExternalIOCounter::get_flying_io_cnt(); } diff --git a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp index a7832f4008..46be0fecd8 100644 --- a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp +++ b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp @@ -48,7 +48,7 @@ void fin_oss_env() OB_LOG(INFO, "force fin_oss_env", K(flying_io_cnt)); break; } - usleep(100 * 1000L); // 100ms + ob_usleep(100 * 1000L); // 100ms flying_io_cnt = ObExternalIOCounter::get_flying_io_cnt(); } diff --git a/deps/oblib/src/lib/restore/ob_storage_s3_base.cpp b/deps/oblib/src/lib/restore/ob_storage_s3_base.cpp index a2265ddd24..17b26dc015 100644 --- a/deps/oblib/src/lib/restore/ob_storage_s3_base.cpp +++ b/deps/oblib/src/lib/restore/ob_storage_s3_base.cpp @@ -508,7 +508,7 @@ void fin_s3_env() OB_LOG(WARN, "force fin_s3_env", K(ret), K(flying_io_cnt)); break; } - usleep(100 * 1000L); // 100ms + ob_usleep(100 * 1000L); // 100ms flying_io_cnt = ObExternalIOCounter::get_flying_io_cnt(); } diff --git a/deps/oblib/src/lib/signal/ob_signal_utils.cpp b/deps/oblib/src/lib/signal/ob_signal_utils.cpp index 97209c6ee5..e9ce7cf055 100644 --- a/deps/oblib/src/lib/signal/ob_signal_utils.cpp +++ b/deps/oblib/src/lib/signal/ob_signal_utils.cpp @@ -19,6 +19,7 @@ #include "lib/utility/ob_macro_utils.h" #include "lib/charset/ob_mysql_global.h" #include "lib/signal/ob_libunwind.h" +#include "lib/ash/ob_active_session_guard.h" extern "C" { extern int ob_poll(struct pollfd *__fds, nfds_t __nfds, int __timeout); @@ -175,7 +176,12 @@ int wait_readable(int fd, int64_t timeout) bzero(&pfd, sizeof(pfd)); pfd.fd = fd; pfd.events = POLLIN; - int n = ob_poll(&pfd, 1, timeout); + + int n = 0; + { + common::ObBKGDSessInActiveGuard inactive_guard; + n = ob_poll(&pfd, 1, timeout); + } if (-1 == n) { ret = OB_ERR_SYS; DLOG(WARN, "poll failed, errno=%d", errno); diff --git a/deps/oblib/src/lib/stat/mock_diagnostic_info.cpp b/deps/oblib/src/lib/stat/mock_diagnostic_info.cpp new file mode 100644 index 0000000000..35cb1df8af --- /dev/null +++ b/deps/oblib/src/lib/stat/mock_diagnostic_info.cpp @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define private public +#define protected public +#include "deps/oblib/src/lib/ob_lib_config.h" +#undef private +#undef protected + +namespace oceanbase +{ + +// ATTENTION: add this cpp file as library only if compiled target doesn't need diagnose. like unittest or cdc. + +__attribute__((constructor)) void init_diagnostic_info() +{ + // lib::ObLibConfig::enable_diagnose_info_ = false; + lib::ObPerfModeGuard::PERF_MODE_VALUE = true; + lib::ObPerfModeGuard::get_tl_instance() = true; +} + +} /* namespace oceanbase */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_di_cache.cpp b/deps/oblib/src/lib/stat/ob_di_cache.cpp index eb24f6bb5d..eed85ff8b9 100644 --- a/deps/oblib/src/lib/stat/ob_di_cache.cpp +++ b/deps/oblib/src/lib/stat/ob_di_cache.cpp @@ -10,10 +10,13 @@ * See the Mulan PubL v2 for more details. */ +#define USING_LOG_PREFIX COMMON + #include "lib/stat/ob_di_cache.h" #include "lib/random/ob_random.h" #include "lib/stat/ob_session_stat.h" #include "lib/ob_lib_config.h" +#include "lib/utility/ob_tracepoint.h" // for ERRSIM_POINT_DEF namespace oceanbase { @@ -55,470 +58,5 @@ void ObDITenantCollect::clean() base_value_.reset(); } -/* - * -------------------------------------------------------ObDICache--------------------------------------------------------------- - */ -ObDISessionCache::ObDISessionCache() - : di_map_(), - collects_() -{ -} - -ObDISessionCache::~ObDISessionCache() -{ -} - -ObDISessionCache &ObDISessionCache::get_instance() -{ - static ObDISessionCache instance_; - return instance_; -} - -int ObDISessionCache::get_node(uint64_t session_id, ObDISessionCollect *&session_collect) -{ - int ret = OB_SUCCESS; - thread_local ObRandom random; - ObSessionBucket &bucket = di_map_[session_id % MAX_SESSION_COLLECT_NUM]; - while (1) { - bucket.lock_.rdlock(); - if (OB_SUCCESS == (ret = bucket.get_the_node(session_id, session_collect))) { - if (OB_SUCCESS == (ret = session_collect->lock_.try_rdlock())) { - bucket.lock_.unlock(); - break; - } - } - if (OB_SUCCESS != ret) { - bucket.lock_.unlock(); - int64_t pos = 0; - while (1) { - pos = random.get(0, MAX_SESSION_COLLECT_NUM - 1); - if (OB_SUCCESS == (ret = collects_[pos].lock_.try_wrlock())) { - break; - } - } - if (OB_SUCCESS == ret) { - if (0 != collects_[pos].session_id_) { - ObSessionBucket &des_bucket = di_map_[collects_[pos].session_id_ % MAX_SESSION_COLLECT_NUM]; - des_bucket.lock_.wrlock(); - des_bucket.list_.remove(&collects_[pos]); - collects_[pos].clean(); - des_bucket.lock_.unlock(); - } - bucket.lock_.wrlock(); - if (OB_SUCCESS != (ret = bucket.get_the_node(session_id, session_collect))) { - ret = OB_SUCCESS; - bucket.list_.add_last(&collects_[pos]); - collects_[pos].session_id_ = session_id; - bucket.lock_.unlock(); - session_collect = &collects_[pos]; - collects_[pos].lock_.wr2rdlock(); - break; - } else { - if (OB_SUCCESS == (ret = session_collect->lock_.try_rdlock())) { - bucket.lock_.unlock(); - collects_[pos].lock_.unlock(); - break; - } else { - bucket.lock_.unlock(); - collects_[pos].lock_.unlock(); - } - } - } - } - } - return ret; -} - -int ObDISessionCache::get_all_diag_info(ObIArray > &diag_infos) -{ - int ret = OB_SUCCESS; - std::pair pair; - ObDISessionCollect *head = NULL; - ObDISessionCollect *node = NULL; - for (int64_t i = 0; OB_SUCC(ret) && i < MAX_SESSION_COLLECT_NUM; ++i) { - ObSessionBucket &bucket = di_map_[i]; - bucket.lock_.rdlock(); - head = bucket.list_.get_header(); - node = bucket.list_.get_first(); - while (head != node && NULL != node && OB_SUCC(ret)) { - pair.first = node->session_id_; - pair.second = node; - if (OB_SUCCESS != (ret = diag_infos.push_back(pair))) { - } else { - node = node->next_; - } - } - bucket.lock_.unlock(); - } - return ret; -} - -int ObDISessionCache::get_the_diag_info( - uint64_t session_id, - ObDISessionCollect *&diag_infos) -{ - int ret = OB_SUCCESS; - ObSessionBucket &bucket = di_map_[session_id % MAX_SESSION_COLLECT_NUM]; - bucket.lock_.rdlock(); - ObDISessionCollect *collect = NULL; - if (OB_SUCCESS == (ret = bucket.get_the_node(session_id, collect))) { - diag_infos = collect; - } - bucket.lock_.unlock(); - return ret; -} - -ObDIBaseTenantCacheIterator::ObDIBaseTenantCacheIterator() -{ - reset(); -} - -ObDIBaseTenantCacheIterator::ObDIBaseTenantCacheIterator(const ObDITenantCollect *collects, const int64_t count) - : collects_(collects), - count_(count), - idx_(0) -{ -} - -int ObDIBaseTenantCacheIterator::init(const ObDITenantCollect *collects, const int64_t count) -{ - int ret = OB_SUCCESS; - if (nullptr == collects || 0 == count) { - ret = OB_INVALID_ARGUMENT; - } else { - collects_ = collects; - count_ = count; - idx_ = 0; - } - return ret; -} - -int ObDIBaseTenantCacheIterator::get_next(const ObDITenantCollect *&collect) -{ - int ret = OB_SUCCESS; - collect = nullptr; - if (nullptr != collects_ && count_ > 0) { - for (; idx_ < count_ && nullptr == collect; idx_++) { - if (0 != collects_[idx_].last_access_time_) { - collect = collects_ + idx_; - } - } - } - if (collect == nullptr) { - ret = OB_ITER_END; - } - return ret; -} - - -ObDIThreadTenantCache::ObDIThreadTenantCache() - : tenant_cache_(), - extend_tenant_cache_(nullptr) -{ - ObDIGlobalTenantCache::get_instance().link(this); -} - -ObDIThreadTenantCache::~ObDIThreadTenantCache() -{ - ObDIGlobalTenantCache::get_instance().unlink(this); - lib::ObDisableDiagnoseGuard disable_diagnose_guard; - if (extend_tenant_cache_ != nullptr) { - ob_delete(extend_tenant_cache_); - extend_tenant_cache_ = nullptr; - } -} - -int ObDIThreadTenantCache::get_node(uint64_t tenant_id, ObDITenantCollect *&tenant_collect) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(tenant_collect = tenant_cache_.get_node(tenant_id))) { - if (nullptr == extend_tenant_cache_) { - extend_tenant_cache_ = OB_NEW(ObDIBaseTenantCache, - SET_USE_UNEXPECTED_500("di_tenant_cache")); - } - if (nullptr != extend_tenant_cache_) { - tenant_collect = extend_tenant_cache_->get_node(tenant_id, true /*replace*/); - } - if (nullptr == tenant_collect) { - ret = OB_TENANT_NOT_EXIST; - } - } - return ret; -} - -void ObDIThreadTenantCache::get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos) -{ - tenant_cache_.get_the_diag_info(tenant_id, diag_infos); - if (nullptr != extend_tenant_cache_) { - extend_tenant_cache_->get_the_diag_info(tenant_id, diag_infos); - } -} - -int ObDIThreadTenantCache::get_cache_iter(ObDIBaseTenantCacheIterator &cache_iter, const bool extend ) const -{ - int ret = OB_SUCCESS; - if (!extend) { - ret = tenant_cache_.get_cache_iter(cache_iter); - } else if (nullptr != extend_tenant_cache_) { - ret = extend_tenant_cache_->get_cache_iter(cache_iter); - } else { - cache_iter.reset(); - } - return ret; -} - -ObDIGlobalTenantCache::ObDIGlobalTenantCache() - : list_(), - cnt_(0), - lock_(), - unlinked_tenant_cache_() -{ -} - -ObDIGlobalTenantCache::~ObDIGlobalTenantCache() -{ -} - -ObDIGlobalTenantCache &ObDIGlobalTenantCache::get_instance() -{ - static ObDIGlobalTenantCache instance_; - return instance_; -} - -void ObDIGlobalTenantCache::link(ObDIThreadTenantCache *node) -{ - lock_.wrlock(); - list_.add_last(node); - cnt_++; - lock_.unlock(); -} - -void ObDIGlobalTenantCache::unlink(ObDIThreadTenantCache *node) -{ - int ret = OB_SUCCESS; - lock_.wrlock(); - list_.remove(node); - cnt_--; - - if (NULL != node) { - ObDIBaseTenantCacheIterator cache_iter; - if (OB_FAIL(node->get_cache_iter(cache_iter))) { - } else if (!cache_iter.is_valid()) { - } else if (OB_FAIL(add_tenant_stat_(cache_iter))) { - } else if (OB_FAIL(node->get_cache_iter(cache_iter, true))) { - } else if (!cache_iter.is_valid()) { - } else if (OB_FAIL(add_tenant_stat_(cache_iter))) { - } - } - lock_.unlock(); -} - -// call this func with lock -int ObDIGlobalTenantCache::add_tenant_collect_(const ObDITenantCollect &collect) -{ - int ret = OB_SUCCESS; - ObDITenantCollect *local_collect = NULL; - if (OB_ISNULL((local_collect = unlinked_tenant_cache_.get_node(collect.tenant_id_)))) { - ret = OB_ERR_SYS; - // cannot print log in di - } else { - local_collect->base_value_.add(collect.base_value_); //has no ret - } - return ret; -} - -int ObDIGlobalTenantCache::add_tenant_stat_(ObDIBaseTenantCacheIterator &cache_iter) -{ - int ret = OB_SUCCESS; - if (!cache_iter.is_valid()) { - ret = OB_INVALID_ARGUMENT; - } else { - const ObDITenantCollect *collect = NULL; - ObDITenantCollect *local_collect = NULL; - - while (OB_SUCC(ret)) { - ret = cache_iter.get_next(collect); - if (OB_FAIL(ret)) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - } - break; - } else if (OB_ISNULL(collect)) { - ret = OB_ERR_SYS; - // cannot print log in di - } else { - ret = add_tenant_collect_(*collect); - } - } - } - - return ret; -} - -int ObDIGlobalTenantCache::get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos) -{ - int ret = OB_SUCCESS; - diag_infos.reset(); - lock_.rdlock(); - if (0 != cnt_) { - ObDIThreadTenantCache *tenant_cache = list_.get_first(); - while (list_.get_header() != tenant_cache && NULL != tenant_cache) { - tenant_cache->get_the_diag_info(tenant_id, diag_infos); - tenant_cache = tenant_cache->next_; - } - } - - if (OB_SUCC(ret)) { - unlinked_tenant_cache_.get_the_diag_info(tenant_id, diag_infos); // has no ret - } - lock_.unlock(); - return ret; -} - -int ObDIGlobalTenantCache::get_all_wait_event( - ObIAllocator &allocator, - ObIArray > &diag_infos) -{ - int ret = OB_SUCCESS; - AddWaitEvent adder; - ret = get_all_diag_info(allocator, diag_infos, adder); - return ret; -} - -int ObDIGlobalTenantCache::get_all_stat_event( - ObIAllocator &allocator, - ObIArray > &diag_infos) -{ - int ret = OB_SUCCESS; - AddStatEvent adder; - ret = get_all_diag_info(allocator, diag_infos, adder); - return ret; -} - -int ObDIGlobalTenantCache::get_all_latch_stat( - ObIAllocator &allocator, - ObIArray > &diag_infos) -{ - int ret = OB_SUCCESS; - AddLatchStat adder; - ret = get_all_diag_info(allocator, diag_infos, adder); - return ret; -} - -template -int ObDIGlobalTenantCache::get_all_diag_info( - ObIAllocator &allocator, - ObIArray > &diag_infos, _callback &callback) -{ - int ret = OB_SUCCESS; - std::pair pair; - ObTenantBucket *di_map = NULL; - void *di_map_buf = NULL; - - if (OB_ISNULL(di_map_buf = allocator.alloc(OB_MAX_SERVER_TENANT_CNT * sizeof(ObTenantBucket)))) { - ret= OB_ALLOCATE_MEMORY_FAILED; - // cannot print log in di - } else { - di_map = new (di_map_buf) ObTenantBucket[OB_MAX_SERVER_TENANT_CNT]; - } - - lock_.rdlock(); - ObDIBaseTenantCacheIterator cache_iter; - if (OB_SUCC(ret) && 0 != cnt_) { - ObDIThreadTenantCache *tenant_cache = list_.get_first(); - while (OB_SUCC(ret) && list_.get_header() != tenant_cache && NULL != tenant_cache) { - if (OB_FAIL(tenant_cache->get_cache_iter(cache_iter))) { - } else if (!cache_iter.is_valid()) { - } else if (OB_FAIL(get_tenant_stat(allocator, cache_iter, callback, di_map, OB_MAX_SERVER_TENANT_CNT))) { - } else if (OB_FAIL(tenant_cache->get_cache_iter(cache_iter, true))) { - } else if (!cache_iter.is_valid()) { - } else if (OB_FAIL(get_tenant_stat(allocator, cache_iter, callback, di_map, OB_MAX_SERVER_TENANT_CNT))) { - } - if (OB_SUCC(ret)) { - tenant_cache = tenant_cache->next_; - } - } - } - - if (OB_SUCC(ret)) { - if (OB_FAIL(unlinked_tenant_cache_.get_cache_iter(cache_iter))) { - } else if (!cache_iter.is_valid()) { - } else if (OB_FAIL(get_tenant_stat(allocator, cache_iter, callback, di_map, OB_MAX_SERVER_TENANT_CNT))) { - // cannot print log in di - } - } - lock_.unlock(); - ObDITenantCollect *head = NULL; - ObDITenantCollect *node = NULL; - for (int64_t i = 0; OB_SUCC(ret) && i < OB_MAX_SERVER_TENANT_CNT; ++i) { - ObTenantBucket &bucket = di_map[i]; - head = bucket.list_.get_header(); - node = bucket.list_.get_first(); - while (head != node && NULL != node && OB_SUCC(ret)) { - pair.first = node->tenant_id_; - pair.second = &(node->base_value_); - if (OB_SUCCESS != (ret = diag_infos.push_back(pair))) { - } else { - node = node->next_; - } - } - } - return ret; -} - -template -int ObDIGlobalTenantCache::get_tenant_stat(ObIAllocator &allocator, - ObDIBaseTenantCacheIterator &cache_iter, CALLBACK_FUNC &callback, - ObTenantBucket *di_map, const int64_t di_map_bucket_num) -{ - int ret = OB_SUCCESS; - const ObDITenantCollect *collect = NULL; - void *buf = NULL; - - if (OB_ISNULL(di_map) || di_map_bucket_num <= 0 || !cache_iter.is_valid()) { - ret = OB_INVALID_ARGUMENT; - } - while (OB_SUCC(ret)) { - ret = cache_iter.get_next(collect); - if (OB_FAIL(ret)) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - } - break; - } else if (OB_ISNULL(collect)) { - ret = OB_ERR_SYS; - // cannot print log in di - } else if (0 != collect->last_access_time_) { - ObTenantBucket &bucket = di_map[collect->tenant_id_ % di_map_bucket_num]; - ObDITenantCollect *got_collect = NULL; - ret = bucket.get_the_node(collect->tenant_id_, got_collect); - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; - if (NULL == (buf = allocator.alloc(sizeof(ObDITenantCollect)))) { - ret = OB_ALLOCATE_MEMORY_FAILED; - } else { - got_collect = new (buf) ObDITenantCollect(&allocator); - got_collect->tenant_id_ = collect->tenant_id_; - bucket.list_.add_last(got_collect); - } - } - - if (OB_SUCC(ret)) { - if (OB_ISNULL(got_collect)) { - ret = OB_ERR_SYS; - } else { - callback(got_collect->base_value_, collect->base_value_); - } - } - } - } - - return ret; -} - } } diff --git a/deps/oblib/src/lib/stat/ob_di_cache.h b/deps/oblib/src/lib/stat/ob_di_cache.h index 288be13ef5..078b00efa8 100644 --- a/deps/oblib/src/lib/stat/ob_di_cache.h +++ b/deps/oblib/src/lib/stat/ob_di_cache.h @@ -33,7 +33,7 @@ public: ObDISessionCollect(); virtual ~ObDISessionCollect(); void clean(); - TO_STRING_EMPTY(); + TO_STRING_KV(K_(session_id), "di_session_info", (uint64_t)&base_value_, K(lock_.get_lock())); uint64_t session_id_; ObDiagnoseSessionInfo base_value_; DIRWLock lock_; @@ -50,77 +50,6 @@ public: ObDiagnoseTenantInfo base_value_; }; -class ObDISessionCache -{ -public: - static ObDISessionCache &get_instance(); - void destroy(); - - int get_all_diag_info(ObIArray > &diag_infos); - - int get_the_diag_info( - uint64_t session_id, - ObDISessionCollect *&diag_infos); - int get_node(uint64_t session_id, ObDISessionCollect *&session_collect); -private: - static const int64_t MAX_SESSION_COLLECT_NUM = OB_MAX_SERVER_SESSION_CNT / 4; - STATIC_ASSERT((MAX_SESSION_COLLECT_NUM > 4 * 1024 && MAX_SESSION_COLLECT_NUM < 10 * 1024), - "unexpected MAX_SESSION_COLLECT_NUM"); -private: - struct ObSessionBucket - { - ObSessionBucket() : list_(), lock_() - { - } - int get_the_node(const uint64_t hash_value, ObDISessionCollect *&value) - { - int ret = OB_ENTRY_NOT_EXIST; - ObDISessionCollect *head = list_.get_header(); - ObDISessionCollect *node = list_.get_first(); - while (head != node && NULL != node) { - if (hash_value == node->session_id_) { - value = node; - ret = OB_SUCCESS; - break; - } else { - node = node->get_next(); - } - } - return ret; - } - ObDIList list_; - DIRWLock lock_; - }; - ObDISessionCache(); - virtual ~ObDISessionCache(); - ObSessionBucket di_map_[MAX_SESSION_COLLECT_NUM]; - ObDISessionCollect collects_[MAX_SESSION_COLLECT_NUM]; -}; - -struct ObTenantBucket -{ - ObTenantBucket() : list_() - { - } - int get_the_node(const uint64_t hash_value, ObDITenantCollect *&value) - { - int ret = OB_ENTRY_NOT_EXIST; - ObDITenantCollect *head = list_.get_header(); - ObDITenantCollect *node = list_.get_first(); - while (head != node && NULL != node) { - if (hash_value == node->tenant_id_) { - value = node; - ret = OB_SUCCESS; - break; - } else { - node = node->get_next(); - } - } - return ret; - } - ObDIList list_; -}; - struct AddWaitEvent { AddWaitEvent() {} @@ -148,201 +77,6 @@ struct AddLatchStat } }; -struct ObDIBaseTenantCacheIterator -{ -public: - ObDIBaseTenantCacheIterator(); - ObDIBaseTenantCacheIterator(const ObDITenantCollect *collects, const int64_t count); - ~ObDIBaseTenantCacheIterator() = default; - bool is_valid() const { return nullptr != collects_ && count_ > 0; } - int init(const ObDITenantCollect *collects, const int64_t count); - int get_next(const ObDITenantCollect *&collect); - void reset() { MEMSET(this, 0, sizeof(ObDIBaseTenantCacheIterator)); } -private: - const ObDITenantCollect *collects_; - int64_t count_; - int64_t idx_; -}; - -template -class ObDIBaseTenantCache -{ -public: - ObDIBaseTenantCache(); - virtual ~ObDIBaseTenantCache(); - void get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos); - ObDITenantCollect *get_node(uint64_t tenant_id, const bool replace = false); - ObDITenantCollect *get_sys_tenant_node() {return &collects_[0];} - int get_cache_iter(ObDIBaseTenantCacheIterator &cache_iter) const; -private: - ObDITenantCollect *add_node(uint64_t tenant_id, const bool replace); - int del_node(uint64_t tenant_id); - ObTenantBucket di_map_[MAX_TENANT_NODE_NUM]; - ObDITenantCollect collects_[MAX_TENANT_NODE_NUM]; - uint64_t last_access_time_; -}; - - -class ObDIThreadTenantCache: public ObDINode -{ -public: - static const int64_t DEFAULT_TENANT_NUM = 4; - static const int64_t MAX_TENANT_NUM_PER_SERVER = 64; - - ObDIThreadTenantCache(); - virtual ~ObDIThreadTenantCache(); - void get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos); - int get_node(uint64_t tenant_id, ObDITenantCollect *&tenant_collect); - ObDITenantCollect *get_sys_tenant_node() { return tenant_cache_.get_sys_tenant_node(); } - int get_cache_iter(ObDIBaseTenantCacheIterator &cache_iter, const bool extend = false) const; -private: - ObDIBaseTenantCache tenant_cache_; - ObDIBaseTenantCache *extend_tenant_cache_; -}; - -class ObDIGlobalTenantCache -{ -public: - static ObDIGlobalTenantCache &get_instance(); - - void link(ObDIThreadTenantCache *node); - void unlink(ObDIThreadTenantCache *node); - int get_all_wait_event( - ObIAllocator &allocator, - ObIArray > &diag_infos); - int get_all_stat_event( - ObIAllocator &allocator, - ObIArray > &diag_infos); - int get_all_latch_stat( - ObIAllocator &allocator, - ObIArray > &diag_infos); - int get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos); - int add_tenant_collect(const ObDITenantCollect &collect); // for switch tenant -private: - ObDIGlobalTenantCache(); - virtual ~ObDIGlobalTenantCache(); - template - int get_all_diag_info(ObIAllocator &allocator, - ObIArray > &diag_infos, _callback &callback); - template - int get_tenant_stat(ObIAllocator &allocator, - ObDIBaseTenantCacheIterator &cache_iter, - CALLBACK_FUNC &callback, - ObTenantBucket *di_map, - const int64_t di_map_bucket_num); - int add_tenant_stat_(ObDIBaseTenantCacheIterator &cache_iter); - int add_tenant_collect_(const ObDITenantCollect &collect); -private: - ObDIList list_; - int64_t cnt_; - DIRWLock lock_; - ObDIBaseTenantCache unlinked_tenant_cache_; -}; - -////////////////////////////////////////////////////////////////////////////////////////// - -template -ObDIBaseTenantCache::ObDIBaseTenantCache() - : di_map_(), - collects_(), - last_access_time_(0) -{ - collects_[0].tenant_id_ = OB_SYS_TENANT_ID; - collects_[0].last_access_time_ = 1; - ObTenantBucket &bucket = di_map_[OB_SYS_TENANT_ID % MAX_TENANT_NODE_NUM]; - bucket.list_.add_last(&collects_[0]); -} - -template -ObDIBaseTenantCache::~ObDIBaseTenantCache() -{ -} - -template -ObDITenantCollect *ObDIBaseTenantCache::get_node(uint64_t tenant_id, const bool replace) -{ - int ret = OB_SUCCESS; - ObDITenantCollect *tenant_collect = nullptr; - ObTenantBucket &bucket = di_map_[tenant_id % MAX_TENANT_NODE_NUM]; - if (OB_SUCCESS == (ret = bucket.get_the_node(tenant_id, tenant_collect))) { - last_access_time_++; - tenant_collect->last_access_time_ = last_access_time_; - } else { - tenant_collect = add_node(tenant_id, replace); - } - return tenant_collect; -} -template -int ObDIBaseTenantCache::get_cache_iter(ObDIBaseTenantCacheIterator &cache_iter) const -{ - cache_iter.reset(); - return cache_iter.init(collects_, MAX_TENANT_NODE_NUM); -} - -template -ObDITenantCollect *ObDIBaseTenantCache::add_node(uint64_t tenant_id, const bool replace) -{ - ObDITenantCollect *tenant_collect = nullptr; - int64_t pos = -1; - uint64_t last_access_time = last_access_time_; - for (int64_t i = 1; i < MAX_TENANT_NODE_NUM; i++) {//0 is reserve for sys - if (0 == collects_[i].last_access_time_) { - pos = i; - break; - } else if (replace) { - if (collects_[i].last_access_time_ < last_access_time) { - pos = i; - last_access_time = collects_[i].last_access_time_; - } - } - } - if (-1 != pos) { - if (0 != collects_[pos].last_access_time_) { - del_node(collects_[pos].tenant_id_); - } - last_access_time_++; - collects_[pos].tenant_id_ = tenant_id; - collects_[pos].last_access_time_ = last_access_time_; - collects_[pos].base_value_.reset(); - ObTenantBucket &bucket = di_map_[tenant_id % MAX_TENANT_NODE_NUM]; - bucket.list_.add_last(&collects_[pos]); - tenant_collect = &collects_[pos]; - } - return tenant_collect; -} - -template -int ObDIBaseTenantCache::del_node(uint64_t tenant_id) -{ - int ret = OB_SUCCESS; - ObTenantBucket &bucket = di_map_[tenant_id % MAX_TENANT_NODE_NUM]; - ObDITenantCollect *collect = NULL; - if (OB_SUCCESS == (ret = bucket.get_the_node(tenant_id, collect))) { - bucket.list_.remove(collect); - collect->last_access_time_ = 0; - } - return ret; -} - -template -void ObDIBaseTenantCache::get_the_diag_info( - uint64_t tenant_id, - ObDiagnoseTenantInfo &diag_infos) -{ - for (int64_t i = 0; i < MAX_TENANT_NODE_NUM; i++) { - if (0 != collects_[i].last_access_time_ && tenant_id == collects_[i].tenant_id_) { - diag_infos.add(collects_[i].base_value_); - break; - } - } -} - }// end namespace common } #endif /* OB_DI_CACHE_H_ */ diff --git a/deps/oblib/src/lib/stat/ob_diagnose_info.cpp b/deps/oblib/src/lib/stat/ob_diagnose_info.cpp index c959d70389..c10c53c1ec 100644 --- a/deps/oblib/src/lib/stat/ob_diagnose_info.cpp +++ b/deps/oblib/src/lib/stat/ob_diagnose_info.cpp @@ -15,6 +15,9 @@ #include "lib/stat/ob_diagnose_info.h" #include "lib/stat/ob_session_stat.h" #include "lib/ash/ob_active_session_guard.h" +#include "share/ash/ob_active_sess_hist_list.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { @@ -24,29 +27,19 @@ namespace common * -----------------------------------------------------------ObLatchStat------------------------------------------------------ */ ObLatchStat::ObLatchStat() - : addr_(0), - id_(0), - level_(0), - hash_(0), - gets_(0), - misses_(0), - sleeps_(0), - immediate_gets_(0), - immediate_misses_(0), - spin_gets_(0), - wait_time_(0) + : gets_(0), + misses_(0), + sleeps_(0), + immediate_gets_(0), + immediate_misses_(0), + spin_gets_(0), + wait_time_(0) { } int ObLatchStat::add(const ObLatchStat &other) { int ret = OB_SUCCESS; - if (0 == addr_) { - addr_ = other.addr_; - id_ = other.id_; - level_ = other.level_; - hash_ = other.hash_; - } gets_ += other.gets_; misses_ += other.misses_; sleeps_ += other.sleeps_; @@ -59,10 +52,6 @@ int ObLatchStat::add(const ObLatchStat &other) void ObLatchStat::reset() { - addr_ = 0; - id_ = 0; - level_ = 0; - hash_ = 0; gets_ = 0; misses_ = 0; sleeps_ = 0; @@ -99,6 +88,9 @@ int ObLatchStatArray::add(const ObLatchStatArray &other) auto *item = get_or_create_item(i); if (OB_NOT_NULL(item)) { ret = item->add(*other.get_item(i)); + } else { + ret = OB_ALLOCATE_MEMORY_FAILED; + break; } } return ret; @@ -115,7 +107,7 @@ void ObLatchStatArray::reset() } static constexpr int NODE_NUM = - common::hash::NodeNumTraits::NODE_NUM; + common::hash::NodeNumTraits::NODE_NUM; using LatchStatAlloc = hash::SimpleAllocer; LatchStatAlloc &get_latch_stat_alloc() @@ -189,11 +181,20 @@ int ObWaitEventHistoryIter::init(ObWaitEventDesc *items, const int64_t start_pos int ObWaitEventHistoryIter::get_next(ObWaitEventDesc *&item) { int ret = OB_SUCCESS; - if (curr_ >= item_cnt_) { + if (curr_ >= item_cnt_ || curr_ >= SESSION_WAIT_HISTORY_CNT) { ret = OB_ITER_END; } else { item = &items_[(start_pos_ - curr_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT]; curr_++; + if (!item->is_valid()) { + LOG_WARN("wait event desc is invalid", K(ret), K(item->event_no_)); + if (OB_FAIL(get_next(item))) { + if (ret != OB_ITER_END) { + LOG_WARN("failed to get next wait event desc"); + } + } + } + } return ret; } @@ -225,6 +226,8 @@ int ObWaitEventHistory::push(const int64_t event_no, const uint64_t timeout_ms, int ret = OB_SUCCESS; if (event_no < 0) { ret = OB_INVALID_ARGUMENT; + } else if (nest_cnt_ >= 1) { + ret = OB_ARRAY_OUT_OF_RANGE; } else if (nest_cnt_ >= SESSION_WAIT_HISTORY_CNT) { ++nest_cnt_; } else { @@ -359,6 +362,7 @@ int ObWaitEventHistory::get_last_wait(ObWaitEventDesc *&item) item = &items_[(curr_pos_ - cnt - 1 + N) % N]; } else { ret = OB_ERR_UNEXPECTED; + LOG_WARN("get last wait failed", K(cnt), K_(item_cnt), K_(curr_pos), K_(nest_cnt), K_(current_wait)); } } return ret; @@ -438,13 +442,13 @@ void ObWaitEventHistory::reset() } ObDiagnoseSessionInfo::ObDiagnoseSessionInfo() - : curr_wait_(), - max_wait_(NULL), - total_wait_(NULL), - event_history_(), - event_stats_(), - stat_add_stats_(), - tenant_id_(0) + : curr_wait_(), + max_wait_(NULL), + total_wait_(NULL), + event_history_(), + event_stats_(), + stat_add_stats_(), + tenant_id_(0) { } @@ -491,96 +495,6 @@ ObWaitEventDesc &ObDiagnoseSessionInfo::get_curr_wait() return *event_desc; } -int ObDiagnoseSessionInfo::notify_wait_begin(const int64_t event_no, const uint64_t timeout_ms, const uint64_t p1, const uint64_t p2, const uint64_t p3, const bool is_atomic) -{ - int ret = OB_SUCCESS; - if (event_no < 0) { - ret = OB_INVALID_ARGUMENT; - } else { - if (!is_atomic) { - ObActiveSessionGuard::get_stat().event_no_ = event_no; - ObActiveSessionGuard::get_stat().id_++; - } - if (OB_FAIL(event_history_.push(event_no, timeout_ms, p1, p2, p3))) { - } - } - return ret; -} - -int ObDiagnoseSessionInfo::notify_wait_end(ObDiagnoseTenantInfo *tenant_info, const bool is_atomic) -{ - int ret = OB_SUCCESS; - lock_.wrlock(); - ObWaitEventDesc *event_desc = NULL; - - if (OB_FAIL(event_history_.get_accord_event(event_desc))) { - //NOTICE: allow OB_ARRAY_OUT_OF_RANGE here, no warning. by duoqiao - ret = OB_ARRAY_OUT_OF_RANGE; - } else if (OB_ISNULL(event_desc)) { - ret = OB_ERR_UNEXPECTED; - } else { - event_history_.calc_wait_time(event_desc); - if ((0 == event_desc->level_ || is_atomic) && 0 != event_desc->wait_time_) { - if (NULL != max_wait_ && !is_atomic) { - if (event_desc->wait_time_ >= max_wait_->wait_time_) { - *max_wait_ = *event_desc; - } - } - if (NULL != total_wait_ && !is_atomic) { - total_wait_->time_waited_ += event_desc->wait_time_; - ++total_wait_->total_waits_; - } - ObWaitEventStat *event_stat = event_stats_.get(event_desc->event_no_); - ObWaitEventStat *tenant_event_stat = tenant_info->get_event_stats().get(event_desc->event_no_); - if (NULL != event_stat && NULL != tenant_event_stat) { - event_stat->total_waits_++; - tenant_event_stat->total_waits_++; - event_stat->time_waited_ += event_desc->wait_time_; - tenant_event_stat->time_waited_ += event_desc->wait_time_; - if (event_desc->timeout_ms_ > 0 && event_desc->wait_time_ > static_cast(event_desc->timeout_ms_) * 1000) { - event_stat->total_timeouts_++; - tenant_event_stat->total_timeouts_++; - } - if (event_desc->wait_time_ > static_cast(event_stat->max_wait_)) { - event_stat->max_wait_ = event_desc->wait_time_; - } - if (event_desc->wait_time_ > static_cast(tenant_event_stat->max_wait_)) { - tenant_event_stat->max_wait_ = event_desc->wait_time_; - } - } - } - - switch (OB_WAIT_EVENTS[event_desc->event_no_].wait_class_) { - case ObWaitClassIds::CONCURRENCY:{ - EVENT_ADD(ObStatEventIds::CCWAIT_TIME, event_desc->wait_time_); - break; - } - case ObWaitClassIds::USER_IO:{ - EVENT_ADD(ObStatEventIds::USER_IO_WAIT_TIME, event_desc->wait_time_); - break; - } - case ObWaitClassIds::APPLICATION:{ - EVENT_ADD(ObStatEventIds::APWAIT_TIME, event_desc->wait_time_); - break; - } - case ObWaitClassIds::SCHEDULER:{ - EVENT_ADD(ObStatEventIds::SCHEDULE_WAIT_TIME, event_desc->wait_time_); - break; - } - default: - break; - } - if (!is_atomic) { - //LOG_ERROR("XXXX: end wait", "id", ObActiveSessionGuard::get_stat().id_, - // K(event_desc->wait_time_), K(event_desc->event_no_)); - ObActiveSessionGuard::get_stat().fixup_last_stat(*event_desc); - ObActiveSessionGuard::get_stat().event_no_ = 0; - } - } - lock_.unlock(); - return ret; -} - int ObDiagnoseSessionInfo::inc_stat(const int16_t stat_no) { int ret = OB_SUCCESS; @@ -607,19 +521,7 @@ int ObDiagnoseSessionInfo::update_stat(const int16_t stat_no, const int64_t delt return ret; } -inline int ObDiagnoseSessionInfo::set_max_wait(ObWaitEventDesc *max_wait) -{ - max_wait_ = max_wait; - return OB_SUCCESS; -} - -inline int ObDiagnoseSessionInfo::set_total_wait(ObWaitEventStat *total_wait) -{ - total_wait_ = total_wait; - return OB_SUCCESS; -} - -inline int ObDiagnoseSessionInfo::set_tenant_id(uint64_t tenant_id) +int ObDiagnoseSessionInfo::set_tenant_id(uint64_t tenant_id) { int ret = OB_SUCCESS; if (0 < tenant_id && tenant_id < UINT32_MAX) { @@ -630,24 +532,6 @@ inline int ObDiagnoseSessionInfo::set_tenant_id(uint64_t tenant_id) return ret; } -ObDiagnoseSessionInfo *ObDiagnoseSessionInfo::get_local_diagnose_info() -{ - ObDiagnoseSessionInfo *di = NULL; - if (lib::is_diagnose_info_enabled()) { - ObDISessionCollect *collect = NULL; - ObSessionDIBuffer *buffer = NULL; - buffer = GET_TSI(ObSessionDIBuffer); - if (NULL != buffer) { - collect = buffer->get_curr_session(); - if (NULL != collect) { - di = &(collect->base_value_); - di->set_tenant_id(buffer->get_tenant_id()); - } - } - } - return di; -} - ObDiagnoseTenantInfo::ObDiagnoseTenantInfo(ObIAllocator *allocator) : event_stats_(), stat_add_stats_(), @@ -725,7 +609,6 @@ int ObDiagnoseTenantInfo::set_stat(const int16_t stat_no, const int64_t value) ret = OB_INVALID_ARGUMENT; } else { stat->stat_value_ = value; - stat->set_time_ = ObTimeUtility::current_time(); } return ret; } @@ -753,52 +636,15 @@ int ObDiagnoseTenantInfo::get_stat(const int16_t stat_no, int64_t &value) return ret; } -ObDiagnoseTenantInfo *ObDiagnoseTenantInfo::get_local_diagnose_info() +ObWaitEventGuard::ObWaitEventGuard(const int64_t event_no, const uint64_t timeout_ms, + const int64_t p1, const int64_t p2, const int64_t p3, const bool is_atomic) + : event_no_(0), di_(nullptr), is_atomic_(is_atomic) { - int ret = OB_SUCCESS; - ObDiagnoseTenantInfo *di = NULL; - if (lib::is_diagnose_info_enabled()) { - ObDITenantCollect *collect = NULL; - ObSessionDIBuffer *buffer = NULL; - buffer = GET_TSI(ObSessionDIBuffer); - if (NULL != buffer) { - if (NULL == (collect = buffer->get_curr_tenant())) { - if (OB_FAIL(buffer->switch_tenant(OB_SYS_TENANT_ID))) { - } else { - collect = buffer->get_curr_tenant(); - } - } - if (NULL != collect) { - di = &(collect->base_value_); - } - } - } - return di; -} - -ObWaitEventGuard::ObWaitEventGuard( - const int64_t event_no, - const uint64_t timeout_ms, - const int64_t p1, - const int64_t p2, - const int64_t p3, - const bool is_atomic) - : event_no_(0), - wait_begin_time_(0), - timeout_ms_(0), - di_(nullptr), - is_atomic_(is_atomic) -{ - if (oceanbase::lib::is_diagnose_info_enabled()) { - need_record_ = true; + di_ = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di_) && oceanbase::lib::is_diagnose_info_enabled() && + di_->get_ash_stat().is_active_session_) { need_record_ = true; event_no_ = event_no; - di_ = ObDiagnoseSessionInfo::get_local_diagnose_info(); - if (NULL != di_) { - di_->notify_wait_begin(event_no, timeout_ms, p1, p2, p3, is_atomic); - } else { - wait_begin_time_ = ObTimeUtility::current_time(); - timeout_ms_ = timeout_ms; - } + di_->begin_wait_event(event_no, timeout_ms, p1, p2, p3); } else { need_record_ = false; } @@ -806,96 +652,44 @@ ObWaitEventGuard::ObWaitEventGuard( ObWaitEventGuard::~ObWaitEventGuard() { - int64_t wait_time = 0; if (need_record_) { - ObDiagnoseTenantInfo *tenant_di = ObDiagnoseTenantInfo::get_local_diagnose_info(); - if (NULL != di_ && NULL != tenant_di) { - di_->notify_wait_end(tenant_di, is_atomic_); - } else if (NULL == di_ && NULL != tenant_di && 0 != wait_begin_time_) { - ObWaitEventStat *tenant_event_stat = tenant_di->get_event_stats().get(event_no_); - tenant_event_stat->total_waits_++; - wait_time = ObTimeUtility::current_time() - wait_begin_time_; - tenant_event_stat->time_waited_ += wait_time; - if (timeout_ms_ > 0 && wait_time > static_cast(timeout_ms_) * 1000) { - tenant_event_stat->total_timeouts_++; - } - if (wait_time > static_cast(tenant_event_stat->max_wait_)) { - tenant_event_stat->max_wait_ = wait_time; - } + ObDiagnosticInfo *curr_di = ObLocalDiagnosticInfo::get(); + if (di_ != curr_di) { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "diagnositc info mismatch", K(curr_di), K(di_)); + } + if (OB_NOT_NULL(curr_di)) { + curr_di->end_wait_event(event_no_, OB_WAIT_EVENTS[event_no_].wait_class_ == ObWaitClassIds::IDLE); } } } -ObMaxWaitGuard::ObMaxWaitGuard(ObWaitEventDesc *max_wait, ObDiagnoseSessionInfo *di) - : prev_wait_(NULL), di_(di) +ObMaxWaitGuard::ObMaxWaitGuard(ObWaitEventDesc *max_wait) + : prev_wait_(NULL), di_(nullptr) { - if (oceanbase::lib::is_diagnose_info_enabled()) { - need_record_ = true; - if (OB_LIKELY(NULL != max_wait)) { - max_wait->reset(); - if (OB_ISNULL(di_)) { - di_ = ObDiagnoseSessionInfo::get_local_diagnose_info(); - } - if (OB_LIKELY(NULL != di_)) { - prev_wait_ = di_->get_max_wait(); - di_->set_max_wait(max_wait); - } - } - } else { - need_record_ = false; - } } ObMaxWaitGuard::~ObMaxWaitGuard() { - if (need_record_ && OB_LIKELY(NULL != di_)) { - if (OB_LIKELY(NULL != prev_wait_)) { - ObWaitEventDesc *max_wait = di_->get_max_wait(); - if (NULL != max_wait) { - if (max_wait->wait_time_ > prev_wait_->wait_time_) { - *prev_wait_ = *max_wait; - } - di_->set_max_wait(prev_wait_); - } - } else { - di_->reset_max_wait(); - } - } } -ObTotalWaitGuard::ObTotalWaitGuard(ObWaitEventStat *total_wait, ObDiagnoseSessionInfo *di) - : prev_wait_(NULL), di_(di) +ObTotalWaitGuard::ObTotalWaitGuard(ObWaitEventStat *total_wait) + : total_wait_(total_wait), di_(nullptr) { - if (oceanbase::lib::is_diagnose_info_enabled()) { - need_record_ = true; - if (OB_LIKELY(NULL != total_wait)) { - total_wait->reset(); - if (OB_ISNULL(di_)) { - di_ = ObDiagnoseSessionInfo::get_local_diagnose_info(); - } - if (OB_LIKELY(NULL != di_)) { - prev_wait_ = di_->get_total_wait(); - di_->set_total_wait(total_wait); - } - } - } else { - need_record_ = false; + di_ = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di_)) { + di_->reset_total_wait(); } } ObTotalWaitGuard::~ObTotalWaitGuard() { - if (need_record_ && OB_LIKELY(NULL != di_)) { - if (OB_LIKELY(NULL != prev_wait_)) { - ObWaitEventStat *total_wait = di_->get_total_wait(); - if (NULL != total_wait) { - prev_wait_->total_waits_ += total_wait->total_waits_; - prev_wait_->time_waited_ += total_wait->time_waited_; - di_->set_total_wait(prev_wait_); - } - } else { - di_->reset_total_wait(); - } + if (OB_UNLIKELY(di_ != ObLocalDiagnosticInfo::get())) { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "diagnostic info switched wrongly.", KPC(di_), + K(ObLocalDiagnosticInfo::get())); + di_ = ObLocalDiagnosticInfo::get(); + } + if (OB_NOT_NULL(total_wait_) && OB_NOT_NULL(di_)) { + total_wait_->add(di_->get_total_wait()); } } diff --git a/deps/oblib/src/lib/stat/ob_diagnose_info.h b/deps/oblib/src/lib/stat/ob_diagnose_info.h index 776f128666..d22234bab7 100644 --- a/deps/oblib/src/lib/stat/ob_diagnose_info.h +++ b/deps/oblib/src/lib/stat/ob_diagnose_info.h @@ -20,6 +20,7 @@ #include "lib/utility/ob_print_utils.h" #include "lib/ob_lib_config.h" #include "lib/thread/thread.h" +// #include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { @@ -30,15 +31,17 @@ typedef ObStatArray ObWaitEventStatArray; typedef ObStatArray ObStatEventAddStatArray; typedef ObStatArray ObStatEventSetStatArray; +class ObDiagnosticInfo; + struct ObLatchStat { ObLatchStat(); int add(const ObLatchStat &other); void reset(); - uint64_t addr_; - uint64_t id_; - uint64_t level_; - uint64_t hash_; + // uint64_t addr_; + // uint64_t id_; + // uint64_t level_; + // uint64_t hash_; uint64_t gets_; uint64_t misses_; uint64_t sleeps_; @@ -48,12 +51,32 @@ struct ObLatchStat uint64_t wait_time_; }; +typedef ObStatArray ObStatLatchArray; + struct ObLatchStatArray { public: ObLatchStatArray(ObIAllocator *allocator = NULL); ~ObLatchStatArray(); int add(const ObLatchStatArray &other); + int add(ObStatLatchArray &other) + { + int ret = OB_SUCCESS; + ObLatchStat *cur = nullptr; + for (int i = 0; i < ObLatchIds::LATCH_END; i++) { + cur = other.get(i); + if (cur->gets_ || cur->spin_gets_) { + ObLatchStat *target = get_or_create_item(i); + if (OB_NOT_NULL(target)) { + ret = target->add(*cur); + } else { + ret = OB_ALLOCATE_MEMORY_FAILED; + break; + } + } + } + return ret; + } void reset(); ObLatchStat *get_item(int32_t idx) const { @@ -66,6 +89,16 @@ public: } return items_[idx]; } + void accumulate_to(ObStatLatchArray &array) + { + for (int64_t i = 0; i < ObLatchIds::LATCH_END; ++i) { + if (OB_ISNULL(items_[i])) { + } else { + array.get(i)->add(*items_[i]); + } + } + } + private: ObLatchStat *create_item(); void free_item(ObLatchStat *stat); @@ -102,7 +135,6 @@ public: int get_accord_event(ObWaitEventDesc *&event_desc); int calc_wait_time(ObWaitEventDesc *&event_desc); void reset(); -private: int get_next_and_compare(int64_t &iter_1, int64_t &iter_2, int64_t &cnt, const ObWaitEventHistory &other, ObWaitEventDesc *tmp); int64_t curr_pos_; int64_t item_cnt_; @@ -119,20 +151,20 @@ public: virtual ~ObDiagnoseSessionInfo(); int add(ObDiagnoseSessionInfo &other); void reset(); - int notify_wait_begin( - const int64_t event_no, - const uint64_t timeout_ms = 0, - const uint64_t p1 = 0, - const uint64_t p2 = 0, - const uint64_t p3 = 0, - const bool is_atomic = false); - int notify_wait_end(ObDiagnoseTenantInfo *tenant_info, const bool is_atomic = false); - int set_max_wait(ObWaitEventDesc *max_wait); - int set_total_wait(ObWaitEventStat *total_wait); + int set_max_wait(ObWaitEventDesc *max_wait) + { + max_wait_ = max_wait; + return OB_SUCCESS; + } + + int set_total_wait(ObWaitEventStat *total_wait) + { + total_wait_ = total_wait; + return OB_SUCCESS; + } ObWaitEventDesc &get_curr_wait(); int inc_stat(const int16_t stat_no); int update_stat(const int16_t stat_no, const int64_t delta); - static ObDiagnoseSessionInfo *get_local_diagnose_info(); inline ObWaitEventHistory &get_event_history() { return event_history_; } inline ObWaitEventStatArray &get_event_stats() { return event_stats_; } inline ObStatEventAddStatArray &get_add_stat_stats() { return stat_add_stats_; } @@ -141,6 +173,14 @@ public: inline ObWaitEventDesc *get_max_wait() { return max_wait_; } inline ObWaitEventStat *get_total_wait() { return total_wait_; } inline bool is_valid() const { return tenant_id_ < UINT32_MAX; } + const ObWaitEventDesc &get_curr_wait() const + { + return curr_wait_; + }; + void set_curr_wait(ObWaitEventDesc &wait) + { + curr_wait_ = wait; + }; int set_tenant_id(uint64_t tenant_id); inline uint64_t get_tenant_id() { return tenant_id_; } TO_STRING_EMPTY(); @@ -169,7 +209,6 @@ public: int update_stat(const int16_t stat_no, const int64_t delta); int set_stat(const int16_t stat_no, const int64_t value); int get_stat(const int16_t stat_no, int64_t &value); - static ObDiagnoseTenantInfo *get_local_diagnose_info(); inline ObWaitEventStatArray &get_event_stats() { return event_stats_; } inline ObStatEventAddStatArray &get_add_stat_stats() { return stat_add_stats_; } inline ObStatEventSetStatArray &get_set_stat_stats() { return stat_set_stats_; } @@ -195,28 +234,30 @@ public: ~ObWaitEventGuard(); private: int64_t event_no_; - uint64_t wait_begin_time_; - uint64_t timeout_ms_; - ObDiagnoseSessionInfo *di_; + ObDiagnosticInfo *di_; bool is_atomic_; //Do you need statistics bool need_record_; }; +template class ObSleepEventGuard : public ObWaitEventGuard { public: - explicit ObSleepEventGuard( - const int64_t event_no, - const uint64_t timeout_ms, - const int64_t sleep_us - ) : ObWaitEventGuard(event_no, timeout_ms, sleep_us, 0, 0, false) + ObSleepEventGuard( + const int64_t sleep_us, + const uint64_t timeout_ms = 0 + ) : ObWaitEventGuard(EVENT_ID, timeout_ms, sleep_us, 0, 0) { lib::Thread::sleep_us_ = sleep_us; } - explicit ObSleepEventGuard( - const int64_t sleep_us = 0 - ) : ObWaitEventGuard(ObWaitEventIds::DEFAULT_SLEEP, 0, sleep_us, 0, 0, false) + ObSleepEventGuard( + const int64_t sleep_us, + const int64_t p1, + const int64_t p2, + const int64_t p3, + const uint64_t timeout_ms = 0 + ) : ObWaitEventGuard(EVENT_ID, timeout_ms, p1, p2, p3) { lib::Thread::sleep_us_ = sleep_us; } @@ -229,146 +270,44 @@ public: class ObMaxWaitGuard { public: - explicit ObMaxWaitGuard(ObWaitEventDesc *max_wait, ObDiagnoseSessionInfo *di = NULL); + explicit ObMaxWaitGuard(ObWaitEventDesc *max_wait); ~ObMaxWaitGuard(); + TO_STRING_KV(K_(prev_wait), K_(di), K_(need_record), K_(max_wait)); private: ObWaitEventDesc *prev_wait_; ObDiagnoseSessionInfo *di_; //Do you need statistics bool need_record_; + ObWaitEventDesc *max_wait_; }; class ObTotalWaitGuard { public: - explicit ObTotalWaitGuard(ObWaitEventStat *total_wait, ObDiagnoseSessionInfo *di = NULL); + explicit ObTotalWaitGuard(ObWaitEventStat *total_wait); ~ObTotalWaitGuard(); private: - ObWaitEventStat *prev_wait_; - ObDiagnoseSessionInfo *di_; - //Do you need statistics - bool need_record_; + ObWaitEventStat *total_wait_; + ObDiagnosticInfo *di_; }; } /* namespace common */ } /* namespace oceanbase */ - -#define EVENT_ADD(stat_no, value) \ - do { \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - if (oceanbase::common::OB_STAT_EVENTS[::oceanbase::common::ObStatEventIds::stat_no].summary_in_session_) { \ - oceanbase::common::ObDiagnoseSessionInfo *session_info \ - = oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); \ - if (NULL != session_info) { \ - session_info->update_stat(::oceanbase::common::ObStatEventIds::stat_no, value); \ - } \ - } \ - oceanbase::common::ObDiagnoseTenantInfo *tenant_info \ - = oceanbase::common::ObDiagnoseTenantInfo::get_local_diagnose_info(); \ - if (NULL != tenant_info) { \ - tenant_info->update_stat(::oceanbase::common::ObStatEventIds::stat_no, value); \ - } \ - } \ - } while(0) - -#define EVENT_TENANT_ADD(stat_no, value, tenant_id) \ - oceanbase::common::ObTenantStatEstGuard tenant_guard(tenant_id); \ - EVENT_ADD(stat_no, value); - -#define EVENT_INC(stat_no) EVENT_ADD(stat_no, 1) - -#define EVENT_TENANT_INC(stat_no, tenant_id) EVENT_TENANT_ADD(stat_no, 1, tenant_id) - -#define EVENT_DEC(stat_no) EVENT_ADD(stat_no, -1) - -#define EVENT_SET(stat_no, value) \ - do { \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - oceanbase::common::ObDiagnoseTenantInfo *diagnose_info \ - = oceanbase::common::ObDiagnoseTenantInfo::get_local_diagnose_info(); \ - if (NULL != diagnose_info) { \ - diagnose_info->set_stat(::oceanbase::common::ObStatEventIds::stat_no, value); \ - } \ - } \ - } while(0) - -#define EVENT_TENANT_SET(stat_no, value, tenant_id) \ - oceanbase::common::ObTenantStatEstGuard tenant_guard(tenant_id); \ - EVENT_SET(stat_no, value); - -#define WAIT_EVENT_GET(stat_no) \ - ({ \ - uint64_t ret = 0; \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - oceanbase::common::ObDiagnoseSessionInfo *session_info \ - = oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); \ - if (NULL != session_info) { \ - oceanbase::common::ObWaitEventStat *stat \ - = session_info->get_event_stats().get( \ - ::oceanbase::common::ObWaitEventIds::stat_no); \ - if (NULL != stat) { \ - ret = stat->time_waited_; \ - } \ - } \ - } \ - ret; \ - }) - -#define EVENT_GET(stat_no, session_info) \ - ({ \ - int64_t ret = 0; \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - if (OB_LIKELY(oceanbase::common::stat_no < oceanbase::common::ObStatEventIds::STAT_EVENT_ADD_END)) { \ - oceanbase::common::ObStatEventAddStat *stat \ - = session_info->get_add_stat_stats().get(::oceanbase::common::stat_no); \ - if (OB_LIKELY(NULL != stat)) { \ - ret = stat->get_stat_value(); \ - } \ - } \ - } \ - ret; \ - }) - -#define WAIT_BEGIN(stat_no, ...) \ - do { \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - oceanbase::common::ObDiagnoseSessionInfo *di \ - = oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); \ - if (di) { \ - di->notify_wait_begin( \ - oceanbase::common::ObWaitEventIds::stat_no, ## __VA_ARGS__); \ - } \ - } \ +#define SLEEP(time) \ + do { \ + oceanbase::common::ObSleepEventGuard \ + wait_guard(((int64_t)time) * 1000 * 1000); \ + ::sleep(time); \ } while (0) - -#define WAIT_END(stat_no) \ - do { \ - if (oceanbase::lib::is_diagnose_info_enabled()) { \ - oceanbase::common::ObDiagnoseSessionInfo *di \ - = oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); \ - oceanbase::common::ObDiagnoseTenantInfo *tenant_di \ - = oceanbase::common::ObDiagnoseTenantInfo::get_local_diagnose_info(); \ - if (NULL != di && NULL != tenant_di) { \ - di->notify_wait_end(tenant_di); \ - } \ - } \ +#define USLEEP(time) \ + do { \ + oceanbase::common::ObSleepEventGuard \ + wait_guard((int64_t)time); \ + ::usleep(time); \ } while (0) -#define SLEEP(time) \ - do { \ - oceanbase::common::ObSleepEventGuard wait_guard(((int64_t)time) * 1000 * 1000); \ - ::sleep(time); \ - } while (0) - -#define USLEEP(time) \ - do { \ - oceanbase::common::ObSleepEventGuard wait_guard((int64_t)time); \ - ::usleep(time); \ - } while (0) - - #define GLOBAL_EVENT_GET(stat_no) \ ({ \ int64_t ret = 0; \ diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info.cpp b/deps/oblib/src/lib/stat/ob_diagnostic_info.cpp new file mode 100644 index 0000000000..7363c0b100 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info.cpp @@ -0,0 +1,284 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include "lib/stat/ob_diagnostic_info.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnostic_info_util.h" +#include "lib/objectpool/ob_server_object_pool.h" +#include "lib/time/ob_tsc_timestamp.h" + +namespace oceanbase +{ +namespace common +{ + +int64_t ObListWaitEventStat::to_string(char *buf, const int64_t buf_len) const +{ + int64_t pos = 0; + J_KV(K_(event_no), K_(total_waits), K_(total_timeouts), K_(time_waited), K_(max_wait)); + return pos; +} + +ObWaitEventContainer::ObWaitEventContainer() + : rule_(ObWaitEventRule::LIST), list_(), array_(nullptr), pool_(nullptr) +{} + +int ObWaitEventContainer::init(ObWaitEventPool *pool) +{ + int ret = OB_SUCCESS; + OB_ASSERT(pool != nullptr); + pool_ = pool; + list_.reset(); + return ret; +} + +int ObWaitEventContainer::get_and_set( + oceanbase::common::ObWaitEventIds::ObWaitEventIdEnum event_no, ObWaitEventStat *&event) +{ + int ret = OB_SUCCESS; + OB_ASSERT(pool_ != nullptr); + if (OB_FAIL(get(event_no, event))) { + if (ret == OB_ITEM_NOT_SETTED) { + ret = OB_SUCCESS; + if (OB_LIKELY(rule_ == ObWaitEventRule::LIST)) { + int list_size = 0; + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ != 0) { + list_size++; + } + } + if (OB_UNLIKELY(list_size >= WAIT_EVENT_LIST_THRESHOLD)) { + // need to switch list to array. + if (OB_ISNULL(pool_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + ObWaitEventStatArray *array = pool_->borrow_object(); + if (OB_ISNULL(array)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + array_ = array; + copy_list_stat_to_array(); + rule_ = ObWaitEventRule::ARRAY; + event = array_->get(event_no); + OB_ASSERT(event != nullptr); + // For simplicity, we don't free list_'s memory till this ObWaitEventContainer end of + // life. + } + } + } else { + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ == 0) { + cur_event->event_no_ = event_no; + event = static_cast(cur_event); + break; + } + } + OB_ASSERT(event != nullptr); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("rule should be LIST", K(rule_)); + } + } else { + // Error happened, return err code. + } + } else { + // Event stat already exist. Do noting + } + return ret; +} + +int ObWaitEventContainer::get( + oceanbase::common::ObWaitEventIds::ObWaitEventIdEnum event_no, ObWaitEventStat *&event) +{ + int ret = OB_ITEM_NOT_SETTED; + OB_ASSERT(event_no > 0 && event_no < WAIT_EVENTS_TOTAL); + if (OB_LIKELY(rule_ == ObWaitEventRule::LIST)) { + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ == event_no) { + event = static_cast(cur_event); + ret = OB_SUCCESS; + break; + } + } + } else { + event = array_->get(event_no); + ret = OB_SUCCESS; + } + return ret; +} + +void ObWaitEventContainer::for_each(const std::function &fn) +{ + if (OB_LIKELY(rule_ == ObWaitEventRule::LIST)) { + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ != 0) { + fn(cur_event->event_no_, *static_cast(cur_event)); + } + } + } else { + for (int i = ObWaitEventIds::NULL_EVENT + 1; i < ObWaitEventIds::WAIT_EVENT_DEF_END; i++) { + const ObWaitEventStat *cur = array_->get(static_cast(i)); + if (cur->is_valid()) { + fn(static_cast(i), *cur); + } + } + } +} + +void ObWaitEventContainer::accumulate_to(ObWaitEventStatArray &target) +{ + if (OB_LIKELY(rule_ == ObWaitEventRule::LIST)) { + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ != 0) { + target.get(cur_event->event_no_)->add(*static_cast(cur_event)); + } + } + } else { + target.add(*array_); + } +} + +void ObWaitEventContainer::copy_list_stat_to_array() +{ + for (int i = 0; i < WAIT_EVENT_LIST_THRESHOLD; i++) { + ObListWaitEventStat *cur_event = list_.get(i); + if (cur_event->event_no_ != 0) { + ObWaitEventStat *cur = array_->get(cur_event->event_no_); + cur->add(*static_cast(cur_event)); + } + } +} + +void ObWaitEventContainer::reset() +{ + list_.reset(); + if (nullptr != array_) { + OB_ASSERT(pool_ != nullptr); + pool_->return_object(array_); + } + array_ = nullptr; + rule_ = ObWaitEventRule::LIST; +} + +ObDiagnosticInfo::~ObDiagnosticInfo() +{ + if (need_aggregate_) { + ObLocalDiagnosticInfo::aggregate_diagnostic_info_summary(this); + } +} + +int ObDiagnosticInfo::init( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObWaitEventPool &pool) +{ + int ret = OB_SUCCESS; + tenant_id_ = tenant_id; + group_id_ = group_id; + session_id_ = session_id; + ash_stat_.tenant_id_ = tenant_id; + ash_stat_.group_id_ = group_id_; + ash_stat_.session_id_ = session_id; + //By default, the proxy_sid is consistent with the server session id. + //If this is a genuine proxy connection, the proxy_sid will be corrected by the deliver_mysql_request interface + ash_stat_.proxy_sid_ = session_id; + ash_stat_.last_touch_ts_ = rdtsc(); + ash_stat_.last_inactive_ts_ = ash_stat_.last_touch_ts_; + pool_ = &pool; + events_.init(pool_); + return ret; +} + +// for wait event begins when is_active_session_ = false. +void ObDiagnosticInfo::inner_begin_wait_event(const int64_t event_no, const uint64_t timeout_ms, + const uint64_t p1, const uint64_t p2, const uint64_t p3) +{ + const int64_t cur_event_no = ash_stat_.event_no_; + if (cur_event_no == 0) { + // TODO(roland.qk): unify wait event record source. + ash_stat_.set_event(event_no, p1, p2, p3); + curr_wait_.reset(); + curr_wait_.event_no_ = event_no; + curr_wait_.p1_ = p1; + curr_wait_.p2_ = p2; + curr_wait_.p3_ = p3; + curr_wait_.timeout_ms_ = timeout_ms; + curr_wait_.wait_begin_time_ = rdtsc(); + ash_stat_.wait_event_begin_ts_ = curr_wait_.wait_begin_time_; + } else { + // do noting + } +} + +void ObDiagnosticInfo::begin_wait_event(const int64_t event_no, const uint64_t timeout_ms, + const uint64_t p1, const uint64_t p2, const uint64_t p3) +{ + if (ash_stat_.is_active_session_) { + inner_begin_wait_event(event_no, timeout_ms, p1, p2, p3); + } +} + +void ObDiagnosticInfo::end_wait_event(const int64_t event_no, const bool is_idle) +{ + int ret = OB_SUCCESS; + const int cur_event_no = ash_stat_.event_no_; + if (cur_event_no == event_no) { + curr_wait_.wait_end_time_ = rdtsc(); + curr_wait_.wait_time_ = (curr_wait_.wait_end_time_ - curr_wait_.wait_begin_time_) * 1000 / + lib_get_cpu_khz(); + // TODO(roland.qk): unify wait event record source. + const int64_t cur_wait_time = (curr_wait_.wait_end_time_ - ash_stat_.wait_event_begin_ts_) * 1000 / + lib_get_cpu_khz(); + if (!is_idle) { + ash_stat_.total_non_idle_wait_time_ += cur_wait_time; + } else { + ash_stat_.total_idle_wait_time_ += cur_wait_time; + } + + ObWaitEventDesc desc; + desc.event_no_ = event_no; + desc.p1_ = ash_stat_.p1_; + desc.p2_ = ash_stat_.p2_; + desc.p3_ = ash_stat_.p3_; + ash_stat_.fixup_last_stat(desc); + + ash_stat_.reset_event(); + total_wait_.time_waited_ += curr_wait_.wait_time_; + ++total_wait_.total_waits_; + ObWaitEventStat *event_record = nullptr; + if (OB_FAIL(events_.get_and_set( + static_cast(event_no), event_record))) { + LOG_WARN("failed to retrive wait event record", K(ret), K(event_no)); + } else { + event_record->time_waited_ += curr_wait_.wait_time_; + ++event_record->total_waits_; + event_record->max_wait_ = + std::max(static_cast(event_record->max_wait_), curr_wait_.wait_time_); + if (curr_wait_.timeout_ms_ > 0 && + (curr_wait_.wait_time_ > (static_cast(curr_wait_.timeout_ms_) * 1000))) { + ++event_record->total_timeouts_; + } + } + } else { + // do noting + } +} + +} /* namespace common */ +} /* namespace oceanbase */ diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info.h b/deps/oblib/src/lib/stat/ob_diagnostic_info.h new file mode 100644 index 0000000000..b99af59007 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info.h @@ -0,0 +1,361 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DIAGNOSTIC_INFO_H_ +#define OB_DIAGNOSTIC_INFO_H_ + +#include "lib/ash/ob_active_session_guard.h" +#include "lib/hash/ob_link_hashmap_deps.h" + +namespace oceanbase +{ + +namespace observer +{ +class ObSrvDeliver; +} + +namespace common +{ + +#define DI_INFO_OBJ_PER_CORE 256 +#define DI_INFO_OBJ_UPPER_LIMIT 8192 +#define WAIT_EVENT_LIST_THRESHOLD 10 + +class ObDiagnosticInfoSwitchGuard; + +template +class ObServerObjectPool; +class ObDiagnosticKey; +class ObDiagnosticInfoCollector; +class ObDiagnosticInfoSlot; + +typedef common::ObServerObjectPool ObWaitEventPool; + +struct ObListWaitEventStat : public ObWaitEventStat +{ + // adding event_no for list ObWaitClassList element + oceanbase::common::ObWaitEventIds::ObWaitEventIdEnum event_no_; + + ObListWaitEventStat() : ObWaitEventStat(), event_no_(ObWaitEventIds::NULL_EVENT) + {} + ObListWaitEventStat(const ObListWaitEventStat &stat) + { + this->event_no_ = stat.event_no_; + this->total_timeouts_ = stat.total_timeouts_; + this->max_wait_ = stat.max_wait_; + this->total_waits_ = stat.total_waits_; + this->time_waited_ = stat.time_waited_; + } + void operator=(const ObListWaitEventStat &) = delete; + int add(const ObListWaitEventStat &other) + { + int ret = OB_SUCCESS; + if (this->event_no_ == other.event_no_) { + ret = ObWaitEventStat::add(*static_cast(&other)); + } else { + ret = OB_ERR_UNEXPECTED; + } + return ret; + } + void reset() + { + event_no_ = ObWaitEventIds::NULL_EVENT; + ObWaitEventStat::reset(); + } + int64_t to_string(char *buf, const int64_t buf_len) const; +}; + +enum class ObWaitEventRule +{ + LIST = 0, + ARRAY, +}; + +class ObWaitEventContainer +{ +public: + ObWaitEventContainer(); + ~ObWaitEventContainer() + { + reset(); + } + DISABLE_COPY_ASSIGN(ObWaitEventContainer); + int get_and_set(ObWaitEventIds::ObWaitEventIdEnum event_no, ObWaitEventStat *&event); + int get(ObWaitEventIds::ObWaitEventIdEnum event_no, ObWaitEventStat *&event); + void for_each( + const std::function &fn); + void accumulate_to(ObWaitEventStatArray &target); + void reset(); + int init(ObWaitEventPool *pool); + +private: + void copy_list_stat_to_array(); + ObWaitEventRule rule_; + ObStatArray list_; + ObWaitEventStatArray *array_; + ObWaitEventPool *pool_; +}; + +struct SessionID +{ + int64_t session_id_; + + SessionID() : session_id_(0) + {} + + SessionID(const uint64_t session_id) : session_id_(session_id) + {} + + int64_t hash() const + { + return static_cast(session_id_); + } + int hash(uint64_t &hash_val) const + { + hash_val = hash(); + return OB_SUCCESS; + } + + int compare(const SessionID &other) const + { + int cmp_ret = 0; + + if (session_id_ > other.session_id_) { + cmp_ret = 1; + } else if (session_id_ < other.session_id_) { + cmp_ret = -1; + } else { + cmp_ret = 0; + } + + return cmp_ret; + } + + bool operator==(const SessionID &other) const + { + return 0 == compare(other); + } + bool operator!=(const SessionID &other) const + { + return !operator==(other); + } + bool operator<(const SessionID &other) const + { + return -1 == compare(other); + } + + void reset() + { + session_id_ = 0; + } + + TO_STRING_KV(K_(session_id)); +}; + +typedef common::LinkHashNode DiagnosticInfoHashNode; +typedef common::LinkHashValue DiagnosticInfoHashValue; + +class ObDiagnosticInfo : public DiagnosticInfoHashValue +{ +public: + friend class ObDiagnosticInfoSwitchGuard; + friend class ObLocalDiagnosticInfo; + ObDiagnosticInfo() + : pool_(nullptr), + summary_slot_(nullptr), + events_(), + stats_(), + curr_wait_(), + total_wait_(), + tenant_id_(0), + group_id_(0), + session_id_(0), + ref_cnt_(0), +#ifdef OB_UNITTEST + need_aggregate_(false), +#else + need_aggregate_(true), +#endif + ash_stat_() + {} + ~ObDiagnosticInfo(); + ObDiagnosticInfo(const ObDiagnosticInfo &) = delete; + void operator=(const ObDiagnosticInfo &) = delete; + const ObWaitEventContainer &get_event_stats() const + { + return events_; + } + ObWaitEventContainer &get_event_stats() + { + return events_; + } + const ObStatEventAddStatArray &get_add_stat_stats() const + { + return stats_; + } + ObStatEventAddStatArray &get_add_stat_stats() + { + return stats_; + } + void add_stat(ObStatEventIds::ObStatEventIdEnum stat_no, int64_t value) + { + OB_ASSERT(stat_no < ObStatEventIds::STAT_EVENT_ADD_END); + ObStatEventAddStat *stat = stats_.get(stat_no); + if (OB_NOT_NULL(stat)) { + stat->add(value); + } + } + void update_stat(const int16_t stat_no, const int64_t delta) + { + add_stat(static_cast(stat_no), delta); + } + int reuse(); + int init(int64_t tenant_id, int64_t group_id, int64_t session_id, ObWaitEventPool &pool); + int64_t get_tenant_id() const + { + return tenant_id_; + } + int64_t get_group_id() const + { + return group_id_; + } + int64_t get_session_id() const + { + return session_id_; + } + void set_summary_slot(ObDiagnosticInfoSlot *slot) + { + summary_slot_ = slot; + } + ObDiagnosticInfoSlot *get_summary_slot() const + { + return summary_slot_; + } + void begin_wait_event(const int64_t event_no, const uint64_t timeout_ms = 0, + const uint64_t p1 = 0, const uint64_t p2 = 0, const uint64_t p3 = 0); + void end_wait_event(const int64_t event_no, const bool is_idle = false); + inline ObActiveSessionStat &get_ash_stat() + { + return ash_stat_; + }; + void reset_total_wait() + { + total_wait_.reset(); + }; + const ObWaitEventStat &get_total_wait() const + { + return total_wait_; + }; + const ObWaitEventDesc &get_curr_wait() const + { + return curr_wait_; + }; + ObWaitEventDesc &get_curr_wait() + { + return curr_wait_; + }; + bool is_active_session() const + { + return ash_stat_.is_active_session_; + } + bool need_aggregate() const + { + return need_aggregate_; + }; + void set_aggregated() + { + need_aggregate_ = false; + }; + bool operator==(ObDiagnosticInfo &other) const + { + return this->tenant_id_ == other.tenant_id_ && this->session_id_ == other.session_id_ && + this->group_id_ == other.group_id_; + } + TO_STRING_KV(K_(tenant_id), K_(group_id), K_(session_id), K_(curr_wait), K_(ref_cnt), + K_(need_aggregate), K(get_uref()), K(get_href()), K_(ash_stat)); + +private: + friend class oceanbase::observer::ObSrvDeliver; + void inner_begin_wait_event(const int64_t event_no, const uint64_t timeout_ms = 0, + const uint64_t p1 = 0, const uint64_t p2 = 0, const uint64_t p3 = 0); + ObWaitEventPool *pool_; + ObDiagnosticInfoSlot *summary_slot_; // point to summary slot when acquire this object for + // performance. + ObWaitEventContainer events_; + ObStatEventAddStatArray stats_; + ObWaitEventDesc curr_wait_; + ObWaitEventStat total_wait_; + int64_t tenant_id_; + int64_t group_id_; + int64_t session_id_; + int ref_cnt_; + bool need_aggregate_; + ObActiveSessionStat ash_stat_; +}; + +#define MAX_DI_PER_TENANT 8192 + +template +class DiagnosticInfoValueAlloc +{ +public: + explicit DiagnosticInfoValueAlloc(ObFixedClassAllocator *alloc) + : alloc_count_(0), allocator_(alloc) + {} + ~DiagnosticInfoValueAlloc() + {} + T *alloc_value() + { + int ret = OB_SUCCESS; + T *di = NULL; + if (ATOMIC_LOAD(&alloc_count_) > MAX_DI_PER_TENANT) { + COMMON_LOG(INFO, "diagnostic info exceed upper limit"); + } else { + di = op_instance_alloc_args(allocator_, T); + if (di != nullptr) { + ATOMIC_INC(&alloc_count_); + } + } + return di; + } + + void free_value(T *di) + { + op_free(di); + ATOMIC_DEC(&alloc_count_); + } + + void free_node(common::LinkHashNode *node) + { + if (NULL != node) { + op_free(node); + node = NULL; + } + } + + common::LinkHashNode *alloc_node(T *value) + { + UNUSED(value); + return op_alloc(common::LinkHashNode); + } + TO_STRING_KV(K_(alloc_count)); + +private: + volatile int64_t alloc_count_; + ObFixedClassAllocator *allocator_; +}; + +} /* namespace common */ +} /* namespace oceanbase */ + +#endif /* OB_DIAGNOSTIC_INFO_H_ */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_container.cpp b/deps/oblib/src/lib/stat/ob_diagnostic_info_container.cpp new file mode 100644 index 0000000000..d773903ace --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_container.cpp @@ -0,0 +1,533 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnostic_info_util.h" +#include "lib/ob_lib_config.h" + +namespace oceanbase +{ +namespace common +{ + +inline int64_t calc_slot_num(int64_t cpu_count) +{ + constexpr int64_t DEFAULT_MAX_SLOT_NUM = 64; + constexpr int64_t DEFAULT_MIN_SLOT_NUM = 4; + // slot num is power of 2 + int64_t slot_num = + min(DEFAULT_MAX_SLOT_NUM, max(DEFAULT_MIN_SLOT_NUM /*lower bound*/, cpu_count * 2)); + int msb_pos = std::log2(slot_num); + if (std::pow(2, msb_pos) != slot_num) { + slot_num = std::pow(2, msb_pos + 1); + } + return slot_num; +} + +__attribute__((constructor)) void init_global_di_container() +{ + int ret = OB_SUCCESS; + // make static variable ObFixedClassAllocator construct before get_global_di_container + // so that it deconstruct after. + common::ObFixedClassAllocator> *inst_key = + common::ObFixedClassAllocator>::get( + "LinkHashNode"); + common::ObFixedClassAllocator> *inst_id = + common::ObFixedClassAllocator>::get( + "LinkHashNode"); + if (OB_FAIL(ObDiagnosticInfoContainer::get_global_di_container()->init(get_cpu_num()))) { + LOG_WARN("failed to init global di container", K(ret)); + } else { + LOG_INFO("init global di container success"); + } +} + +#define DI_DIFAULT_SLICE_COUNT 4 +#define DI_DEFAULT_ALLOCATOR_NWAY 8 + +ObDiagnosticInfoContainer::ObDiagnosticInfoContainer(int64_t tenant_id) + : is_inited_(false), + stop_(false), + tenant_id_(tenant_id), + di_allocator_(lib::ObMemAttr(tenant_id, "DiagnosticInfo"), DI_DEFAULT_ALLOCATOR_NWAY, + DI_DIFAULT_SLICE_COUNT), + di_collector_allocator_(lib::ObMemAttr(tenant_id, "DICollector"), DI_DEFAULT_ALLOCATOR_NWAY, + DI_DIFAULT_SLICE_COUNT), + wait_event_pool_(tenant_id, true, lib::is_mini_mode(), DI_DEFAULT_ALLOCATOR_NWAY), + summarys_(DiagnosticInfoValueAlloc( + &di_collector_allocator_)), + runnings_(tenant_id, DiagnosticInfoValueAlloc(&di_allocator_)) +{ + wait_event_pool_.init(); +} + +ObDiagnosticInfos::ObDiagnosticInfos( + DiagnosticInfoValueAlloc &value_alloc) + : di_infos_(value_alloc), mutex_(ObLatchIds::DI_ALLOCATE_LOCK) +{} + +int ObDiagnosticInfos::init(int64_t tenant_id) +{ + return di_infos_.init("DiagnosticInfos", tenant_id); +} + +int ObDiagnosticInfos::allocate_diagnostic_info(int64_t tenant_id, int64_t group_id, + int64_t session_id, ObWaitEventPool &pool, ObDiagnosticInfo *&di_info) +{ + int ret = OB_SUCCESS; + SessionID sess_id(session_id); + { + // lib::ObMutexGuard guard(mutex_); + ret = di_infos_.create(sess_id, di_info); + } + if (OB_FAIL(ret)) { + LOG_WARN("failed to create di info", K(ret), K(session_id), K(tenant_id), K(group_id)); + } else { + di_info->init(tenant_id, group_id, session_id, pool); + } + return ret; +} + +int ObDiagnosticInfos::delete_diagnostic_info(const ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + { + // lib::ObMutexGuard guard(mutex_); + ret = di_infos_.del(SessionID(di_info->get_session_id())); + } + if (OB_FAIL(ret)) { + LOG_WARN("failed to delete diagnostic info", KPC(di_info)); + } + } + return ret; +} + +int ObDiagnosticInfos::inc_ref(const ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + ObDiagnosticInfo *tmp_di = nullptr; + if (OB_FAIL(di_infos_.get(SessionID(di_info->get_session_id()), tmp_di))) { + LOG_WARN("failed to inc di ref", K(ret)); + } else { +#ifdef ENABLE_DEBUG_LOG + if (!(*di_info == *tmp_di)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("inc ref wrongly", K(di_info->get_session_id()), K(tmp_di->get_session_id()), + KPC(di_info), KPC(tmp_di)); + } else { + // do noting + } +#endif + } + } + return ret; +} + +void ObDiagnosticInfos::dec_ref(ObDiagnosticInfo *di_info) +{ + di_infos_.revert(di_info); +} + +int ObDiagnosticInfos::for_each( + const std::function &fn) +{ + return di_infos_.for_each(fn); +} + +int ObDiagnosticInfos::get_session_diag_info(int64_t session_id, ObDISessionCollect &diag_info) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfo *tmp_di = nullptr; + if (OB_FAIL(di_infos_.get(SessionID(session_id), tmp_di))) { + LOG_WARN("failed to get session diag info", K(ret), KPC(this)); + } else { + tmp_di->get_event_stats().accumulate_to(diag_info.base_value_.get_event_stats()); + diag_info.base_value_.get_add_stat_stats().add(tmp_di->get_add_stat_stats()); + } + return ret; +} + +ObRunningDiagnosticInfoContainer::ObRunningDiagnosticInfoContainer( + int64_t tenant_id, DiagnosticInfoValueAlloc value_alloc) + : tenant_id_(tenant_id), + slot_mask_(0), + slot_count_(0), + is_inited_(false), + value_alloc_(value_alloc), + buffer_(nullptr) +{} + +ObRunningDiagnosticInfoContainer::~ObRunningDiagnosticInfoContainer() +{ + if (OB_NOT_NULL(buffer_)) { + for (int i = 0; i < slot_count_; i++) { + buffer_[i].~ObDiagnosticInfos(); + } + ob_free(buffer_); + buffer_ = nullptr; + } +} + +int ObRunningDiagnosticInfoContainer::init(int cpu_cnt) +{ + int ret = OB_SUCCESS; + if (is_inited_) { + ret = OB_INIT_TWICE; + } else { + int64_t slot_num = calc_slot_num(cpu_cnt); + slot_mask_ = slot_num - 1; + slot_count_ = slot_num; + int64_t size = sizeof(ObDiagnosticInfos) * slot_num; + ObMemAttr attr(tenant_id_, "DI_CONTAINER"); + buffer_ = static_cast(ob_malloc(size, attr)); + if (nullptr == buffer_) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate di collector memory", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < slot_num; i++) { + ObDiagnosticInfos *tmp = new (&buffer_[i]) ObDiagnosticInfos(value_alloc_); + if (OB_FAIL(tmp->init(tenant_id_))) { + LOG_WARN("failed to init di infos", K(i), K_(tenant_id)); + } + } + if (OB_SUCC(ret)) { + is_inited_ = true; + LOG_INFO("Successfully init diagnostic info collector", K(slot_num)); + } else { + ob_free(buffer_); + buffer_ = nullptr; + } + } + } + return ret; +} + +int ObRunningDiagnosticInfoContainer::allocate_diagnostic_info(int64_t tenant_id, int64_t group_id, + int64_t session_id, ObWaitEventPool &pool, ObDiagnosticInfo *&di_info) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + lib::ObDisableDiagnoseGuard g; + const int64_t target_slot = session_id & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + if (OB_FAIL(buffer_[target_slot].allocate_diagnostic_info( + tenant_id, group_id, session_id, pool, di_info))) { + LOG_WARN("failed to allocate di info", K(ret), K(tenant_id)); + } + } + return ret; +} + +int ObRunningDiagnosticInfoContainer::delete_diagnostic_info(const ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + lib::ObDisableDiagnoseGuard g; + const int64_t target_slot = di_info->get_session_id() & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + if (OB_FAIL(buffer_[target_slot].delete_diagnostic_info(di_info))) { + LOG_ERROR("failed to delete di info", K(ret), KPC(di_info)); + } + } + } + return ret; +} + +int ObRunningDiagnosticInfoContainer::inc_ref(const ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + const int64_t target_slot = di_info->get_session_id() & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + if (OB_FAIL(buffer_[target_slot].inc_ref(di_info))) { + LOG_WARN("failed to inc di info", K(ret), KPC(di_info)); + } + } + } + return ret; +} + +int ObRunningDiagnosticInfoContainer::dec_ref(ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + const int64_t target_slot = di_info->get_session_id() & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + buffer_[target_slot].dec_ref(di_info); + } + } + return ret; +} + +int ObRunningDiagnosticInfoContainer::for_each( + const std::function &fn) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + for (int i = 0; i < slot_count_; i++) { + if (OB_FAIL(buffer_[i].for_each(fn))) { + LOG_WARN("failed to iter over running di infos", K(ret)); + } + } + } + return ret; +} + +void ObRunningDiagnosticInfoContainer::reset() +{ + for (int i = 0; i < slot_count_; i++) { + buffer_[i].reset(); + } +} + +int ObRunningDiagnosticInfoContainer::get_session_diag_info( + int64_t session_id, ObDISessionCollect &diag_info) +{ + int ret = OB_SUCCESS; + if (!is_inited_) { + ret = OB_NOT_INIT; + LOG_WARN("get session diagnostic info before init!", K(ret)); + } else if (OB_ISNULL(buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to get running diagnostic info", K(ret), K(is_inited_)); + } else { + const int64_t target_slot = session_id & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + if (OB_FAIL(buffer_[target_slot].get_session_diag_info(session_id, diag_info))) { + if (OB_ENTRY_NOT_EXIST != ret) { + LOG_WARN("failed to get diagnostic info", K(ret)); + } else { + LOG_DEBUG("session not exist in current tenant", K(session_id), KPC(this)); + } + } + } + return ret; +} + +int64_t ObRunningDiagnosticInfoContainer::size() const +{ + int64_t size = 0; + if (!is_inited_) { + LOG_WARN_RET(OB_SUCCESS, "get session diagnostic info before init!", K(ret)); + } else { + for (int i = 0; i < slot_count_; i++) { + size += buffer_[i].size(); + } + } + return size; +} + +int ObDiagnosticInfoContainer::init(int64_t cpu_cnt) +{ + int ret = OB_SUCCESS; + if (is_inited_) { + ret = OB_INIT_TWICE; + LOG_WARN("double init", K_(tenant_id)); + } else { + if (OB_FAIL(runnings_.init(cpu_cnt))) { + LOG_WARN("failed to init running container", K(ret)); + } else if (OB_FAIL(summarys_.init(cpu_cnt))) { + LOG_WARN("failed to init summary container", K(ret)); + } else { + is_inited_ = true; + } + } + return ret; +} + +int ObDiagnosticInfoContainer::acquire_diagnostic_info( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfo *&di_info) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoSlot *slot = nullptr; + if (stop_) { + ret = OB_TENANT_NOT_IN_SERVER; + if (REACH_TIME_INTERVAL(5 * 1000 * 1000)) { + LOG_WARN("tenant is stopped", K(ret), K(tenant_id), K(group_id), K(session_id)); + } + } else if (OB_FAIL(runnings_.allocate_diagnostic_info(tenant_id, group_id, session_id, + ObDiagnosticInfoContainer::get_global_di_container()->get_wait_event_pool(), + di_info))) { + LOG_WARN("failed to allocate new diagnostic info", K(ret), K(tenant_id), K(group_id), + K(session_id), K(di_info)); + } else { + if (OB_FAIL(summarys_.get_di_slot(tenant_id, group_id, session_id, slot))) { + LOG_WARN("failed to acquire summary slot", K(ret), K(tenant_id), K(group_id), K(session_id), + K(di_info)); + ret = OB_SUCCESS; + } + di_info->set_summary_slot(slot); + } + return ret; +} + +int ObDiagnosticInfoContainer::aggregate_diagnostic_info_summary(ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + if (di_info->need_aggregate()) { + if (OB_FAIL(summarys_.add_diagnostic_info(*di_info))) { + LOG_WARN("failed to add summary info", KPC(di_info)); + } else { + di_info->set_aggregated(); + } + } + } + return ret; +} + +int ObDiagnosticInfoContainer::return_diagnostic_info(ObDiagnosticInfo *di_info) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_info)) { + int64_t tenant_id = di_info->get_tenant_id(); + if (OB_FAIL(runnings_.delete_diagnostic_info(di_info))) { + LOG_WARN("failed to return diagnostic info", KPC(di_info)); + } else { + } + } + return ret; +} + +int ObDiagnosticInfoContainer::inc_ref(ObDiagnosticInfo *di) +{ + return runnings_.inc_ref(di); +} + +void ObDiagnosticInfoContainer::dec_ref(ObDiagnosticInfo *di) +{ + runnings_.dec_ref(di); +} + +void ObDiagnosticInfoContainer::revert_diagnostic_info(ObDiagnosticInfo *di) +{ + dec_ref(di); +} + +int ObDiagnosticInfoContainer::mtl_new(ObDiagnosticInfoContainer *&container) +{ + int ret = OB_SUCCESS; + void *buf = nullptr; + container = nullptr; + if (is_virtual_tenant_id(LIB_MTL_ID())) { + // do nothing + } else if (OB_ISNULL(buf = ob_malloc(sizeof(ObDiagnosticInfoContainer), + ObMemAttr(LIB_MTL_ID(), "DI_CONTAINER")))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc di container", K(ret), K(LIB_MTL_ID())); + } else { + container = new (buf) ObDiagnosticInfoContainer(LIB_MTL_ID()); + } + return ret; +} + +int ObDiagnosticInfoContainer::mtl_init(ObDiagnosticInfoContainer *&container) +{ + int ret = OB_SUCCESS; + int64_t tenant_cpu_count = lib_mtl_cpu_count(); + if (OB_NOT_NULL(container)) { + const uint64_t tenant_id = LIB_MTL_ID(); + if (OB_ISNULL(container)) { + if (is_virtual_tenant_id(tenant_id)) { + // do nothing + } else { + ret = OB_INVALID_ARGUMENT; + } + } else if (OB_FAIL(container->init(tenant_cpu_count))) { + LOG_WARN("mtl init di container failed", K(tenant_id)); + } else { + container->di_allocator_.set_nway(tenant_cpu_count); + container->di_collector_allocator_.set_nway(tenant_cpu_count); + LOG_INFO("mtl init di container success", K(tenant_id), KPC(container)); + } + } + return ret; +} + +void ObDiagnosticInfoContainer::mtl_wait(ObDiagnosticInfoContainer *&container) +{ + if (container != NULL) { + container->stop(); + while (container->get_running_size() != 0) { + LOG_WARN_RET(OB_NEED_RETRY, "tenant di is not empty", + K(container->get_running_size()), KPC(container)); + ob_usleep(1000 * 1000); + } + } + LOG_INFO("success to wait tenant diagnostic info container", KPC(container)); +} + +void ObDiagnosticInfoContainer::mtl_destroy(ObDiagnosticInfoContainer *&container) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(container)) { + container->~ObDiagnosticInfoContainer(); + ob_free(container); + container = nullptr; + LOG_INFO("mtl destroy di container success", K(LIB_MTL_ID())); + } +} + +int ObDiagnosticInfoContainer::get_session_diag_info( + int64_t session_id, ObDISessionCollect &diag_info) +{ + int ret = OB_SUCCESS; + if (!is_inited_) { + ret = OB_NOT_INIT; + LOG_WARN("get session diagnostic info before init", K(ret)); + } else if (OB_FAIL(runnings_.get_session_diag_info(session_id, diag_info))) { + } + return ret; +} + +void ObDiagnosticInfoContainer::purge_tenant_summary(int64_t tenant_id) +{ + int ret = OB_SUCCESS; + std::function fn = + [tenant_id](const ObDiagnosticKey &key, ObDiagnosticInfoCollector *collector) -> bool { + bool bret = false; + if (key.get_tenant_id() == tenant_id) { + bret = true; + } + return bret; + }; + if (OB_FAIL(summarys_.remove_if(fn))) { + LOG_WARN("failed to remove summary collects", K(ret), K(tenant_id)); + } else { + LOG_INFO("success to remove summary collects", K(tenant_id), KPC(this)); + } +} + +} /* namespace common */ +} /* namespace oceanbase */ diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_container.h b/deps/oblib/src/lib/stat/ob_diagnostic_info_container.h new file mode 100644 index 0000000000..274ba6dc02 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_container.h @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DIAGNOSTIC_INFO_CONTAINER_H_ +#define OB_DIAGNOSTIC_INFO_CONTAINER_H_ + +#include "lib/stat/ob_diagnostic_info_summary.h" +#include "lib/objectpool/ob_server_object_pool.h" + +namespace oceanbase +{ +namespace common +{ + +class ObRunningDiagnosticInfoContainer; +class ObDISessionCollect; + +typedef common::ObServerObjectPool ObWaitEventPool; + +class ObDiagnosticInfos +{ +public: + typedef ObLinkHashMap> + ObDiInfos; + ObDiagnosticInfos(DiagnosticInfoValueAlloc &value_alloc); + // no need to call di_infos_.reset() because every di element should call del() before this + // destructor. + ~ObDiagnosticInfos() = default; + DISABLE_COPY_ASSIGN(ObDiagnosticInfos); + int init(int64_t tenant_id); + int allocate_diagnostic_info(int64_t tenant_id, int64_t group_id, int64_t session_id, + ObWaitEventPool &pool, ObDiagnosticInfo *&di_info); + int delete_diagnostic_info(const ObDiagnosticInfo *di_info); + int inc_ref(const ObDiagnosticInfo *di_info); + void dec_ref(ObDiagnosticInfo *di_info); + int for_each(const std::function &fn); + int64_t size() const + { + return di_infos_.size(); + }; + void reset() + { + di_infos_.destroy(); + } + TO_STRING_KV(K(size())); + +private: + friend class ObRunningDiagnosticInfoContainer; + int get_session_diag_info(int64_t session_id, ObDISessionCollect &diag_info); + ObDiInfos di_infos_; + lib::ObMutex mutex_; +}; + +class ObRunningDiagnosticInfoContainer +{ +public: + explicit ObRunningDiagnosticInfoContainer( + int64_t tenant_id, DiagnosticInfoValueAlloc value_alloc); + ~ObRunningDiagnosticInfoContainer(); + DISABLE_COPY_ASSIGN(ObRunningDiagnosticInfoContainer); + int init(int cpu_cnt); + int allocate_diagnostic_info(int64_t tenant_id, int64_t group_id, int64_t session_id, + ObWaitEventPool &pool, ObDiagnosticInfo *&di_info); + int delete_diagnostic_info(const ObDiagnosticInfo *di_info); + int inc_ref(const ObDiagnosticInfo *di_info); + int dec_ref(ObDiagnosticInfo *di_info); + int for_each(const std::function &fn); + int64_t size() const; + TO_STRING_KV(K_(tenant_id), K_(slot_count), K_(slot_mask), K_(is_inited)); + int get_session_diag_info(int64_t session_id, ObDISessionCollect &diag_info); + void reset(); + +private: + int64_t tenant_id_; + int64_t slot_mask_; + int64_t slot_count_; + bool is_inited_; + DiagnosticInfoValueAlloc value_alloc_; + ObDiagnosticInfos *buffer_; +}; + +class ObDiagnosticInfoContainer +{ +public: + friend class ObTenantDiagnosticInfoSummaryGuard; + friend class ObBackGroundSessionGuard; + friend class ObLocalDiagnosticInfo; + explicit ObDiagnosticInfoContainer(int64_t tenant_id); + ~ObDiagnosticInfoContainer() + { + stop(); + }; + DISABLE_COPY_ASSIGN(ObDiagnosticInfoContainer); + int init(int64_t cpu_cnt); + // NOTICE: after acquire, need to revert and return di_info accordingly. + int acquire_diagnostic_info( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfo *&di_info); + void revert_diagnostic_info(ObDiagnosticInfo *di); + int for_each_running_di(std::function &fn) + { + return runnings_.for_each(fn); + } + bool is_inited() const + { + return is_inited_; + } + static int mtl_new(ObDiagnosticInfoContainer *&container); + static int mtl_init(ObDiagnosticInfoContainer *&container); + static void mtl_wait(ObDiagnosticInfoContainer *&container); + static void mtl_destroy(ObDiagnosticInfoContainer *&container); + TO_STRING_KV(K_(is_inited), K_(tenant_id), K_(runnings), K_(summarys)); + + // WARN: only use this on observer bootstrap phase. + static ObDiagnosticInfoContainer *get_global_di_container() + { + static ObDiagnosticInfoContainer dic(OB_SYS_TENANT_ID); + return &dic; + } + // used to reset global di container when observer elegant exit. + static void clear_global_di_container() + { + if (get_global_di_container()->is_inited()) { + get_global_di_container()->stop(); + get_global_di_container()->summarys_.reset(); + get_global_di_container()->runnings_.reset(); + COMMON_LOG(INFO, "clear global di container"); + } + } + ObBaseDiagnosticInfoSummary &get_base_summary() + { + return summarys_; + } + int get_session_diag_info(int64_t session_id, ObDISessionCollect &diag_info); + // only needed for global_di_container + void purge_tenant_summary(int64_t tenant_id); + int64_t get_running_size() const + { + return runnings_.size(); + }; + void stop() + { + stop_ = true; + }; + ObWaitEventPool &get_wait_event_pool() + { + return wait_event_pool_; + }; + +private: + int aggregate_diagnostic_info_summary(ObDiagnosticInfo *di_info); + int return_diagnostic_info(ObDiagnosticInfo *di_info); + int inc_ref(ObDiagnosticInfo *di); + void dec_ref(ObDiagnosticInfo *di); + bool is_inited_; + bool stop_; + int64_t tenant_id_; + ObFixedClassAllocator di_allocator_; + ObFixedClassAllocator di_collector_allocator_; + // NOTICE: do not alter order for below 3 elements(pool/summarys/runnings). + ObWaitEventPool wait_event_pool_; + ObBaseDiagnosticInfoSummary summarys_; + ObRunningDiagnosticInfoContainer runnings_; +}; + +} /* namespace common */ +} /* namespace oceanbase */ + +#endif /* OB_DIAGNOSTIC_INFO_CONTAINER_H_ */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.cpp b/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.cpp new file mode 100644 index 0000000000..e085a81b92 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.cpp @@ -0,0 +1,380 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include "lib/stat/ob_diagnostic_info_guard.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/ob_lib_config.h" +#include "sql/session/ob_sql_session_info.h" + +namespace oceanbase +{ +namespace common +{ + +ObBackGroundSessionGuard::ObBackGroundSessionGuard(int64_t tenant_id, int64_t group_id) + : di_(nullptr), prev_value_(lib::ObPerfModeGuard::get_tl_instance()), dic_(nullptr) +{ + if (oceanbase::lib::is_diagnose_info_enabled()) { + if (tenant_id == OB_INVALID_TENANT_ID || tenant_id == OB_SERVER_TENANT_ID || + tenant_id == OB_DTL_TENANT_ID) { + tenant_id = OB_SYS_TENANT_ID; + } + int ret = OB_SUCCESS; + const int64_t bg_sess_id = ObBackgroundSessionIdGenerator::get_instance().get_next_sess_id(); + if (ObDiagnosticInfoContainer::get_global_di_container()->is_inited()) { + // using global di for all background sessions. because when the tenant is dropped there could + // be some tenant thread is left. like TXXXX_UnitGC thread when mtl_wait is called. + dic_ = ObDiagnosticInfoContainer::get_global_di_container(); + } else { + ret = OB_ERR_UNEXPECTED; + lib::ObPerfModeGuard::get_tl_instance() = true; + LOG_ERROR_RET(OB_SUCCESS, "no diagnostic info resource for background session", K(tenant_id), + K(group_id)); + } + + if (OB_FAIL(ret)) { + } else if (OB_FAIL(dic_->acquire_diagnostic_info(tenant_id, group_id, bg_sess_id, di_))) { + LOG_ERROR("failed to allocate diagnostic info object", K(ret), K(tenant_id), K(bg_sess_id), + K(group_id)); + di_ = nullptr; + lib::ObPerfModeGuard::get_tl_instance() = true; + } else { + OB_ASSERT(di_ != nullptr); + di_->get_ash_stat().session_id_ = bg_sess_id; + di_->get_ash_stat().tenant_id_ = tenant_id; + di_->get_ash_stat().session_type_ = ObActiveSessionStatItem::SessionType::BACKGROUND; + di_->get_ash_stat().set_sess_active(); + ObLocalDiagnosticInfo::setup_diagnostic_info(di_); + ObLocalDiagnosticInfo::set_thread_name(ob_get_tname()); + LOG_DEBUG("acquired new diagnostic info for background session", K(tenant_id), K(group_id), + K(bg_sess_id), K(lbt())); + } + } else { + di_ = nullptr; + lib::ObPerfModeGuard::get_tl_instance() = true; + } +} + +ObBackGroundSessionGuard::~ObBackGroundSessionGuard() +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di_)) { + di_->get_ash_stat().set_sess_inactive(); + ObLocalDiagnosticInfo::reset_diagnostic_info(); + // background diagnostic info only attach to current thread. + dic_->revert_diagnostic_info(di_); + // event if aggregate failed, still try to return it. + if (OB_FAIL(dic_->return_diagnostic_info(di_))) { + LOG_ERROR("failed to return diagnostic info", KPC(di_), K(dic_)); + } + } + + lib::ObPerfModeGuard::get_tl_instance() = prev_value_; +} + +ObLocalDiagnosticInfo::ObLocalDiagnosticInfo() + : di_ptr_(nullptr), slot_(nullptr) +{} + +int ObLocalDiagnosticInfo::aggregate_diagnostic_info_summary(ObDiagnosticInfo *di) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di)) { + if (OB_NOT_NULL(di->get_summary_slot())) { + di->get_summary_slot()->accumulate_diagnostic_info(*di); + } else { + const int64_t tenant_id = di->get_tenant_id(); + lib_mtl_switch(tenant_id, [&ret, &di, tenant_id](int switch_ret) -> void { + if (OB_SUCC(switch_ret)) { + if (OB_NOT_NULL(MTL_DI_CONTAINER()) && OB_FAIL(MTL_DI_CONTAINER()->aggregate_diagnostic_info_summary(di))) { + LOG_WARN("failed to aggregate diagnostic info", KPC(di)); + } else { + // do noting + } + } else { + LOG_ERROR("aggregate diagnostic info failed", K(tenant_id), KPC(di)); + } + }); + } + } + return ret; +} + +int ObLocalDiagnosticInfo::revert_diagnostic_info(ObDiagnosticInfo *di) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di)) { + const int64_t tenant_id = di->get_tenant_id(); + lib_mtl_switch(tenant_id, [&ret, &di, tenant_id](int switch_ret) -> void { + if (OB_SUCC(switch_ret)) { + ObDiagnosticInfoContainer *c = MTL_DI_CONTAINER(); + c->revert_diagnostic_info(di); + } else { + LOG_ERROR("return diagnostic info failed", K(tenant_id), KPC(di)); + } + }); + } + return ret; +} + +int ObLocalDiagnosticInfo::return_diagnostic_info(ObDiagnosticInfo *di) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di)) { + const int64_t tenant_id = di->get_tenant_id(); + const int64_t session_id = di->get_session_id(); + lib_mtl_switch(tenant_id, [&ret, &di, tenant_id, session_id](int switch_ret) -> void { + if (OB_SUCC(switch_ret)) { + ObDiagnosticInfoContainer *c = MTL_DI_CONTAINER(); + if (OB_FAIL(c->return_diagnostic_info(di))) { + LOG_WARN("failed to return diagnostic info", KPC(di)); + } else { + // do noting + LOG_DEBUG("return diagnostic info object", K(session_id), K(tenant_id)); + } + } else { + LOG_ERROR("return diagnostic info failed", K(tenant_id), KPC(di)); + } + }); + } + return ret; +} + +int ObLocalDiagnosticInfo::dec_ref(ObDiagnosticInfo *di) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di)) { + if (0 == ATOMIC_SAF(&di->ref_cnt_, 1)) { + // only last caller dec ref. + lib::ObDisableDiagnoseGuard disable_guard; + const int64_t tenant_id = di->get_tenant_id(); + lib_mtl_switch(tenant_id, [&ret, &di, tenant_id](int switch_ret) -> void { + if (OB_SUCC(switch_ret)) { + MTL_DI_CONTAINER()->dec_ref(di); + } else { + LOG_ERROR("dec diagnostic info ref failed", K(tenant_id), KPC(di)); + } + }); + } + } + return ret; +} + +void ObLocalDiagnosticInfo::set_thread_name(const char *name) +{ + ObDiagnosticInfo *di = get(); + if (OB_NOT_NULL(di)) { + MEMMOVE(di->get_ash_stat().program_, name, + oceanbase::OB_THREAD_NAME_BUF_LEN); + di->get_ash_stat().program_[oceanbase::OB_THREAD_NAME_BUF_LEN] = '\0'; + } + +} + +void ObLocalDiagnosticInfo::set_thread_name(uint64_t tenant_id, const char *name) +{ + ObDiagnosticInfo *di = get(); + if (OB_NOT_NULL(di)) { + if (tenant_id == 0) { + snprintf(di->get_ash_stat().program_, ASH_PROGRAM_STR_LEN, "%s", name); + } else { + snprintf(di->get_ash_stat().program_, ASH_PROGRAM_STR_LEN, + "T%ld_%s", tenant_id, name); + } + } +} + +void ObLocalDiagnosticInfo::set_service_action(const char *program, const char *module, const char *action) +{ + ObDiagnosticInfo *di = get(); + if (OB_NOT_NULL(di)) { + set_thread_name(ob_get_tenant_id(), program); + snprintf(di->get_ash_stat().module_, ASH_MODULE_STR_LEN, "%s", module); + snprintf(di->get_ash_stat().action_, ASH_ACTION_STR_LEN, "%s", action); + } +} + +ObLatchStat *ObLocalDiagnosticInfo::get_latch_stat(int64_t latch_id) +{ + ObLocalDiagnosticInfo &instance = get_instance(); + ObDiagnosticInfoSlot *slot = instance.slot_; + ObLatchStat *ptr = nullptr; + if (OB_UNLIKELY(nullptr != slot)) { + ptr = slot->get_latch_stat(latch_id); + } + return ptr; +} + +ObTenantDiagnosticInfoSummaryGuard::ObTenantDiagnosticInfoSummaryGuard( + int64_t tenant_id, int64_t group_id, bool using_global) + : need_restore_slot_(false), prev_slot_(nullptr) +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (oceanbase::lib::is_diagnose_info_enabled() && OB_NOT_NULL(di)) { + int ret = OB_SUCCESS; + ObDiagnosticInfoSlot *slot = nullptr; + lib::ObDisableDiagnoseGuard disable_guard; + if (di->get_tenant_id() == tenant_id && + di->get_group_id() == group_id) { + slot = di->get_summary_slot(); + } + if (slot == nullptr) { + if (tenant_id != OB_INVALID_TENANT_ID && tenant_id != OB_SERVER_TENANT_ID && + tenant_id != OB_DTL_TENANT_ID) { + if (using_global) { + ObDiagnosticInfoContainer *c = ObDiagnosticInfoContainer::get_global_di_container(); + if (OB_FAIL(c->summarys_.get_di_slot( + tenant_id, group_id, di->get_session_id(), slot))) { + LOG_WARN("failed to get summary slot", K(ret), K(tenant_id), K(group_id)); + } else { + // get slot successfully + } + } else { + lib_mtl_switch( + tenant_id, [&ret, &di, &slot, tenant_id, group_id](int switch_ret) -> void { + if (OB_SUCC(switch_ret)) { + if (OB_FAIL(MTL_DI_CONTAINER()->summarys_.get_di_slot( + tenant_id, group_id, di->get_session_id(), slot))) { + LOG_WARN("failed to get summary slot", K(ret), K(tenant_id), K(group_id)); + } else { + // get slot successfully + } + } else { + LOG_WARN("failed to switch to tenant diagnostic info summary mode", K(ret), + K(tenant_id), K(group_id), K(lbt())); + } + }); + } + } else { + ret = OB_ERROR; + } + } + if (OB_SUCC(ret)) { + need_restore_slot_ = true; + prev_slot_ = ObLocalDiagnosticInfo::get_instance().slot_; + ObLocalDiagnosticInfo::setup_di_slot(slot); + } + } +} + +ObTenantDiagnosticInfoSummaryGuard::ObTenantDiagnosticInfoSummaryGuard(ObDiagnosticInfoSlot *slot) + : need_restore_slot_(false), prev_slot_(nullptr) +{ + if (oceanbase::lib::is_diagnose_info_enabled()) { + if (OB_NOT_NULL(slot)) { + need_restore_slot_ = true; + prev_slot_ = ObLocalDiagnosticInfo::get_instance().slot_; + ObLocalDiagnosticInfo::setup_di_slot(slot); + } + } +} + +ObTenantDiagnosticInfoSummaryGuard::~ObTenantDiagnosticInfoSummaryGuard() +{ + if (need_restore_slot_) { + ObLocalDiagnosticInfo::setup_di_slot(prev_slot_); + } +} + +ObDiagnosticInfoSwitchGuard::ObDiagnosticInfoSwitchGuard(ObDiagnosticInfo *di) + : prev_di_(nullptr), + cur_di_(di), + di_switch_success_(false), +#ifdef ENABLE_DEBUG_LOG + leak_check_(false), +#endif + prev_value_(false) +{ + int ret = OB_SUCCESS; + if (oceanbase::lib::is_diagnose_info_enabled() && OB_NOT_NULL(di)) { + common::ObLocalDiagnosticInfo::inc_ref(di); + di_switch_success_ = true; + di->get_ash_stat().tid_ = GETTID(); + prev_di_ = ObLocalDiagnosticInfo::get(); + ObLocalDiagnosticInfo::setup_diagnostic_info(di); + cur_di_ = di; +#ifdef ENABLE_DEBUG_LOG + if (di->get_uref() - INT32_MAX / 2 > 10) { + LOG_ERROR_RET(OB_SUCCESS, "di switch after inc leak!", KPC(di), K(di)); + leak_check_ = true; + } +#endif + // 1 for rpc layer and 1 for this guard + if (2 == di->ref_cnt_) { + // first guard set session active. + cur_di_->get_ash_stat().set_sess_active(); + } + } else { + LOG_DEBUG("disable diagnostic info recording", K(ret), + K(oceanbase::lib::is_diagnose_info_enabled()), KPC(di)); + prev_value_ = lib::ObPerfModeGuard::get_tl_instance(); + lib::ObPerfModeGuard::get_tl_instance() = true; + } +} + +ObDiagnosticInfoSwitchGuard::~ObDiagnosticInfoSwitchGuard() +{ + int ret = OB_SUCCESS; + if (di_switch_success_) { + // 1 for rpc and 1 for this guard + if (2 == cur_di_->ref_cnt_) { + // last guard set session inactive + cur_di_->get_ash_stat().set_sess_inactive(); + } + if (OB_NOT_NULL(prev_di_)) { + ObLocalDiagnosticInfo::setup_diagnostic_info(prev_di_); + } else { + ObLocalDiagnosticInfo::reset_diagnostic_info(); + } +#ifdef ENABLE_DEBUG_LOG + if (leak_check_) { + LOG_ERROR("di switch before dec leak!", KPC(cur_di_), K(cur_di_)); + } +#endif + common::ObLocalDiagnosticInfo::dec_ref(cur_di_); + } else { + lib::ObPerfModeGuard::get_tl_instance() = prev_value_; + } +} + +ObRetryWaitEventInfoGuard::ObRetryWaitEventInfoGuard(sql::ObSQLSessionInfo &session) + : is_switch_(false), + parent_ptr_(nullptr) +{ + if (oceanbase::lib::is_diagnose_info_enabled()) { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + sql::ObQueryRetryASHDiagInfo * cur_ptr = session.get_retry_info_for_update().get_query_retry_ash_diag_info_ptr(); + if (di->get_ash_stat().get_retry_ash_diag_info_ptr() != cur_ptr) { + sql::ObQueryRetryASHDiagInfo *parent_ptr_ = di->get_ash_stat().get_retry_ash_diag_info_ptr(); + di->get_ash_stat().set_retry_ash_diag_info_ptr(cur_ptr); + is_switch_ = true; + } + } + } +} +ObRetryWaitEventInfoGuard::~ObRetryWaitEventInfoGuard() +{ + if (is_switch_) { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().set_retry_ash_diag_info_ptr(parent_ptr_); + } else { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "(SHOULD NEVER HAPPEN) di point to nullptr", K(di)); + } + } +} + +} /* namespace common */ +} /* namespace oceanbase */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.h b/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.h new file mode 100644 index 0000000000..665fdcf228 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_guard.h @@ -0,0 +1,285 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DIAGNOSTIC_INFO_GUARD_H_ +#define OB_DIAGNOSTIC_INFO_GUARD_H_ + +#include "lib/utility/ob_macro_utils.h" +#include "lib/wait_event/ob_wait_event.h" +#include "lib/statistic_event/ob_stat_event.h" +#include "lib/stat/ob_diagnostic_info.h" +#include "lib/stat/ob_diagnostic_info_summary.h" +#include "lib/wait_event/ob_inner_sql_wait_type.h" + +namespace oceanbase +{ + +#define GET_DIAGNOSTIC_INFO \ + if (oceanbase::common::ObLocalDiagnosticInfo::get() != nullptr) \ + oceanbase::common::ObLocalDiagnosticInfo::get() + +namespace observer +{ +class ObInnerSqlWaitGuard; +} +namespace sql +{ +class ObEndTransAsyncCallback; +} + +namespace common +{ + +class ObDiagnosticInfo; +class ObDiagnosticInfoSlot; +class ObDiagnosticInfoContainer; +class ObDiagnosticInfoSwitchGuard; +class ObLatchStat; + +class ObBackGroundSessionGuard +{ +public: + ObBackGroundSessionGuard(int64_t tenant_id, int64_t group_id); + ~ObBackGroundSessionGuard(); + +private: + ObDiagnosticInfo *di_; + bool prev_value_; + ObDiagnosticInfoContainer *dic_; +}; + +class ObLocalDiagnosticInfo +{ +public: + friend class ObTenantDiagnosticInfoSummaryGuard; + friend class ObDiagnosticInfoSwitchGuard; + friend class ObBackGroundSessionGuard; + friend class observer::ObInnerSqlWaitGuard; + friend class sql::ObEndTransAsyncCallback; + DISABLE_COPY_ASSIGN(ObLocalDiagnosticInfo); + // WARN: should check nullptr when call ObDiagnosticInfo::get(). + static inline ObDiagnosticInfo *get() + { + return get_instance().get_diagnostic_ptr(); + } + static int aggregate_diagnostic_info_summary(ObDiagnosticInfo *di); + static int revert_diagnostic_info(ObDiagnosticInfo *di); + static int return_diagnostic_info(ObDiagnosticInfo *di); + static inline void add_stat(ObStatEventIds::ObStatEventIdEnum stat_no, int64_t value) + __attribute__((always_inline)) + { + ObLocalDiagnosticInfo &instance = get_instance(); + ObDiagnosticInfoSlot *slot = instance.slot_; + if (OB_UNLIKELY(nullptr != slot)) { + slot->atomic_add_stat(stat_no, value); + } else { + ObDiagnosticInfo *di = instance.get_diagnostic_ptr(); + if (OB_NOT_NULL(di)) { + di->add_stat(stat_no, value); + } + } + } + static ObLatchStat *get_latch_stat(int64_t latch_id); + static void set_thread_name(const char *name); + static void set_thread_name(uint64_t tenant_id, const char *name); + static void set_service_action(const char *program, const char *module, const char *action); + static inline int inc_ref(ObDiagnosticInfo *di) __attribute__((always_inline)) + { + int ret = OB_SUCCESS; + if (OB_NOT_NULL(di)) { + ATOMIC_INC(&di->ref_cnt_); + } + return ret; + } + static int dec_ref(ObDiagnosticInfo *di); +private: + ObLocalDiagnosticInfo(); + ~ObLocalDiagnosticInfo() = default; + static inline ObLocalDiagnosticInfo &get_instance() + { + static thread_local ObLocalDiagnosticInfo di; + return di; + } + inline ObDiagnosticInfo *&get_diagnostic_ptr() + { + return di_ptr_; + } + static void setup_di_slot(ObDiagnosticInfoSlot *di_slot) + { + get_instance().slot_ = di_slot; + } + static void reset_di_slot() + { + get_instance().slot_ = nullptr; + } + static inline void reset_diagnostic_info() + { + get_instance().get_diagnostic_ptr() = nullptr; + } + static inline void setup_diagnostic_info(ObDiagnosticInfo *di) + { + if (OB_NOT_NULL(di)) { + get_instance().get_diagnostic_ptr() = di; + di->get_ash_stat().tid_ = GETTID(); + } else { + COMMON_LOG_RET(ERROR, OB_ERR_UNEXPECTED, "set nullptr to local diagnostic info", K(lbt())); + } + } + ObDiagnosticInfo *di_ptr_ CACHE_ALIGNED; + ObDiagnosticInfoSlot *slot_ CACHE_ALIGNED; +}; + +class ObTenantDiagnosticInfoSummaryGuard +{ +public: + explicit ObTenantDiagnosticInfoSummaryGuard(int64_t tenant_id, int64_t group_id = 0, + bool using_global = false /*ATTENTION: do not set this unless you know what you are doing*/); + explicit ObTenantDiagnosticInfoSummaryGuard(ObDiagnosticInfoSlot *slot); + ~ObTenantDiagnosticInfoSummaryGuard(); + DISABLE_COPY_ASSIGN(ObTenantDiagnosticInfoSummaryGuard); + +private: + bool need_restore_slot_; + ObDiagnosticInfoSlot *prev_slot_; +}; + +class ObDiagnosticInfoSwitchGuard +{ +public: + explicit ObDiagnosticInfoSwitchGuard(ObDiagnosticInfo *di); + ~ObDiagnosticInfoSwitchGuard(); + DISABLE_COPY_ASSIGN(ObDiagnosticInfoSwitchGuard); + +private: + ObDiagnosticInfo *prev_di_; + ObDiagnosticInfo *cur_di_; + bool di_switch_success_; +#ifdef ENABLE_DEBUG_LOG + bool leak_check_; +#endif + bool prev_value_; +}; + +class ObRetryWaitEventInfoGuard { +public: + ObRetryWaitEventInfoGuard(sql::ObSQLSessionInfo &session); + ~ObRetryWaitEventInfoGuard(); + +private: + bool is_switch_; + sql::ObQueryRetryASHDiagInfo *parent_ptr_; +}; + +#define DEF_ASH_FLAGS_SETTER_GUARD(ash_flag_type) \ + class ObActiveSession_##ash_flag_type##_FlagSetterGuard \ + { \ + public: \ + ObActiveSession_##ash_flag_type##_FlagSetterGuard() \ + { \ + GET_DIAGNOSTIC_INFO->get_ash_stat().ash_flag_type##_ = true; \ + } \ + ~ObActiveSession_##ash_flag_type##_FlagSetterGuard() \ + { \ + GET_DIAGNOSTIC_INFO->get_ash_stat().ash_flag_type##_ = false; \ + } \ + \ + private: \ + DISALLOW_COPY_AND_ASSIGN(ObActiveSession_##ash_flag_type##_FlagSetterGuard); \ + }; + +DEF_ASH_FLAGS_SETTER_GUARD(in_parse) +DEF_ASH_FLAGS_SETTER_GUARD(in_pl_parse) +DEF_ASH_FLAGS_SETTER_GUARD(in_get_plan_cache) +DEF_ASH_FLAGS_SETTER_GUARD(in_sql_optimize) +DEF_ASH_FLAGS_SETTER_GUARD(in_sql_execution) +DEF_ASH_FLAGS_SETTER_GUARD(in_px_execution) +DEF_ASH_FLAGS_SETTER_GUARD(in_sequence_load) +DEF_ASH_FLAGS_SETTER_GUARD(in_committing) +DEF_ASH_FLAGS_SETTER_GUARD(in_storage_read) +DEF_ASH_FLAGS_SETTER_GUARD(in_storage_write) +DEF_ASH_FLAGS_SETTER_GUARD(in_filter_rows) +DEF_ASH_FLAGS_SETTER_GUARD(in_rpc_encode) +DEF_ASH_FLAGS_SETTER_GUARD(in_rpc_decode) +DEF_ASH_FLAGS_SETTER_GUARD(in_connection_mgr) +DEF_ASH_FLAGS_SETTER_GUARD(in_check_row_confliction) + + +#undef DEF_ASH_FLAGS_SETTER_GUARD + +#define ACTIVE_SESSION_FLAG_SETTER_GUARD(ash_flag_type) \ + ObActiveSession_##ash_flag_type##_FlagSetterGuard _ash_flag_setter_guard; + +class ObASHSetInnerSqlWaitGuard { +public: + ObASHSetInnerSqlWaitGuard(ObInnerSqlWaitTypeId id) + { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + prev_id_ = di->get_ash_stat().inner_sql_wait_type_id_; + di->get_ash_stat().inner_sql_wait_type_id_ = id; + } + }; + ~ObASHSetInnerSqlWaitGuard() + { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().inner_sql_wait_type_id_ = prev_id_; + } + }; + +private: + ObInnerSqlWaitTypeId prev_id_; +}; + +} /* namespace common */ +} /* namespace oceanbase */ + +#define EVENT_ADD(stat_no, value) \ + do { \ + if (oceanbase::lib::is_diagnose_info_enabled()) { \ + ObLocalDiagnosticInfo::add_stat(oceanbase::common::ObStatEventIds::stat_no, value); \ + } \ + } while (0) + +#define EVENT_TENANT_ADD(stat_no, value, tenant_id) \ + oceanbase::common::ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); \ + EVENT_ADD(stat_no, value); + +#define EVENT_INC(stat_no) EVENT_ADD(stat_no, 1) + +#define EVENT_TENANT_INC(stat_no, tenant_id) EVENT_TENANT_ADD(stat_no, 1, tenant_id) + +#define EVENT_DEC(stat_no) EVENT_ADD(stat_no, -1) + +#define WAIT_BEGIN(event_no, timeout_ms, p1, p2, p3, is_atomic) \ + do { \ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); \ + if (oceanbase::lib::is_diagnose_info_enabled() && OB_NOT_NULL(di)) { \ + need_record_ = true; \ + di->begin_wait_event(event_no, timeout_ms, p1, p2, p3); \ + } else { \ + need_record_ = false; \ + } \ + } while (0) + +#define WAIT_END(event_no) \ + do { \ + if (need_record_) { \ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); \ + if (OB_NOT_NULL(di)) { \ + di->end_wait_event( \ + event_no, OB_WAIT_EVENTS[event_no].wait_class_ == ObWaitClassIds::IDLE); \ + } \ + } \ + } while (0) + +#endif /* OB_DIAGNOSTIC_INFO_GUARD_H_ */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.cpp b/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.cpp new file mode 100644 index 0000000000..000b448b67 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.cpp @@ -0,0 +1,360 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include "lib/stat/ob_diagnostic_info_summary.h" +#include "lib/stat/ob_diagnostic_info_util.h" +#include "lib/stat/ob_diagnose_info.h" +#include "common/ob_smart_var.h" + +namespace oceanbase +{ +namespace common +{ + +extern int64_t calc_slot_num(int64_t cpu_count); + +constexpr int64_t DEFAULT_SUMMARY_TIMEOUT = 50 * 1000; // in us + +ObDiagnosticInfoSlot::ObDiagnosticInfoSlot() + : events_(), stats_(), latch_stats_(), lock_(ObLatchIds::DI_SUMMARY_LOCK) +{} + +void ObDiagnosticInfoSlot::accumulate_diagnostic_info(ObDiagnosticInfo &di) +{ + int ret = OB_SUCCESS; + lib::ObDisableDiagnoseGuard g; + if (OB_SUCC(lock_.lock(DEFAULT_SUMMARY_TIMEOUT))) { + inner_accumuate_diagnostic_info(di); + lock_.unlock(); + } else { + LOG_WARN("lock was holding too long, proceed to accumulate diagnostic info without lock.", + K(lock_.get_wid())); + inner_accumuate_diagnostic_info(di); + } +} + +void ObDiagnosticInfoSlot::inner_accumuate_diagnostic_info(ObDiagnosticInfo &di) +{ + di.get_event_stats().accumulate_to(events_); + stats_.add(di.get_add_stat_stats()); +} + +ObDiagnosticInfoCollector::ObDiagnosticInfoCollector() + : tenant_id_(0), + group_id_(0), + slot_mask_(0), + slot_count_(0), + is_inited_(false), + di_info_bundle_(nullptr) +{} + +ObDiagnosticInfoCollector::~ObDiagnosticInfoCollector() +{ + if (OB_NOT_NULL(di_info_bundle_)) { + for (int i = 0; i < slot_count_; i++) { + di_info_bundle_[i].~ObDiagnosticInfoSlot(); + } + ob_free(di_info_bundle_); + di_info_bundle_ = nullptr; + LOG_INFO("destoy current di collector", KPC(this)); + } +} + +int ObDiagnosticInfoCollector::init(int cpu_cnt, int64_t tenant_id, int64_t group_id) +{ + int ret = OB_SUCCESS; + if (is_inited_) { + ret = OB_INIT_TWICE; + } else { + tenant_id_ = tenant_id; + group_id_ = group_id; + // slot num is power of 2 + int64_t slot_num = calc_slot_num(cpu_cnt); + + slot_mask_ = slot_num - 1; + slot_count_ = slot_num; + int64_t size = sizeof(ObDiagnosticInfoSlot) * slot_num; + ObMemAttr attr(tenant_id, "DiagnosticSum"); + di_info_bundle_ = static_cast(ob_malloc(size, attr)); + if (nullptr == di_info_bundle_) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate di collector memory", K(ret)); + } else { + for (int i = 0; i < slot_num; i++) { + new (&di_info_bundle_[i]) ObDiagnosticInfoSlot(); + } + is_inited_ = true; + LOG_INFO( + "Successfully init diagnostic info collector", K(slot_num), K(tenant_id), K(group_id)); + } + } + return ret; +} + +int ObDiagnosticInfoCollector::add_diagnostic_info(ObDiagnosticInfo &di) +{ + int ret = OB_SUCCESS; + OB_ASSERT(is_inited_); + const int64_t target_slot = di.get_session_id() & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + if (OB_NOT_NULL(di_info_bundle_)) { + di_info_bundle_[target_slot].accumulate_diagnostic_info(di); + } else { + LOG_WARN_RET(OB_SUCCESS, "di collector is null", K(is_inited_)); + } + return ret; +} + +void ObDiagnosticInfoCollector::get_all_events(ObWaitEventStatArray &arr) const +{ + OB_ASSERT(is_inited_); + if (OB_NOT_NULL(di_info_bundle_)) { + for (int i = 0; i < slot_count_; i++) { + arr.add(di_info_bundle_[i].get_events()); + } + } else { + LOG_WARN_RET(OB_SUCCESS, "di collector is null", K(is_inited_)); + } +} + +void ObDiagnosticInfoCollector::get_all_add_stats(ObStatEventAddStatArray &arr) const +{ + OB_ASSERT(is_inited_); + if (OB_NOT_NULL(di_info_bundle_)) { + for (int i = 0; i < slot_count_; i++) { + arr.add(di_info_bundle_[i].get_stats()); + } + } else { + LOG_WARN_RET(OB_SUCCESS, "di collector is null", K(is_inited_)); + } +} + +void ObDiagnosticInfoCollector::get_all_latch_stat(ObLatchStatArray &arr) const +{ + OB_ASSERT(is_inited_); + if (OB_NOT_NULL(di_info_bundle_)) { + for (int i = 0; i < slot_count_; i++) { + arr.add(di_info_bundle_[i].get_all_latch_stat()); + } + } else { + LOG_WARN_RET(OB_SUCCESS, "di collector is null", K(is_inited_)); + } +} + +ObDiagnosticInfoSlot *ObDiagnosticInfoCollector::get_slot(int64_t session_id) +{ + OB_ASSERT(is_inited_); + if (OB_NOT_NULL(di_info_bundle_)) { + const int64_t target_slot = session_id & slot_mask_; + OB_ASSERT(target_slot < slot_count_); + return &di_info_bundle_[target_slot]; + } else { + LOG_WARN_RET(OB_SUCCESS, "di collector is null", K(is_inited_)); + return nullptr; + } +} + +int ObBaseDiagnosticInfoSummary::add_diagnostic_info(ObDiagnosticInfo &di) +{ + int ret = OB_SUCCESS; + lib::ObDisableDiagnoseGuard g; + ObDiagnosticInfoCollector *collector = nullptr; + if (OB_FAIL(get_di_collector(di.get_tenant_id(), di.get_group_id(), collector))) { + LOG_WARN("fail to get di collector", K(ret), K(di)); + } else if (OB_NOT_NULL(collector)) { + if (OB_FAIL(collector->add_diagnostic_info(di))) { + LOG_WARN("failed to add di info", K(ret), K(di), KPC(collector)); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null di collector", K(di)); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::init(int64_t cpu_cnt) +{ + cpu_cnt_ = cpu_cnt; + return collectors_.init(); +} + +int ObBaseDiagnosticInfoSummary::get_tenant_event(int64_t tenant_id, ObWaitEventStatArray &arr) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + if (cur->get_tenant_id() == tenant_id) { + cur->get_all_events(arr); + } + iter.revert(cur); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_tenant_add_stats( + int64_t tenant_id, ObStatEventAddStatArray &arr) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + if (cur->get_tenant_id() == tenant_id) { + cur->get_all_add_stats(arr); + } + iter.revert(cur); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_tenant_latch_stat(int64_t tenant_id, ObLatchStatArray &arr) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + if (cur->get_tenant_id() == tenant_id) { + cur->get_all_latch_stat(arr); + } + iter.revert(cur); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_group_event(int64_t group_id, ObWaitEventStatArray &arr) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + if (cur->get_group_id() == group_id) { + cur->get_all_events(arr); + } + iter.revert(cur); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_group_add_stats(int64_t group_id, ObStatEventAddStatArray &arr) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + if (cur->get_group_id() == group_id) { + cur->get_all_add_stats(arr); + } + iter.revert(cur); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_di_slot( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfoSlot *&slot) +{ + int ret = OB_SUCCESS; + lib::ObDisableDiagnoseGuard g; + ObDiagnosticInfoCollector *collector = nullptr; + if (OB_FAIL(get_di_collector(tenant_id, group_id, collector))) { + LOG_WARN("fail to get di collector", K(ret), K(tenant_id), K(session_id), K(group_id)); + } else { + OB_ASSERT(collector != nullptr); + slot = collector->get_slot(session_id); + if (OB_ISNULL(slot)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("di slot is null"); + } + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::get_di_collector( + int64_t tenant_id, int64_t group_id, ObDiagnosticInfoCollector *&collector) +{ + int ret = OB_SUCCESS; + ObDiagnosticKey key(tenant_id, group_id); + if (OB_FAIL(collectors_.get(key, collector))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + { + lib::ObMutexGuard guard(mutex_); + if (OB_FAIL(collectors_.get(key, collector))) { + if (OB_ENTRY_NOT_EXIST == ret) { + if (OB_FAIL(collectors_.alloc_value(collector))) { + LOG_WARN("failed to allocate collector", K(ret)); + } else if (OB_ISNULL(collector)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate collector", K(ret)); + } else { + // init collector + if (OB_FAIL(collector->init(cpu_cnt_, tenant_id, group_id))) { + LOG_WARN( + "failed to init diagnostic info collector", K(ret), K(tenant_id), K(group_id)); + collectors_.free_value(collector); + collector = nullptr; + } else if (OB_FAIL(collectors_.insert_and_get(key, collector))) { + // free directly, cause value->hash_node_ is nullptr. + LOG_WARN("failed to insert and get diagnostic info collector", K(ret), K(tenant_id), + K(group_id), K(key), K(this)); + collectors_.free_value(collector); + collector = nullptr; + } else { + LOG_DEBUG("init new diagnostic collector", K(tenant_id), K(group_id), K(this), + K(collector), K(lbt())); + } + } + } + } else { + // concurrency insert. + } + } + } else { + LOG_WARN("failed to get di info", K(ret), K(collector)); + } + } + if (OB_SUCC(ret)) { + collectors_.revert(collector); + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::for_each_group( + std::function fn) +{ + int ret = OB_SUCCESS; + ObDiagnosticInfoCollector *cur = nullptr; + SummaryMap::Iterator iter(collectors_); + ObArenaAllocator arena; + ObIAllocator *alloc = static_cast(&arena); + HEAP_VAR(ObDiagnoseTenantInfo, tmp, alloc) + { + while (OB_SUCC(ret) && OB_NOT_NULL(iter.next(cur))) { + cur->get_all_events(tmp.get_event_stats()); + cur->get_all_add_stats(tmp.get_add_stat_stats()); + fn(cur->get_group_id(), tmp); + tmp.get_event_stats().reset(); + tmp.get_add_stat_stats().reset(); + iter.revert(cur); + } + } + return ret; +} + +int ObBaseDiagnosticInfoSummary::remove_if(std::function fn) +{ + return collectors_.remove_if(fn); +} + +} /* namespace common */ +} /* namespace oceanbase */ diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.h b/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.h new file mode 100644 index 0000000000..4231dc68b2 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_summary.h @@ -0,0 +1,204 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DIAGNOSTIC_SUMMARY_H_ +#define OB_DIAGNOSTIC_SUMMARY_H_ + +#include "lib/stat/ob_diagnostic_info.h" +#include "lib/hash/ob_link_hashmap.h" +#include + +namespace oceanbase +{ +namespace common +{ + +class ObTenantDiagnosticInfoSummaryGuard; +class ObDiagnoseTenantInfo; + +class ObDiagnosticInfoSlot +{ +public: + ObDiagnosticInfoSlot(); + ~ObDiagnosticInfoSlot() = default; + DISABLE_COPY_ASSIGN(ObDiagnosticInfoSlot); + void accumulate_diagnostic_info(ObDiagnosticInfo &di); + const ObWaitEventStatArray &get_events() const + { + return events_; + } + ObStatEventAddStatArray &get_stats() + { + return stats_; + } + ObStatLatchArray &get_all_latch_stat() + { + return latch_stats_; + }; + void atomic_add_stat(ObStatEventIds::ObStatEventIdEnum stat_no, int64_t value) + { + ObStatEventAddStat *stat = stats_.get(stat_no); + if (OB_NOT_NULL(stat)) { + stat->atomic_add(value); + } + } + ObLatchStat *get_latch_stat(int64_t latch_id) + { + OB_ASSERT(latch_id >= 0 && latch_id < ObLatchIds::LATCH_END); + return latch_stats_.get(latch_id); + } + TO_STRING_EMPTY(); + +private: + void inner_accumuate_diagnostic_info(ObDiagnosticInfo &di); + ObWaitEventStatArray events_; + ObStatEventAddStatArray stats_; + ObStatLatchArray latch_stats_; + ObSpinLock lock_; // only lock for write +}; + +class ObDiagnosticKey +{ +public: + explicit ObDiagnosticKey(int64_t tenant_id, int64_t group_id) + : tenant_id_(tenant_id), group_id_(group_id){}; + ObDiagnosticKey() : tenant_id_(0), group_id_(0) + {} + ~ObDiagnosticKey() = default; + void operator=(const ObDiagnosticKey &key) + { + this->tenant_id_ = key.tenant_id_; + this->group_id_ = key.group_id_; + } + ObDiagnosticKey(const ObDiagnosticKey &key) + { + this->tenant_id_ = key.tenant_id_; + this->group_id_ = key.group_id_; + } + + bool operator==(const ObDiagnosticKey &other) const + { + return this->compare(other) == 0; + } + bool operator!=(const ObDiagnosticKey &other) const + { + return this->compare(other) != 0; + } + + uint64_t hash() const + { + uint64_t hash_val = 0; + hash_val = common::murmurhash(&tenant_id_, sizeof(tenant_id_), hash_val); + hash_val = common::murmurhash(&group_id_, sizeof(group_id_), hash_val); + return hash_val; + } + + int compare(const ObDiagnosticKey &other) const + { + if (other.tenant_id_ < tenant_id_ || + (other.tenant_id_ == tenant_id_ && other.group_id_ < group_id_)) { + return 1; + } else if (other.tenant_id_ == tenant_id_ && other.group_id_ == group_id_) { + return 0; + } else { + return -1; + } + } + int64_t get_tenant_id() const { return tenant_id_; } + + TO_STRING_KV(K_(tenant_id), K_(group_id)); + +private: + int64_t tenant_id_; + int64_t group_id_; +}; + +typedef common::LinkHashValue DICollectorHashValue; +class ObDiagnosticInfoCollector : public DICollectorHashValue +{ +public: + explicit ObDiagnosticInfoCollector(); + ~ObDiagnosticInfoCollector(); + DISABLE_COPY_ASSIGN(ObDiagnosticInfoCollector); + int init(int cpu_cnt, int64_t tenant_id, int64_t group_id); + int add_diagnostic_info(ObDiagnosticInfo &di); + int64_t get_tenant_id() const + { + return tenant_id_; + }; + int64_t get_group_id() const + { + return group_id_; + }; + void get_all_events(ObWaitEventStatArray &arr) const; + void get_all_add_stats(ObStatEventAddStatArray &arr) const; + void get_all_latch_stat(ObLatchStatArray &arr) const; + ObDiagnosticInfoSlot *get_slot(int64_t session_id); + + TO_STRING_KV(K_(tenant_id), K_(group_id), K_(slot_mask), K_(is_inited), K(get_uref()), K(get_href())); + +private: + int64_t tenant_id_; + int64_t group_id_; + int64_t slot_mask_; + int64_t slot_count_; + bool is_inited_; + ObDiagnosticInfoSlot *di_info_bundle_; +}; + +class ObBaseDiagnosticInfoSummary +{ +public: + friend class ObTenantDiagnosticInfoSummaryGuard; + friend class ObDiagnosticInfoContainer; + explicit ObBaseDiagnosticInfoSummary( + DiagnosticInfoValueAlloc value_alloc) + : collectors_(value_alloc), mutex_(ObLatchIds::DI_COLLECTOR_LOCK), cpu_cnt_(1) + {} + + ~ObBaseDiagnosticInfoSummary() + { + reset(); + } + int init(int64_t cpu_cnt); + void reset() + { + collectors_.destroy(); + } + int add_diagnostic_info(ObDiagnosticInfo &di); + int get_tenant_event(int64_t tenant_id, ObWaitEventStatArray &arr); + int get_tenant_add_stats(int64_t tenant_id, ObStatEventAddStatArray &arr); + int get_tenant_latch_stat(int64_t tenant_id, ObLatchStatArray &arr); + int for_each_group(std::function fn); + + int get_group_event(int64_t group_id, ObWaitEventStatArray &arr); + int get_group_add_stats(int64_t group_id, ObStatEventAddStatArray &arr); + int remove_if(std::function fn); + DISABLE_COPY_ASSIGN(ObBaseDiagnosticInfoSummary); + TO_STRING_KV(K_(cpu_cnt)); + +private: + int get_di_slot( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfoSlot *&slot); + int get_di_collector(int64_t tenant_id, int64_t group_id, ObDiagnosticInfoCollector *&collector); + typedef ObLinkHashMap> + SummaryMap; + SummaryMap collectors_; + lib::ObMutex mutex_; + int64_t cpu_cnt_; +}; + +} /* namespace common */ +} /* namespace oceanbase */ + +#endif /* OB_DIAGNOSTIC_SUMMARY_H_ */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_util.cpp b/deps/oblib/src/lib/stat/ob_diagnostic_info_util.cpp new file mode 100644 index 0000000000..fd28835983 --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_util.cpp @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnostic_info_util.h" +#include "lib/container/ob_vector.h" +#include "observer/ob_server_struct.h" +#include "observer/omt/ob_multi_tenant.h" +#include "common/ob_smart_var.h" + +namespace oceanbase +{ +namespace common +{ +void __attribute__((weak, noinline)) lib_release_tenant(void *ptr) +{ + UNUSED(ptr); +} + +int64_t __attribute__((weak, noinline)) get_mtl_id() +{ + return OB_INVALID_TENANT_ID; +} +ObDiagnosticInfoContainer *__attribute__((weak, noinline)) get_di_container() +{ + return nullptr; +} + +uint64_t __attribute__((weak, noinline)) lib_get_cpu_khz() +{ + return 0; +} + +void __attribute__((weak, noinline)) lib_mtl_switch(int64_t tenant_id, std::function fn) +{ + UNUSED(tenant_id); + fn(OB_NOT_IMPLEMENT); +} + +int64_t __attribute__((weak, noinline)) lib_mtl_cpu_count() +{ + return 1; +} + +} /* namespace common */ +} /* namespace oceanbase */ diff --git a/deps/oblib/src/lib/stat/ob_diagnostic_info_util.h b/deps/oblib/src/lib/stat/ob_diagnostic_info_util.h new file mode 100644 index 0000000000..aa6212618d --- /dev/null +++ b/deps/oblib/src/lib/stat/ob_diagnostic_info_util.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DIAGNOSTIC_INFO_UTIL_H_ +#define OB_DIAGNOSTIC_INFO_UTIL_H_ + +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnose_info.h" +#include "lib/stat/ob_di_cache.h" + +namespace oceanbase +{ +namespace common +{ + +extern void lib_release_tenant(void *ptr); +extern int64_t get_mtl_id(); +extern ObDiagnosticInfoContainer *get_di_container(); +extern uint64_t lib_get_cpu_khz(); +extern void lib_mtl_switch(int64_t tenant_id, std::function fn); +extern int64_t lib_mtl_cpu_count(); + +#define LIB_MTL_ID() get_mtl_id() + +#define MTL_DI_CONTAINER() get_di_container() + +} // namespace common +} // namespace oceanbase + +#endif /* OB_DIAGNOSTIC_INFO_UTIL_H_ */ \ No newline at end of file diff --git a/deps/oblib/src/lib/stat/ob_latch_define.cpp b/deps/oblib/src/lib/stat/ob_latch_define.cpp index 1c74fc971d..8b7f5d6def 100644 --- a/deps/oblib/src/lib/stat/ob_latch_define.cpp +++ b/deps/oblib/src/lib/stat/ob_latch_define.cpp @@ -29,7 +29,7 @@ LATCH_DEF_##enable(def, id, name, policy, max_spin_cnt, max_yield_cnt) #undef LATCH_DEF_true #undef LATCH_DEF_false -static_assert(ARRAYSIZEOF(OB_LATCHES) == 254, "DO NOT delete latch defination"); +static_assert(ARRAYSIZEOF(OB_LATCHES) == 257, "DO NOT delete latch defination"); static_assert(ObLatchIds::LATCH_END == ARRAYSIZEOF(OB_LATCHES) - 1, "update id of LATCH_END before adding your defination"); } diff --git a/deps/oblib/src/lib/stat/ob_latch_define.h b/deps/oblib/src/lib/stat/ob_latch_define.h index d929df3979..6bfe1bb48c 100644 --- a/deps/oblib/src/lib/stat/ob_latch_define.h +++ b/deps/oblib/src/lib/stat/ob_latch_define.h @@ -370,9 +370,9 @@ LATCH_DEF(S2_PHY_BLOCK_LOCK, 336, "s2 phy block lock", LATCH_FIFO, INT64_MAX, 0, LATCH_DEF(S2_MEM_BLOCK_LOCK, 337, "s2 mem block lock", LATCH_FIFO, INT64_MAX, 0, false) LATCH_DEF(TENANT_MGR_TENANT_BUCKET_LOCK, 338, "tenant mgr tenant bucket lock", LATCH_READ_PREFER, INT64_MAX, 0, false) LATCH_DEF(SEQUENCE_VALUE_FETCH_LOCK, 339, "sequence value fetch lock", LATCH_FIFO, 2000, 0, true) -LATCH_DEF(DI_SUMMARY_LOCK, 340, "diagnostic info summary lock", LATCH_FIFO, 2000, 0, false) -LATCH_DEF(DI_ALLOCATE_LOCK, 341, "diagnostic info allocator lock", LATCH_FIFO, 2000, 0, false) -LATCH_DEF(DI_COLLECTOR_LOCK, 342, "diagnostic info collector lock", LATCH_FIFO, 2000, 0, false) +LATCH_DEF(DI_SUMMARY_LOCK, 340, "diagnostic info summary lock", LATCH_FIFO, 2000, 0, true) +LATCH_DEF(DI_ALLOCATE_LOCK, 341, "diagnostic info allocator lock", LATCH_FIFO, 2000, 0, true) +LATCH_DEF(DI_COLLECTOR_LOCK, 342, "diagnostic info collector lock", LATCH_FIFO, 2000, 0, true) LATCH_DEF(DAG_NET_SCHEDULER, 343, "dag net scheduler lock", LATCH_FIFO, 2000, 0, true) LATCH_DEF(DAG_PRIO_SCHEDULER, 344, "dag prio scheduler lock", LATCH_FIFO, 2000, 0, true) @@ -431,13 +431,13 @@ struct ObLatchDesc uint64_t max_spin_cnt_; uint64_t max_yield_cnt_; // every latch has a lock wait event - static int64_t wait_event_idx(const int64_t latch_idx) { return latch_idx + ObWaitEventIds::WAIT_EVENT_DEF_END; } + static int64_t wait_event_idx(const int64_t latch_idx) { return latch_idx + ObWaitEventIds::WAIT_EVENT_DEF_END + 1; } static int64_t wait_event_id(const int64_t latch_id) { return LatchWaitEventBegin + latch_id; /*explicit defined latch id is always less than 100000*/} }; extern const ObLatchDesc OB_LATCHES[]; -static constexpr int32_t WAIT_EVENTS_TOTAL = ObWaitEventIds::WAIT_EVENT_DEF_END + ObLatchIds::LATCH_END; +static constexpr int32_t WAIT_EVENTS_TOTAL = ObWaitEventIds::WAIT_EVENT_DEF_END + ObLatchIds::LATCH_END + 2; }//common }//oceanbase #endif /* OB_LATCH_DEFINE_H_ */ diff --git a/deps/oblib/src/lib/stat/ob_session_stat.cpp b/deps/oblib/src/lib/stat/ob_session_stat.cpp index b9deb70611..1fc485a497 100644 --- a/deps/oblib/src/lib/stat/ob_session_stat.cpp +++ b/deps/oblib/src/lib/stat/ob_session_stat.cpp @@ -10,62 +10,16 @@ * See the Mulan PubL v2 for more details. */ +#define USING_LOG_PREFIX COMMON + #include "lib/stat/ob_session_stat.h" #include "lib/ob_lib_config.h" +#include "lib/stat/ob_diagnostic_info_container.h" namespace oceanbase { namespace common { -ObSessionDIBuffer::ObSessionDIBuffer() - : tenant_cache_(), - local_session_collect_(), - session_collect_(NULL), - sys_tenant_collect_(tenant_cache_.get_sys_tenant_node()), - curr_tenant_collect_(sys_tenant_collect_), - not_sys_tenant_collect_(sys_tenant_collect_) -{ -} - -ObSessionDIBuffer::~ObSessionDIBuffer() -{ -} - -/** - *--------------------------------------------------------ObSessionStatEstGuard--------------------------------------------- - */ -ObSessionStatEstGuard::ObSessionStatEstGuard(const uint64_t tenant_id, const uint64_t session_id, const bool is_multi_thread_plan) - : prev_tenant_id_(OB_SYS_TENANT_ID), - prev_session_id_(0) -{ - if (oceanbase::lib::is_diagnose_info_enabled()) { - buffer_ = GET_TSI(ObSessionDIBuffer); - if (NULL != buffer_) { - prev_tenant_id_ = buffer_->get_tenant_id(); - if (NULL != (buffer_->get_curr_session())) { - prev_session_id_ = buffer_->get_curr_session()->session_id_; - } - if (0 < tenant_id && 0 < session_id) { - buffer_->switch_both(tenant_id, session_id, is_multi_thread_plan); - } - } - } else { - buffer_ = nullptr; - } -} - -ObSessionStatEstGuard::~ObSessionStatEstGuard() -{ - if (NULL != buffer_) { - buffer_->switch_tenant(prev_tenant_id_); - if (0 != prev_session_id_) { - buffer_->switch_session(prev_session_id_); - } else { - buffer_->reset_session(); - } - } -} - } /* namespace common */ } /* namespace oceanbase */ diff --git a/deps/oblib/src/lib/stat/ob_session_stat.h b/deps/oblib/src/lib/stat/ob_session_stat.h index f12f3062b5..6ac11fffe7 100644 --- a/deps/oblib/src/lib/stat/ob_session_stat.h +++ b/deps/oblib/src/lib/stat/ob_session_stat.h @@ -20,164 +20,6 @@ namespace oceanbase { namespace common { -struct ObSysSessionIds -{ - enum ObSysSessionIdEnum - { - DEFAULT = 1, - MERGE, - DUMP, - MIGRATE, - BLOOM_FILTER_BUILD, - NETWORK, - OMT, - MAX_RESERVED - }; -}; - -class ObSessionDIBuffer -{ -public: - ObSessionDIBuffer(); - virtual ~ObSessionDIBuffer(); - int switch_both(const uint64_t tenant_id, const uint64_t session_id, const bool is_multi_thread_plan); - int switch_session(const uint64_t session_id, const bool is_multi_thread_plan = false); - int switch_tenant(const uint64_t tenant_id); - uint64_t get_tenant_id(); - void reset_session(); - inline ObDISessionCollect *get_curr_session() {return session_collect_;} - inline ObDITenantCollect *get_curr_tenant() {return curr_tenant_collect_;} - inline ObDIThreadTenantCache &get_tenant_cache() {return tenant_cache_;} -private: - ObDIThreadTenantCache tenant_cache_; - ObDISessionCollect local_session_collect_; - ObDISessionCollect *session_collect_; - ObDITenantCollect *sys_tenant_collect_; - ObDITenantCollect *curr_tenant_collect_; - ObDITenantCollect *not_sys_tenant_collect_; -}; - -class ObSessionStatEstGuard -{ -public: - ObSessionStatEstGuard(const uint64_t tenant_id = OB_SYS_TENANT_ID, - const uint64_t session_id = ObSysSessionIds::DEFAULT, - const bool is_multi_thread_plan = false); - virtual ~ObSessionStatEstGuard(); -private: - uint64_t prev_tenant_id_; - uint64_t prev_session_id_; - ObSessionDIBuffer *buffer_; -}; - -class ObTenantStatEstGuard -{ -public: - explicit ObTenantStatEstGuard(uint64_t tenant_id = OB_SYS_TENANT_ID) - : prev_tenant_id_(OB_SYS_TENANT_ID) - { - if (oceanbase::lib::is_diagnose_info_enabled()) { - buffer_ = GET_TSI(ObSessionDIBuffer); - if (NULL != buffer_) { - prev_tenant_id_ = buffer_->get_tenant_id(); - if (0 < tenant_id) { - if (OB_UNLIKELY(OB_SUCCESS != buffer_->switch_tenant(tenant_id))) { - buffer_ = nullptr; - } - } - } - } else { - buffer_ = nullptr; - } - } - virtual ~ObTenantStatEstGuard() - { - if (NULL != buffer_) { - buffer_->switch_tenant(prev_tenant_id_); - } - } -private: - uint64_t prev_tenant_id_; - ObSessionDIBuffer *buffer_; -}; - -inline int ObSessionDIBuffer::switch_both(const uint64_t tenant_id, - const uint64_t session_id, const bool is_multi_thread_plan) -{ - int ret = OB_SUCCESS; - if (OB_SUCCESS != (ret = switch_session(session_id, is_multi_thread_plan))) { - } else { - ret = switch_tenant(tenant_id); - } - return ret; -} - -inline int ObSessionDIBuffer::switch_session(const uint64_t session_id, const bool is_multi_thread_plan) -{ - int ret = OB_SUCCESS; - if (NULL != session_collect_ && session_id == session_collect_->session_id_) { - } else { - if (NULL != session_collect_) { - if (session_collect_ != &local_session_collect_) { - session_collect_->lock_.unlock(); - } else { - local_session_collect_.clean(); - } - } - if (is_multi_thread_plan) { - local_session_collect_.session_id_ = session_id; - session_collect_ = &local_session_collect_; - } else { - ret = ObDISessionCache::get_instance().get_node(session_id, session_collect_); - } - } - return ret; -} - -inline int ObSessionDIBuffer::switch_tenant(const uint64_t tenant_id) -{ - int ret = OB_SUCCESS; - if (OB_SYS_TENANT_ID == tenant_id) { - curr_tenant_collect_ = sys_tenant_collect_; - } else { - if (OB_NOT_NULL(not_sys_tenant_collect_) - && tenant_id == not_sys_tenant_collect_->tenant_id_) { - } else { - ret = tenant_cache_.get_node(tenant_id, not_sys_tenant_collect_); - } - curr_tenant_collect_ = not_sys_tenant_collect_; - } - return ret; -} - -inline uint64_t ObSessionDIBuffer::get_tenant_id() -{ - uint64_t tenant_id = 0; - if (NULL != curr_tenant_collect_) { - tenant_id = curr_tenant_collect_->tenant_id_; - } - return tenant_id; -} - -inline void ObSessionDIBuffer::reset_session() -{ - if (NULL != session_collect_) { - // Summarize the thread-local session collect into the session cache - if (session_collect_ == &local_session_collect_) { - const uint64_t session_id = session_collect_->session_id_; - ObDISessionCollect *collect = NULL; - ObDISessionCache::get_instance().get_node(session_id, collect); - if (NULL != collect) { - collect->base_value_.add(session_collect_->base_value_); - collect->lock_.unlock(); - local_session_collect_.clean(); - } - } else { - session_collect_->lock_.unlock(); - } - session_collect_ = NULL; - } -} } /* namespace common */ diff --git a/deps/oblib/src/lib/stat/ob_stat_template.cpp b/deps/oblib/src/lib/stat/ob_stat_template.cpp index 5422476093..0919d85fc9 100644 --- a/deps/oblib/src/lib/stat/ob_stat_template.cpp +++ b/deps/oblib/src/lib/stat/ob_stat_template.cpp @@ -19,18 +19,30 @@ namespace common { DIRWLock::DIRWLock() +#ifdef NDEBUG : lock_(0) +#else + : lock_(0), + wlock_tid_(0) +#endif { } DIRWLock::~DIRWLock() { + if (OB_UNLIKELY(lock_ != 0)) { +#ifdef NDEBUG + COMMON_LOG_RET(WARN, OB_ERR_UNEXPECTED, "DIRWLock exit with lock", K_(lock)); +#else + COMMON_LOG_RET(WARN, OB_ERR_UNEXPECTED, "DIRWLock exit with lock", K_(lock), K_(wlock_tid)); +#endif + } } int DIRWLock::try_rdlock() { int ret = OB_EAGAIN; - uint32_t lock = lock_; + uint32_t lock = ATOMIC_LOAD(&lock_); if (0 == (lock & WRITE_MASK)) { if (ATOMIC_BCAS(&lock_, lock, lock + 1)) { ret = OB_SUCCESS; @@ -43,6 +55,12 @@ int DIRWLock::try_wrlock() { int ret = OB_EAGAIN; if (ATOMIC_BCAS(&lock_, 0, WRITE_MASK)) { +#ifndef NDEBUG + if (OB_UNLIKELY(wlock_tid_ != 0)) { + COMMON_LOG_RET(WARN, OB_ERR_UNEXPECTED, "wlock mismatch", K(GETTID()), K_(wlock_tid)); + } + wlock_tid_ = GETTID(); +#endif ret = OB_SUCCESS; } return ret; @@ -52,7 +70,7 @@ void DIRWLock::rdlock() { uint32_t lock = 0; while (1) { - lock = lock_; + lock = ATOMIC_LOAD(&lock_); if (0 == (lock & WRITE_MASK)) { if (ATOMIC_BCAS(&lock_, lock, lock + 1)) { break; @@ -67,6 +85,12 @@ void DIRWLock::wrlock() while (!ATOMIC_BCAS(&lock_, 0, WRITE_MASK)) { PAUSE(); } +#ifndef NDEBUG + if (OB_UNLIKELY(wlock_tid_ != 0)) { + COMMON_LOG_RET(WARN, OB_ERR_UNEXPECTED, "wlock mismatch", K(GETTID()), K_(wlock_tid)); + } + wlock_tid_ = GETTID(); +#endif } void DIRWLock::wr2rdlock() @@ -79,12 +103,23 @@ void DIRWLock::wr2rdlock() void DIRWLock::unlock() { uint32_t lock = 0; - lock = lock_; + lock = ATOMIC_LOAD(&lock_); if (0 != (lock & WRITE_MASK)) { +#ifndef NDEBUG + if (OB_UNLIKELY(wlock_tid_ != GETTID())) { + COMMON_LOG_RET(WARN, OB_ERR_UNEXPECTED, "wlock mismatch", K(GETTID()), K_(wlock_tid)); + } + wlock_tid_ = 0; +#endif ATOMIC_STORE(&lock_, 0); } else { ATOMIC_AAF(&lock_, -1); } +#ifdef ENABLE_DEBUG_LOG + if (ATOMIC_LOAD(&lock_) > WRITE_MASK) { + abort(); + } +#endif } } diff --git a/deps/oblib/src/lib/stat/ob_stat_template.h b/deps/oblib/src/lib/stat/ob_stat_template.h index cd64ea998a..afd66dbaf5 100644 --- a/deps/oblib/src/lib/stat/ob_stat_template.h +++ b/deps/oblib/src/lib/stat/ob_stat_template.h @@ -32,79 +32,29 @@ public: void wrlock(); void wr2rdlock(); void unlock(); - inline uint32_t get_lock() {return lock_;} + inline uint32_t get_lock() const {return lock_;} private: static const uint32_t WRITE_MASK = 1<<30; volatile uint32_t lock_; +#ifndef NDEBUG + int64_t wlock_tid_; // record tid for thread that holds the lock. +#endif }; /** * ----------------------------------------------------template define--------------------------------------------------------- */ -//NOTE the class T must be a POD type -template -class ObStatArrayIter -{ -public: - ObStatArrayIter(); - int init(T *item, const int64_t curr_idx, int64_t max_item_idx); - int get_next(const T *&item); -private: - T *items_; - int64_t curr_idx_; - int64_t max_item_idx_; -}; //NOTE the class T must be a POD type template class ObStatArray { -public: - typedef ObStatArrayIter Iterator; public: ObStatArray(); int add(const ObStatArray &other); T *get(const int64_t idx); - int get_iter(Iterator &iter); void reset(); private: T items_[N]; - int64_t min_item_idx_; - int64_t max_item_idx_; -}; - -//NOTE the class T must be a POD type -template -class ObStatHistoryIter -{ -public: - ObStatHistoryIter(); - int init(T *items, const int64_t start_pos, int64_t item_cnt); - int get_next(T *&item); - void reset(); -private: - T *items_; - int64_t curr_; - int64_t start_pos_; - int64_t item_cnt_; -}; - -//NOTE the class T must be a POD type -template -class ObStatHistory -{ -public: - typedef ObStatHistoryIter Iterator; -public: - ObStatHistory(); - int push(const T &item); - int add(const ObStatHistory &other); - int get_iter(Iterator &iter); - int get_last(T *&item); - void reset(); -private: - T items_[N]; - int64_t curr_pos_; - int64_t item_cnt_; }; /** @@ -113,20 +63,15 @@ private: //ObStatArray template ObStatArray::ObStatArray() - : min_item_idx_(N), - max_item_idx_(-1) { memset(items_, 0, sizeof(items_)); } template -int ObStatArray::add(const ObStatArray &other) +int ObStatArray::add(const ObStatArray &other) { int ret = common::OB_SUCCESS; - int64_t i = 0; - min_item_idx_ = std::min(min_item_idx_, other.min_item_idx_); - max_item_idx_ = std::max(max_item_idx_, other.max_item_idx_); - for (i = min_item_idx_; i <= max_item_idx_ && common::OB_SUCCESS == ret; ++i) { + for (int64_t i = 0; i < N && common::OB_SUCCESS == ret; ++i) { if (OB_FAIL(items_[i].add(other.items_[i]))) { COMMON_LOG(WARN, "Fail to add other, ", K(ret)); } @@ -140,221 +85,16 @@ T *ObStatArray::get(const int64_t idx) T *item = NULL; if (idx >= 0 && idx < N) { item = &items_[idx]; - if (idx < min_item_idx_) { - min_item_idx_ = idx; - } - if (idx > max_item_idx_) { - max_item_idx_ = idx; - } } return item; } -template -int ObStatArray::get_iter(Iterator &iter) -{ - int ret = common::OB_SUCCESS; - if (OB_FAIL(iter.init(items_, min_item_idx_, max_item_idx_))) { - COMMON_LOG(WARN, "init stat array iter failed, ", K(ret)); - } - return ret; -} - template void ObStatArray::reset() -{ - if (min_item_idx_ < N) { - memset(&(items_[min_item_idx_]), 0, sizeof(T) * (max_item_idx_ - min_item_idx_ + 1)); - min_item_idx_ = N; - max_item_idx_ = -1; - } -} - - -//ObStatArrayIter -template -ObStatArrayIter::ObStatArrayIter() - : items_(NULL), - curr_idx_(0), - max_item_idx_(0) -{ -} - -template -int ObStatArrayIter::init(T *item, const int64_t curr_idx, int64_t max_item_idx) -{ - int ret = common::OB_SUCCESS; - if (NULL == item || curr_idx < 0 || max_item_idx < 0) { - ret = common::OB_INVALID_ARGUMENT; - COMMON_LOG(WARN, "Invalid argument, ", KP(item), K(curr_idx), K(max_item_idx), K(ret)); - } else { - items_ = item; - curr_idx_ = curr_idx; - max_item_idx_ = max_item_idx; - } - return ret; -} - -template -int ObStatArrayIter::get_next(const T *&item) -{ - int ret = common::OB_SUCCESS; - if (NULL == items_) { - ret = OB_NOT_INIT; - COMMON_LOG(WARN, "The iter has no been inited, ", K(ret)); - } else { - while (curr_idx_ <= max_item_idx_ && !items_[curr_idx_].is_valid()) { - ++curr_idx_; - } - if (curr_idx_ > max_item_idx_) { - ret = OB_ITER_END; - } else { - item = &items_[curr_idx_++]; - } - } - return ret; -} - - -//ObStatHistory -template -ObStatHistory::ObStatHistory() - : curr_pos_(0), - item_cnt_(0) { memset(items_, 0, sizeof(items_)); } -template -int ObStatHistory::push(const T &item) -{ - int ret = common::OB_SUCCESS; - items_[curr_pos_] = item; - if (item_cnt_ < N) { - ++item_cnt_; - } - curr_pos_ = (curr_pos_ + 1) % N; - return ret; -} - - -template -int ObStatHistory::add(const ObStatHistory &other) -{ - int ret = common::OB_SUCCESS; - int64_t i = 0, j = 0, cnt = 0; - if (other.item_cnt_ > 0) { - T tmp[N]; - for (i = 0, j = 0; i < item_cnt_ && j < other.item_cnt_ && cnt < N;) { - if (items_[(curr_pos_ - 1 - i + N) % N] > other.items_[(other.curr_pos_ - 1 - j + N) % N]) { - tmp[cnt++] = items_[(curr_pos_ - 1 - i + N) % N]; - ++i; - } else { - tmp[cnt++] = other.items_[(other.curr_pos_ - 1 - j + N) % N]; - ++j; - } - } - - if (cnt < N) { - for (; i < item_cnt_ && cnt < N; ++i, ++cnt) { - tmp[cnt] = items_[(curr_pos_ - 1 - i + N) % N]; - } - for (; j < other.item_cnt_ && cnt < N; ++j, ++cnt) { - tmp[cnt] = other.items_[(other.curr_pos_ - 1 - j + N) % N]; - } - } - - for (i = cnt - 1; i >= 0; --i) { - items_[cnt - i - 1] = tmp[i]; - } - item_cnt_ = cnt; - curr_pos_ = cnt % N; - } - return ret; -} - -template -int ObStatHistory::get_iter(Iterator &iter) -{ - int ret = common::OB_SUCCESS; - if (OB_FAIL(iter.init(items_, (curr_pos_ - 1 + N) % N, item_cnt_))) { - COMMON_LOG(WARN, "init stat history iter failed, ", K(ret)); - } - return ret; -} - -template -int ObStatHistory::get_last(T *&item) -{ - int ret = common::OB_SUCCESS; - if (0 == item_cnt_) { - ret = common::OB_ITEM_NOT_SETTED; - COMMON_LOG(WARN, "The item has no been setted, ", K(ret)); - } else { - item = &items_[(curr_pos_ - 1 + N) % N]; - } - return ret; -} - -template -void ObStatHistory::reset() -{ - if (item_cnt_ > 0) { - curr_pos_ = 0; - item_cnt_ = 0; - memset(items_, 0, sizeof(items_)); - } -} - -//ObStatHistoryIter -template -ObStatHistoryIter::ObStatHistoryIter() - : items_(NULL), - curr_(0), - start_pos_(0), - item_cnt_(0) -{ -} - - -template -int ObStatHistoryIter::init(T *items, const int64_t start_pos, int64_t item_cnt) -{ - int ret = common::OB_SUCCESS; - if (NULL == items || start_pos < 0 || item_cnt < 0) { - ret = common::OB_INVALID_ARGUMENT; - COMMON_LOG(WARN, "Invalid argument, ", KP(items), K(start_pos), K(item_cnt), K(ret)); - } else { - items_ = items; - start_pos_ = start_pos; - item_cnt_ = item_cnt; - curr_ = 0; - } - return ret; -} - -template -int ObStatHistoryIter::get_next(T *&item) -{ - int ret = common::OB_SUCCESS; - if (curr_ >= item_cnt_) { - ret = common::OB_ITER_END; - } else { - item = &items_[(start_pos_ - curr_ + item_cnt_) % item_cnt_]; - curr_++; - } - return ret; -} - -template -void ObStatHistoryIter::reset() -{ - items_ = NULL; - start_pos_ = 0; - item_cnt_ = 0; - curr_ = 0; -} - }//common }//oceanbase diff --git a/deps/oblib/src/lib/statistic_event/ob_stat_event.cpp b/deps/oblib/src/lib/statistic_event/ob_stat_event.cpp index aad5c224f2..916da3dbd5 100644 --- a/deps/oblib/src/lib/statistic_event/ob_stat_event.cpp +++ b/deps/oblib/src/lib/statistic_event/ob_stat_event.cpp @@ -62,14 +62,19 @@ int ObStatEventAddStat::add(int64_t value) return ret; } +int ObStatEventAddStat::atomic_add(int64_t value) +{ + IGNORE_RETURN ATOMIC_AAF(&stat_value_, value); + return OB_SUCCESS; +} + void ObStatEventAddStat::reset() { stat_value_ = 0; } ObStatEventSetStat::ObStatEventSetStat() - : stat_value_(0), - set_time_(0) + : stat_value_(0) { } @@ -77,13 +82,7 @@ int ObStatEventSetStat::add(const ObStatEventSetStat &other) { int ret = OB_SUCCESS; if (other.is_valid()) { - if (is_valid()) { - if (set_time_ < other.set_time_) { - *this = other; - } - } else { - *this = other; - } + *this = other; } return ret; } @@ -91,7 +90,6 @@ int ObStatEventSetStat::add(const ObStatEventSetStat &other) void ObStatEventSetStat::reset() { stat_value_ = 0; - set_time_ = 0; } diff --git a/deps/oblib/src/lib/statistic_event/ob_stat_event.h b/deps/oblib/src/lib/statistic_event/ob_stat_event.h index 5cd9bc0625..8f3c3f2045 100644 --- a/deps/oblib/src/lib/statistic_event/ob_stat_event.h +++ b/deps/oblib/src/lib/statistic_event/ob_stat_event.h @@ -727,13 +727,13 @@ STAT_EVENT_ADD_DEF(REDISAPI_PERSIST_TIME, "redis persist time", ObStatClassIds:: // sys_time_model related (20xxxx) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_TIME, "DB time", ObStatClassIds::SYS, 200001, false, true, true) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_CPU, "DB CPU", ObStatClassIds::SYS, 200002, false, true, true) -STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_INNER_TIME, "DB inner sql time", ObStatClassIds::SYS, 200003, false, true, true) -STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_INNER_CPU, "DB inner sql CPU", ObStatClassIds::SYS, 200004, false, true, true) +STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_INNER_TIME, "DB inner sql time", ObStatClassIds::SYS, 200003, false, true, false) +STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_DB_INNER_CPU, "DB inner sql CPU", ObStatClassIds::SYS, 200004, false, true, false) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_BKGD_TIME, "background elapsed time", ObStatClassIds::SYS, 200005, false, true, true) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_BKGD_CPU, "background cpu time", ObStatClassIds::SYS, 200006, false, true, true) -STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_BACKUP_CPU, "(backup/restore) cpu time", ObStatClassIds::SYS, 200007, false, true, true) -STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_ENCRYPT_TIME, "Tablespace encryption elapsed time", ObStatClassIds::SYS, 200008, false, true, true) -STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_ENCRYPT_CPU, "Tablespace encryption cpu time", ObStatClassIds::SYS, 200009, false, true, true) +STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_BACKUP_CPU, "(backup/restore) cpu time", ObStatClassIds::SYS, 200007, false, true, false) +STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_ENCRYPT_TIME, "Tablespace encryption elapsed time", ObStatClassIds::SYS, 200008, false, true, false) +STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_ENCRYPT_CPU, "Tablespace encryption cpu time", ObStatClassIds::SYS, 200009, false, true, false) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_NON_IDLE_WAIT_TIME, "non idle wait time", ObStatClassIds::SYS, 200010, true, true, true) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_IDLE_WAIT_TIME, "idle wait time", ObStatClassIds::SYS, 200011, true, true, true) STAT_EVENT_ADD_DEF(SYS_TIME_MODEL_BKGD_DB_TIME, "background database time", ObStatClassIds::SYS, 200012, false, true, true) @@ -807,12 +807,12 @@ STAT_EVENT_SET_DEF(STANDBY_FETCH_LOG_BANDWIDTH_LIMIT, "standby fetch log bandwid // SQL // CACHE -STAT_EVENT_SET_DEF(LOCATION_CACHE_SIZE, "location cache size", ObStatClassIds::CACHE, 120000, false, true, true) +STAT_EVENT_SET_DEF(LOCATION_CACHE_SIZE, "location cache size", ObStatClassIds::CACHE, 120000, false, true, false) STAT_EVENT_SET_DEF(TABLET_LS_CACHE_SIZE, "tablet ls cache size", ObStatClassIds::CACHE, 120001, false, true, true) STAT_EVENT_SET_DEF(OPT_TAB_STAT_CACHE_SIZE, "table stat cache size", ObStatClassIds::CACHE, 120002, false, true, true) STAT_EVENT_SET_DEF(OPT_TAB_COL_STAT_CACHE_SIZE, "table col stat cache size", ObStatClassIds::CACHE, 120003, false, true, true) STAT_EVENT_SET_DEF(INDEX_BLOCK_CACHE_SIZE, "index block cache size", ObStatClassIds::CACHE, 120004, false, true, true) -STAT_EVENT_SET_DEF(SYS_BLOCK_CACHE_SIZE, "sys block cache size", ObStatClassIds::CACHE, 120005, false, true, true) +STAT_EVENT_SET_DEF(SYS_BLOCK_CACHE_SIZE, "sys block cache size", ObStatClassIds::CACHE, 120005, false, true, false) STAT_EVENT_SET_DEF(USER_BLOCK_CACHE_SIZE, "user block cache size", ObStatClassIds::CACHE, 120006, false, true, true) STAT_EVENT_SET_DEF(USER_ROW_CACHE_SIZE, "user row cache size", ObStatClassIds::CACHE, 120008, false, true, true) STAT_EVENT_SET_DEF(BLOOM_FILTER_CACHE_SIZE, "bloom filter cache size", ObStatClassIds::CACHE, 120009, false, true, true) @@ -883,7 +883,7 @@ STAT_EVENT_SET_DEF(OBSERVER_PARTITION_TABLE_UPATER_SYS_QUEUE_SIZE, "observer par STAT_EVENT_SET_DEF(OBSERVER_PARTITION_TABLE_UPATER_CORE_QUEUE_SIZE, "observer partition table updater core table queue size", ObStatClassIds::OBSERVER, 170003, false, true, true) // rootservice -STAT_EVENT_SET_DEF(RS_START_SERVICE_TIME, "rootservice start time", ObStatClassIds::RS, 180001, false, true, true) +STAT_EVENT_SET_DEF(RS_START_SERVICE_TIME, "rootservice start time", ObStatClassIds::RS, 180001, false, true, false) // das STAT_EVENT_SET_DEF(DAS_PARALLEL_TENANT_MEMORY_USAGE, "the memory use of all DAS parallel task", ObStatClassIds::SQL, 230001, false, true, true) @@ -947,6 +947,7 @@ struct ObStatEventAddStat ObStatEventAddStat(); int add(const ObStatEventAddStat &other); int add(int64_t value); + int atomic_add(int64_t value); int64_t get_stat_value(); void reset(); inline bool is_valid() const { return true; } @@ -961,7 +962,6 @@ struct ObStatEventSetStat { //value for a stat int64_t stat_value_; - int64_t set_time_; ObStatEventSetStat(); int add(const ObStatEventSetStat &other); void set(int64_t value); @@ -978,7 +978,6 @@ inline int64_t ObStatEventSetStat::get_stat_value() inline void ObStatEventSetStat::set(int64_t value) { stat_value_ = value; - set_time_ = ObTimeUtility::current_time(); } struct ObStatEvent diff --git a/deps/oblib/src/lib/string/ob_string.h b/deps/oblib/src/lib/string/ob_string.h index e3b6f6f201..289c130295 100644 --- a/deps/oblib/src/lib/string/ob_string.h +++ b/deps/oblib/src/lib/string/ob_string.h @@ -508,7 +508,7 @@ public: return compare(str) != 0; } - const ObString trim() + const ObString trim() const { ObString ret; if (NULL != ptr_) { diff --git a/deps/oblib/src/lib/task/ob_timer.cpp b/deps/oblib/src/lib/task/ob_timer.cpp index cec93bba1c..0b0b131c22 100644 --- a/deps/oblib/src/lib/task/ob_timer.cpp +++ b/deps/oblib/src/lib/task/ob_timer.cpp @@ -173,6 +173,8 @@ int ObTimer::cancel_task(const ObTimerTask &task) int ObTimer::wait_task(const ObTimerTask &task) { int ret = OB_SUCCESS; + ObBKGDSessInActiveGuard inactive_guard; + if (!is_inited_) { ret = OB_NOT_INIT; OB_LOG(WARN, "timer is not yet initialized", K(ret)); diff --git a/deps/oblib/src/lib/thread/ob_reentrant_thread.cpp b/deps/oblib/src/lib/thread/ob_reentrant_thread.cpp index cd1661f52e..83e004c539 100644 --- a/deps/oblib/src/lib/thread/ob_reentrant_thread.cpp +++ b/deps/oblib/src/lib/thread/ob_reentrant_thread.cpp @@ -37,7 +37,8 @@ ObReentrantThread::~ObReentrantThread() } } -int ObReentrantThread::create(const int64_t thread_cnt, const char* thread_name) +int ObReentrantThread::create(const int64_t thread_cnt, const char* thread_name, + const int64_t wait_event_id) { int ret = OB_SUCCESS; if (created_) { @@ -46,7 +47,7 @@ int ObReentrantThread::create(const int64_t thread_cnt, const char* thread_name) } else if (thread_cnt <= 0) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(ret), K(thread_cnt)); - } else if (OB_FAIL(cond_.init(ObWaitEventIds::REENTRANT_THREAD_COND_WAIT))) { + } else if (OB_FAIL(cond_.init(wait_event_id))) { LOG_WARN("fail to init cond, ", K(ret)); } else { thread_name_ = thread_name; @@ -123,6 +124,7 @@ void ObReentrantThread::logical_wait() LOG_WARN("inner status error", K(ret), K_(running_cnt)); } else { while (running_cnt_ > 0) { + ObBKGDSessInActiveGuard inactive_guard; cond_.wait(); } } @@ -181,6 +183,7 @@ int ObReentrantThread::blocking_run() if (ThreadPool::has_set_stop()) { break; } + ObBKGDSessInActiveGuard inactive_guard; cond_.wait(WAIT_TIME_MS); } else { need_run = true; @@ -204,5 +207,21 @@ void ObReentrantThread::nothing() { } +int ObReentrantThread::idle_wait(const int64_t idle_time_ms) +{ + int ret = OB_SUCCESS; + ObBKGDSessInActiveGuard inactive_guard; + ret = get_cond().wait(idle_time_ms); + return ret; +} + +int ObReentrantThread::idle_wait_us(const int64_t idle_time_us) +{ + int ret = OB_SUCCESS; + ObBKGDSessInActiveGuard inactive_guard; + ret = get_cond().wait_us(idle_time_us); + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/deps/oblib/src/lib/thread/ob_reentrant_thread.h b/deps/oblib/src/lib/thread/ob_reentrant_thread.h index 3d239ee319..00b9791bbd 100644 --- a/deps/oblib/src/lib/thread/ob_reentrant_thread.h +++ b/deps/oblib/src/lib/thread/ob_reentrant_thread.h @@ -31,7 +31,8 @@ public: virtual ~ObReentrantThread(); // create thread, task will not run before start() called. - int create(const int64_t thread_cnt, const char* thread_name = nullptr); + int create(const int64_t thread_cnt, const char* thread_name = nullptr, + const int64_t wait_event_id = ObWaitEventIds::REENTRANT_THREAD_COND_WAIT); // start and stop run task, can be called repeatedly, if created. int start() override; @@ -73,6 +74,8 @@ protected: void nothing(); common::ObThreadCond &get_cond() { return cond_; } + int idle_wait(const int64_t idle_time_ms); + int idle_wait_us(const int64_t idle_time_us); private: void run1() final; diff --git a/deps/oblib/src/lib/thread/ob_simple_thread_pool.ipp b/deps/oblib/src/lib/thread/ob_simple_thread_pool.ipp index 0f3829aeea..1e4a5117a7 100644 --- a/deps/oblib/src/lib/thread/ob_simple_thread_pool.ipp +++ b/deps/oblib/src/lib/thread/ob_simple_thread_pool.ipp @@ -12,6 +12,7 @@ #include "lib/thread/ob_thread_name.h" #include "lib/thread/ob_simple_thread_pool.h" +#include "lib/ash/ob_active_session_guard.h" #include "lib/thread/ob_dynamic_thread_pool.h" namespace oceanbase @@ -151,6 +152,7 @@ void ObSimpleThreadPoolBase::run1() handle(task); } } else if (thread_idx >= old_thread_num) { + ObBKGDSessInActiveGuard inactive_guard; usleep(static_cast<__useconds_t>((10 + thread_idx - old_thread_num) * 1000)); } else { void *task = NULL; @@ -161,7 +163,11 @@ void ObSimpleThreadPoolBase::run1() const int64_t shrink_ts = adaptive_strategy_.get_estimate_ts() * adaptive_strategy_.get_shrink_rate() / 100; start_ts = ObTimeUtility::current_time(); - if (OB_SUCC(queue_.pop(task, QUEUE_WAIT_TIME))) { + { + ObBKGDSessInActiveGuard inactive_guard; + ret = queue_.pop(task, QUEUE_WAIT_TIME); + } + if (OB_SUCC(ret)) { wakeup_ts = ObTimeUtility::current_time(); handle(task); handle_ts = ObTimeUtility::current_time(); diff --git a/deps/oblib/src/lib/thread/ob_tenant_hook.cpp b/deps/oblib/src/lib/thread/ob_tenant_hook.cpp index c8aeda44b2..b32eaafb75 100644 --- a/deps/oblib/src/lib/thread/ob_tenant_hook.cpp +++ b/deps/oblib/src/lib/thread/ob_tenant_hook.cpp @@ -18,6 +18,7 @@ #include "lib/thread/ob_thread_name.h" #include "lib/thread/protected_stack_allocator.h" #include "lib/stat/ob_diagnose_info.h" +#include "lib/ash/ob_active_session_guard.h" #include #include #include @@ -137,6 +138,7 @@ int ob_epoll_wait(int __epfd, struct epoll_event *__events, int __maxevents, int __timeout) = epoll_wait; int ret = 0; oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_IO_EVENT); + oceanbase::common::ObBKGDSessInActiveGuard inactive_guard; ret = SYS_HOOK(epoll_wait, __epfd, __events, __maxevents, __timeout); return ret; } @@ -173,10 +175,15 @@ int ob_pthread_cond_timedwait(pthread_cond_t *__restrict __cond, return ret; } +// ob_usleep wrapper function for C file void ob_usleep(const useconds_t v) { - oceanbase::common::ObSleepEventGuard wait_guard((int64_t)v); - ::usleep(v); + oceanbase::common::ob_usleep(v); +} + +void ob_idle_usleep(const useconds_t v) +{ + oceanbase::common::ob_usleep(v, true); } int futex_hook(uint32_t *uaddr, int futex_op, uint32_t val, const struct timespec* timeout) diff --git a/deps/oblib/src/lib/thread/ob_thread_name.h b/deps/oblib/src/lib/thread/ob_thread_name.h index 4ab933ad21..78c57e692b 100644 --- a/deps/oblib/src/lib/thread/ob_thread_name.h +++ b/deps/oblib/src/lib/thread/ob_thread_name.h @@ -17,6 +17,7 @@ #include #include "lib/ob_define.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { @@ -39,6 +40,7 @@ inline void set_thread_name(const char* type, uint64_t idx) } else { snprintf(name, OB_THREAD_NAME_BUF_LEN, "T%ld_%s%ld", tenant_id, type, idx); } + ObLocalDiagnosticInfo::set_thread_name(tenant_id, type); set_thread_name_inner(name); } @@ -53,6 +55,7 @@ inline void set_thread_name(const char* type) } else { snprintf(name, OB_THREAD_NAME_BUF_LEN, "T%ld_%s", tenant_id, type); } + ObLocalDiagnosticInfo::set_thread_name(tenant_id, type); set_thread_name_inner(name); } diff --git a/deps/oblib/src/lib/thread/thread.cpp b/deps/oblib/src/lib/thread/thread.cpp index c846b2ae81..96ce589682 100644 --- a/deps/oblib/src/lib/thread/thread.cpp +++ b/deps/oblib/src/lib/thread/thread.cpp @@ -27,6 +27,8 @@ #include "lib/utility/ob_hang_fatal_error.h" #include "lib/utility/ob_tracepoint.h" #include "lib/signal/ob_signal_struct.h" +#include "lib/ash/ob_active_session_guard.h" +#include "lib/stat/ob_session_stat.h" using namespace oceanbase; using namespace oceanbase::common; @@ -170,9 +172,15 @@ void Thread::run() { IRunWrapper *run_wrapper_ = threads_->get_run_wrapper(); if (OB_NOT_NULL(run_wrapper_)) { - run_wrapper_->pre_run(); + { + ObDisableDiagnoseGuard disable_guard; + run_wrapper_->pre_run(); + } threads_->run(idx_); - run_wrapper_->end_run(); + { + ObDisableDiagnoseGuard disable_guard; + run_wrapper_->end_run(); + } } else { threads_->run(idx_); } @@ -276,6 +284,7 @@ void* Thread::__th_start(void *arg) ob_set_thread_tenant_id(th->get_tenant_id()); current_thread_ = th; th->tid_ = gettid(); + #ifndef OB_USE_ASAN ObStackHeader *stack_header = ProtectedStackAllocator::stack_header(th->stack_addr_); abort_unless(stack_header->check_magic()); diff --git a/deps/oblib/src/lib/thread/threads.cpp b/deps/oblib/src/lib/thread/threads.cpp index 32cad14876..fe87a999e7 100644 --- a/deps/oblib/src/lib/thread/threads.cpp +++ b/deps/oblib/src/lib/thread/threads.cpp @@ -19,6 +19,7 @@ #include "lib/oblog/ob_log.h" #include "lib/signal/ob_signal_struct.h" #include "lib/worker.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase; using namespace oceanbase::lib; using namespace oceanbase::common; @@ -197,6 +198,7 @@ int Threads::start() void Threads::run(int64_t idx) { ObTLTaGuard ta_guard(GET_TENANT_ID() ?:OB_SERVER_TENANT_ID); + common::ObBackGroundSessionGuard backgroud_session_guard(GET_TENANT_ID(), THIS_WORKER.get_group_id()); thread_idx_ = static_cast(idx); Worker worker; Worker::set_worker_to_thread_local(&worker); diff --git a/deps/oblib/src/lib/utility/ob_hang_fatal_error.cpp b/deps/oblib/src/lib/utility/ob_hang_fatal_error.cpp index 14082296be..a1ef4547a7 100644 --- a/deps/oblib/src/lib/utility/ob_hang_fatal_error.cpp +++ b/deps/oblib/src/lib/utility/ob_hang_fatal_error.cpp @@ -15,6 +15,7 @@ #include "lib/utility/ob_print_utils.h" #include "common/ob_common_utility.h" #include "common/ob_clock_generator.h" +#include "lib/utility/utility.h" extern "C" { void right_to_die_or_duty_to_live_c() @@ -52,7 +53,7 @@ void right_to_die_or_duty_to_live() throw OB_EXCEPTION(); } #endif - sleep(60); + ob_usleep(60 * 1000 * 1000); // sleep 60s } } diff --git a/deps/oblib/src/lib/utility/ob_macro_utils.h b/deps/oblib/src/lib/utility/ob_macro_utils.h index a53515ae1b..ff92fa4045 100644 --- a/deps/oblib/src/lib/utility/ob_macro_utils.h +++ b/deps/oblib/src/lib/utility/ob_macro_utils.h @@ -13,7 +13,7 @@ #ifndef _OB_MACRO_UTILS_H_ #define _OB_MACRO_UTILS_H_ -#define SELECT140_(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ +#define SELECT142_(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \ @@ -27,16 +27,16 @@ _110, _111, _112, _113, _114, _115, _116, _117, _118, _119, \ _120, _121, _122, _123, _124, _125, _126, _127, _128, _129, \ _130, _131, _132, _133, _134, _135, _136, _137, _138, _139, \ - _140, ...) _140 + _140, _141, _142, ...) _142 // These two macros do same work that select the 120th argument from // argument list. -#define SELECT140(...) SELECT140_(__VA_ARGS__) +#define SELECT142(...) SELECT142_(__VA_ARGS__) // Expand to the number of arguments #define ARGS_NUM(args...) \ - SELECT140(, ##args, \ - 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, \ + SELECT142(, ##args, \ + 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, \ 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, \ 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, \ 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, \ @@ -213,6 +213,8 @@ #define APPLY138(f, ...) APPLY_VARGS(f, APPLY137(f, ##__VA_ARGS__)) #define APPLY139(f, ...) APPLY_VARGS(f, APPLY138(f, ##__VA_ARGS__)) #define APPLY140(f, ...) APPLY_VARGS(f, APPLY139(f, ##__VA_ARGS__)) +#define APPLY141(f, ...) APPLY_VARGS(f, APPLY140(f, ##__VA_ARGS__)) +#define APPLY142(f, ...) APPLY_VARGS(f, APPLY141(f, ##__VA_ARGS__)) #define APPLY(n, f, ...) APPLY ## n (f, ##__VA_ARGS__) // select nth argument @@ -364,6 +366,8 @@ #define LST_DO_138(M, s, P, ...) LST_DO_137(M, s, P, ##__VA_ARGS__)SELF s P(M, 138, ##__VA_ARGS__) #define LST_DO_139(M, s, P, ...) LST_DO_138(M, s, P, ##__VA_ARGS__)SELF s P(M, 139, ##__VA_ARGS__) #define LST_DO_140(M, s, P, ...) LST_DO_139(M, s, P, ##__VA_ARGS__)SELF s P(M, 140, ##__VA_ARGS__) +#define LST_DO_141(M, s, P, ...) LST_DO_140(M, s, P, ##__VA_ARGS__)SELF s P(M, 141, ##__VA_ARGS__) +#define LST_DO_142(M, s, P, ...) LST_DO_141(M, s, P, ##__VA_ARGS__)SELF s P(M, 142, ##__VA_ARGS__) #define LST_DO__(N, M, s, P, ...) LST_DO_ ## N(M, s, P, ##__VA_ARGS__) #define LST_DO_(...) LST_DO__(__VA_ARGS__) @@ -409,7 +413,7 @@ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, \ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, \ - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140 + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142 #define MSTR(X) #X diff --git a/deps/oblib/src/lib/utility/utility.cpp b/deps/oblib/src/lib/utility/utility.cpp index 8da8bea15e..03b5f0796f 100644 --- a/deps/oblib/src/lib/utility/utility.cpp +++ b/deps/oblib/src/lib/utility/utility.cpp @@ -27,6 +27,7 @@ #include "common/object/ob_object.h" #include "lib/net/ob_addr.h" #include "lib/json/ob_yson.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { diff --git a/deps/oblib/src/lib/utility/utility.h b/deps/oblib/src/lib/utility/utility.h index 221bf804d7..c6f2b335f5 100644 --- a/deps/oblib/src/lib/utility/utility.h +++ b/deps/oblib/src/lib/utility/utility.h @@ -176,13 +176,46 @@ inline double max(const double x, const double y) template void max(T, T) = delete; -template +template inline void ob_usleep(const useconds_t v) { - oceanbase::common::ObSleepEventGuard wait_guard(event_id, 0, (int64_t)v); + oceanbase::common::ObSleepEventGuard wait_guard((int64_t)v); ::usleep(v); } +template +inline void ob_usleep(const useconds_t v, const bool is_idle_sleep) +{ + if (is_idle_sleep) { + ObBKGDSessInActiveGuard inactive_guard; + ob_usleep(v); + } else { + ob_usleep(v); + } + +} + +template +inline void ob_usleep(const useconds_t v, const int64_t p1, const int64_t p2, const int64_t p3) +{ + oceanbase::common::ObSleepEventGuard wait_guard((int64_t)v, p1, p2, p3); + ::usleep(v); +} + +template +inline void ob_usleep(const useconds_t v, const int64_t p1, const int64_t p2, const int64_t p3, const bool is_idle_sleep) +{ + if (is_idle_sleep) { + ObBKGDSessInActiveGuard inactive_guard; + ob_usleep(v, p1, p2, p3); + } else { + ob_usleep(v, p1, p2, p3); + } +} int get_double_expand_size(int64_t &new_size, const int64_t limit_size); /** * allocate new memory that twice larger to store %oldp diff --git a/deps/oblib/src/lib/wait_event/ob_inner_sql_wait_type.h b/deps/oblib/src/lib/wait_event/ob_inner_sql_wait_type.h new file mode 100644 index 0000000000..ca6df44c7f --- /dev/null +++ b/deps/oblib/src/lib/wait_event/ob_inner_sql_wait_type.h @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ +#ifdef DEF_INNER_SQL_WAIT +DEF_INNER_SQL_WAIT(NULL_INNER_SQL, 0) + +//*************** start of seq *************** +DEF_INNER_SQL_WAIT(SEQUENCE_SAVE, 10001) +DEF_INNER_SQL_WAIT(SEQUENCE_LOAD, 10002) +//*************** end of seq *************** + +//*************** start of wr *************** +DEF_INNER_SQL_WAIT(WR_TAKE_SNAPSHOT, 20001) +DEF_INNER_SQL_WAIT(WR_DEL_SNAPSHOT, 20002) +//*************** end of wr *************** + +//*************** start of tx *************** +DEF_INNER_SQL_WAIT(TX_UPDATE_WEAK_READ_VERSION, 30001) +DEF_INNER_SQL_WAIT(TX_GET_WEAK_READ_VERSION_RANGE, 30002) +//*************** end of tx *************** + +//*************** start of rs *************** +DEF_INNER_SQL_WAIT(RS_GET_ARBITRATION_MEMBER, 40001) +DEF_INNER_SQL_WAIT(RS_CHECK_SYS_VIEW_EXPANSION, 40002) +DEF_INNER_SQL_WAIT(RS_GET_SERVICE_EPOCH, 40003) +DEF_INNER_SQL_WAIT(RS_LOAD_PURE_TENANT_INFO, 40004) +DEF_INNER_SQL_WAIT(RS_CREATE_INDEX_BUILD_REPLICA, 40005) +DEF_INNER_SQL_WAIT(RS_GET_TENANT_ARBITRATION_SERVICE_STATUS, 40006) +//*************** end of rs *************** + +//*************** start of log *************** +DEF_INNER_SQL_WAIT(LOG_GET_ALL_LS_STATUS_BY_ORDER, 50001) +DEF_INNER_SQL_WAIT(LOG_GET_BLACK_LIST_LS_INFO, 50002) +DEF_INNER_SQL_WAIT(LOG_UPDATE_LS_RECOVERY_STAT, 50003) +DEF_INNER_SQL_WAIT(LOG_GET_LS_RECOVERY_STAT, 50004) +DEF_INNER_SQL_WAIT(LOG_GET_LS_PRIMARY_ZONE_INFO, 50005) +DEF_INNER_SQL_WAIT(LOG_GET_TENANT_RECOVERY_STAT, 50006) +//*************** end of log *************** + + +//*************** start of observer *************** +DEF_INNER_SQL_WAIT(OMT_FETCH_ALL_SRS, 60001) +//*************** end of observer *************** + +//*************** start of sql *************** +DEF_INNER_SQL_WAIT(SQL_DYNAMIC_SAMPLING_ESTIMATE_ROWCOUNT, 70001) +//*************** end of sql *************** + +//*************** start of location *************** +DEF_INNER_SQL_WAIT(RENEW_TABLET_LOCATION, 80001) // 获取location +DEF_INNER_SQL_WAIT(GET_TABLET_LOCATION, 80002) // 刷新location +//*************** end of location *************** + +//*************** start of schema *************** +DEF_INNER_SQL_WAIT(WAIT_REFRESH_SCHEMA, 90001) // 同步等待schema刷新到指定版本 +DEF_INNER_SQL_WAIT(ASYNC_REFRESH_SCHEMA, 90002) // 刷新schema任务 +DEF_INNER_SQL_WAIT(REFRESH_SCHEMA, 90003) // 后台刷新schema任务 +//*************** end of schema *************** + + +#endif // DEF_INNER_SQL_WAIT + +#ifndef _OB_INNER_SQL_WAIT_TYPE_H_ +#define _OB_INNER_SQL_WAIT_TYPE_H_ +namespace oceanbase +{ +namespace common +{ +enum ObInnerSqlWaitTypeId : int64_t + { +#define DEF_INNER_SQL_WAIT(def_name, enum_id) def_name = enum_id, +#include "lib/wait_event/ob_inner_sql_wait_type.h" +#undef DEF_INNER_SQL_WAIT + }; +static inline const char* inner_sql_action_name(ObInnerSqlWaitTypeId id) +{ + static const char* const NULL_INNER_SQL = "UNDEFINED"; + switch( id ) + { +#define DEF_INNER_SQL_WAIT(def_name, enum_id) \ + case (ObInnerSqlWaitTypeId::def_name) : return #def_name; +#include "lib/wait_event/ob_inner_sql_wait_type.h" +#undef DEF_INNER_SQL_WAIT + default: return NULL_INNER_SQL; + } +} +} // end common +} // end oceanbase + +#endif /* _OB_INNER_SQL_WAIT_TYPE_H_ */ diff --git a/deps/oblib/src/lib/wait_event/ob_wait_event.cpp b/deps/oblib/src/lib/wait_event/ob_wait_event.cpp index 4c827ac05c..076c66d751 100644 --- a/deps/oblib/src/lib/wait_event/ob_wait_event.cpp +++ b/deps/oblib/src/lib/wait_event/ob_wait_event.cpp @@ -19,38 +19,27 @@ namespace oceanbase namespace common { +const ObWaitEventDef OB_WAIT_EVENTS[WAIT_EVENTS_TOTAL] = { #define WAIT_EVENT_DEF_true(def, id, name, param1, param2, param3, wait_class, is_phy) \ {id, name, param1, param2, param3, ObWaitClassIds::wait_class, is_phy}, #define WAIT_EVENT_DEF_false(def, id, name, param1, param2, param3, wait_class, is_phy) - -ObWaitEventDef OB_WAIT_EVENTS[ObWaitEventIds::WAIT_EVENT_DEF_END + ObLatchIds::LATCH_END] = { #define WAIT_EVENT_DEF(def, id, name, param1, param2, param3, wait_class, is_phy, enable) \ WAIT_EVENT_DEF_##enable(def, id, name, param1, param2, param3, wait_class, is_phy) #include "lib/wait_event/ob_wait_event.h" #undef WAIT_EVENT_DEF -}; - #undef WAIT_EVENT_DEF_true #undef WAIT_EVENT_DEF_false -// would called after OB_LATCHES have been initialized -static __attribute__ ((constructor(103))) void init_latch_wait_events() -{ - // For every latch, there is a wait event to measure the lock wait time. - // There is no need to explicitly define a wait event for every latch. - // We automatically allocate one latch wait event after all the explicit - // defined wait events. - for (int32_t i = 0; i < ObLatchIds::LATCH_END; ++i) { - ObWaitEventDef &event_def = OB_WAIT_EVENTS[ObWaitEventIds::WAIT_EVENT_DEF_END+i]; - event_def.event_id_ = ObLatchDesc::wait_event_id(OB_LATCHES[i].latch_id_); - snprintf(event_def.event_name_, MAX_WAIT_EVENT_NAME_LENGTH, "latch: %s wait", OB_LATCHES[i].latch_name_); - strcpy(event_def.param1_, "address"); - strcpy(event_def.param2_, "number"); - strcpy(event_def.param3_, "tries"); - event_def.wait_class_ = ObWaitClassIds::CONCURRENCY; - event_def.is_phy_ = true; // latch wait is atomic - } -} +#define LATCH_DEF_true(def, id, name, policy, max_spin_cnt, max_yield_cnt) \ +{id, "latch: " name " wait", "address", "number", "tries", ObWaitClassIds::CONCURRENCY, true}, +#define LATCH_DEF_false(def, id, name, policy, max_spin_cnt, max_yield_cnt) +#define LATCH_DEF(def, id, name, policy, max_spin_cnt, max_yield_cnt, enable) \ +LATCH_DEF_##enable(def, id, name, policy, max_spin_cnt, max_yield_cnt) +#include "lib/stat/ob_latch_define.h" +#undef LATCH_DEF +#undef LATCH_DEF_true +#undef LATCH_DEF_false +}; int64_t ObWaitEventDesc::to_string(char *buf, const int64_t buf_len) const { @@ -68,17 +57,25 @@ int64_t ObWaitEventDesc::to_string(char *buf, const int64_t buf_len) const return pos; } +bool ObWaitEventDesc::is_valid() +{ + return event_no_>=0 && event_no_ < WAIT_EVENTS_TOTAL; +} int ObWaitEventStat::add(const ObWaitEventStat &other) { int ret = OB_SUCCESS; if (other.is_valid()) { + // TODO(roland.qk): remove this if() and make it SIMD compatible. if (is_valid()) { total_waits_ += other.total_waits_; total_timeouts_ += other.total_timeouts_; time_waited_ += other.time_waited_; max_wait_ = std::max(max_wait_, other.max_wait_); } else { - *this = other; + total_waits_ = other.total_waits_; + total_timeouts_ = other.total_timeouts_; + time_waited_ = other.time_waited_; + max_wait_ = other.max_wait_; } } return ret; diff --git a/deps/oblib/src/lib/wait_event/ob_wait_event.h b/deps/oblib/src/lib/wait_event/ob_wait_event.h index e937917e07..59bd9936a0 100644 --- a/deps/oblib/src/lib/wait_event/ob_wait_event.h +++ b/deps/oblib/src/lib/wait_event/ob_wait_event.h @@ -26,20 +26,20 @@ */ // USER_IO & SYSTEM_IO 10001-11999 WAIT_EVENT_DEF(NULL_EVENT, 10000, "", "", "", "", OTHER, true, true) -WAIT_EVENT_DEF(DB_FILE_DATA_READ, 10001, "db file data read", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_DATA_INDEX_READ, 10002, "db file data `index read", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_COMPACT_READ, 11001, "db file compact read", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_COMPACT_WRITE, 11002, "db file compact write", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_INDEX_BUILD_READ, 11003, "db file index build read", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_INDEX_BUILD_WRITE, 11004, "db file index build write", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_MIGRATE_READ, 11005, "db file migrate read", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(DB_FILE_MIGRATE_WRITE, 11006, "db file migrate write", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(BLOOM_FILTER_BUILD_READ, 11007, "bloomfilter build read", "fd", "offset", "size", SYSTEM_IO, true, true) -WAIT_EVENT_DEF(INTERM_RESULT_DISK_WRITE, 11008, "interm result disk write", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(INTERM_RESULT_DISK_READ, 11009, "interm result disk read", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(ROW_STORE_DISK_WRITE, 11010, "row store disk write", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(ROW_STORE_DISK_READ, 11011, "row store disk read", "fd", "offset", "size", USER_IO, true, true) -WAIT_EVENT_DEF(MEMSTORE_MEM_PAGE_ALLOC_WAIT, 11015, "memstore memory page alloc wait", "cur_mem_hold", "sleep_interval", "cur_ts", CONFIGURATION, true, true) +WAIT_EVENT_DEF(DB_FILE_DATA_READ, 10001, "db file data read", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_DATA_INDEX_READ, 10002, "db file data `index read", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_COMPACT_READ, 11001, "db file compact read", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_COMPACT_WRITE, 11002, "db file compact write", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_INDEX_BUILD_READ, 11003, "db file index build read", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_INDEX_BUILD_WRITE, 11004, "db file index build write", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_MIGRATE_READ, 11005, "db file migrate read", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(DB_FILE_MIGRATE_WRITE, 11006, "db file migrate write", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(BLOOM_FILTER_BUILD_READ, 11007, "bloomfilter build read", "fd", "offset", "size", SYSTEM_IO, false, true) +WAIT_EVENT_DEF(INTERM_RESULT_DISK_WRITE, 11008, "interm result disk write", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(INTERM_RESULT_DISK_READ, 11009, "interm result disk read", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(ROW_STORE_DISK_WRITE, 11010, "row store disk write", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(ROW_STORE_DISK_READ, 11011, "row store disk read", "fd", "offset", "size", USER_IO, false, true) +WAIT_EVENT_DEF(MEMSTORE_MEM_PAGE_ALLOC_WAIT, 11015, "memstore memory page alloc wait", "cur_mem_hold", "sleep_interval", "cur_ts", CONFIGURATION, false, true) WAIT_EVENT_DEF(PALF_READ, 11016, "palf read", "fd", "offset", "size", SYSTEM_IO, false, true) WAIT_EVENT_DEF(PALF_WRITE, 11017, "palf write", "fd", "offset", "size", SYSTEM_IO, false, true) WAIT_EVENT_DEF(OBJECT_STORAGE_WRITE, 11018, "object storage write", "fd", "offset", "size", SYSTEM_IO, true, true) @@ -52,18 +52,17 @@ WAIT_EVENT_DEF(OMT_IDLE, 12002, "sched idle", "wait start timestamp", "", "", ID // NETWORK 13000-13999 WAIT_EVENT_DEF(SYNC_RPC, 13000, "sync rpc", "pcode", "size", "", NETWORK, true, true) -WAIT_EVENT_DEF(MYSQL_RESPONSE_WAIT_CLIENT, 13001, "mysql response wait client", "", "", "", NETWORK, true, true) +WAIT_EVENT_DEF(MYSQL_RESPONSE_WAIT_CLIENT, 13001, "mysql response wait client", "", "", "", IDLE, true, true) WAIT_EVENT_DEF(DAS_ASYNC_RPC_LOCK_WAIT, 13002, "das wait remote response", "", "", "", NETWORK, true, true) WAIT_EVENT_DEF(ASYNC_EXTERNAL_TABLE_LOCK_WAIT, 13003, "external table wait remote response", "", "", "", NETWORK, true, true) -WAIT_EVENT_DEF(NETWORK_QUEUE_WAIT, 13004, "wait for network request in queue", "pcode", "retry_times", "", CONFIGURATION, true, true) +WAIT_EVENT_DEF(NETWORK_QUEUE_WAIT, 13004, "wait in request queue", "pcode", "level", "priority", CONFIGURATION, true, true) // APPLICATION 14001-14999 WAIT_EVENT_DEF(MT_READ_LOCK_WAIT,14001,"memstore read lock wait","lock","waiter","owner",APPLICATION,false, true) WAIT_EVENT_DEF(MT_WRITE_LOCK_WAIT,14002,"memstore write lock wait","lock","waiter","owner",APPLICATION,false, false) -WAIT_EVENT_DEF(ROW_LOCK_WAIT,14003,"row lock wait","lock holder's tx id","data seq number","hold time",APPLICATION,false, false) -WAIT_EVENT_DEF(ROW_LOCK_RETRY, 14004, "retry wait because of row lock wait", "lock holder's tx id","data seq number","hold time", APPLICATION, false , false) +WAIT_EVENT_DEF(ROW_LOCK_WAIT,14003,"row lock wait","lock holder tx id","data seq number","holder lock time",APPLICATION,false, true) +WAIT_EVENT_DEF(ROW_LOCK_RETRY, 14004, "retry wait because of row lock wait", "lock holder tx id","data seq number","holder lock time", APPLICATION, false , false) WAIT_EVENT_DEF(EXPR_FUNC_SLEEP, 14005, "sleep: wait for user calls", "sleep_interval", "", "", APPLICATION, true, true) - // CONCURRENCY // condition wait has one parameter e.g. address of the condition variable WAIT_EVENT_DEF(IO_QUEUE_COND_WAIT, 15066, "io queue condition wait", "address", "", "", CONCURRENCY, true, true) @@ -78,7 +77,7 @@ WAIT_EVENT_DEF(SEQ_QUEUE_COND_WAIT, 15107, "seq queue condition wait", "address" WAIT_EVENT_DEF(INNER_CONNECTION_POOL_COND_WAIT, 15108, "inner connection pool condition wait", "address", "", "", CONCURRENCY, true, true) WAIT_EVENT_DEF(PARTITION_TABLE_UPDATER_COND_WAIT, 15109, "partition table updater condition wait", "address", "", "", CONCURRENCY, true, true) WAIT_EVENT_DEF(REBALANCE_TASK_MGR_COND_WAIT, 15110, "rebalance task mgr condition wait", "address", "", "", CONCURRENCY, true, true) -WAIT_EVENT_DEF(ASYNC_RPC_PROXY_COND_WAIT, 15111, "async rpc proxy condition wait", "address", "", "", CONCURRENCY, true, true) +WAIT_EVENT_DEF(ASYNC_RPC_PROXY_COND_WAIT, 15111, "async rpc proxy condition wait", "address", "", "", NETWORK, true, true) WAIT_EVENT_DEF(THREAD_IDLING_COND_WAIT, 15112, "thread idling condition wait", "address", "", "", IDLE, true, true) WAIT_EVENT_DEF(RPC_SESSION_HANDLER_COND_WAIT, 15113, "rpc session handler condition wait", "address", "", "", CONCURRENCY, true, true) WAIT_EVENT_DEF(LOCATION_CACHE_COND_WAIT, 15114, "location cache condition wait", "address", "", "", CONCURRENCY, true, true) @@ -120,7 +119,7 @@ WAIT_EVENT_DEF(END_STMT_WAIT, 16003, "wait end stmt", "rollback", "trans_hash_va WAIT_EVENT_DEF(REMOVE_PARTITION_WAIT, 16004, "wait remove partition", "tenant_id", "table_id", "partition_id", ADMINISTRATIVE, false, false) WAIT_EVENT_DEF(TABLET_LOCK_WAIT, 16016, "tablet lock wait", "", "", "", CONCURRENCY, true, false) WAIT_EVENT_DEF(IND_NAME_CACHE_LOCK_WAIT, 16017, "latch:index name cache lock wait", "address", "number", "tries", CONCURRENCY, true, false) -WAIT_EVENT_DEF(ASYNC_COMMITTING_WAIT, 16018, "async commiting wait", "", "", "", COMMIT, true, true) +WAIT_EVENT_DEF(ASYNC_COMMITTING_WAIT, 16018, "tx commiting wait", "", "", "", COMMIT, false, true) WAIT_EVENT_DEF(OBCDC_PART_MGR_SCHEMA_VERSION_WAIT, 18000, "oblog part mgr schema version wait", "", "", "", CONCURRENCY, true, true) WAIT_EVENT_DEF(BACKUP_TMP_FILE_WAIT, 18001, "backup tmp file wait", "", "", "", CONCURRENCY, true, true) WAIT_EVENT_DEF(BACKUP_TMP_FILE_QUEUE_WAIT, 18002, "backup tmp file queue wait", "", "", "", CONCURRENCY, true, true) @@ -165,24 +164,24 @@ WAIT_EVENT_DEF(TIERED_BLOCK_READ_LOCAL, 21014, "tiered block read local", "addre // inner sql 30000-30099 WAIT_EVENT_DEF(INNER_SQL_EXEC_WAIT, 30000, "exec inner sql wait", "wait inner sql class", "inner session id", "", OTHER, true, true) -WAIT_EVENT_DEF(INNER_SESSION_IDLE_WAIT, 30001, "inner session wait to be called", "inner session id", "parent session id", "", IDLE, true, false) +WAIT_EVENT_DEF(INNER_SESSION_IDLE_WAIT, 30001, "inner session wait to be called", "inner session id", "parent session id", "", IDLE, true, true) // CONFIGURATION 30100-30999 WAIT_EVENT_DEF(WAIT_REFRESH_SCHEMA, 30100, "sleep: wait refresh schema", "sleep_interval", "schema_version", "", CONFIGURATION, true, true) WAIT_EVENT_DEF(PALF_THROTTLING, 30101, "palf throttling sleep", "sleep_interval", "", "", USER_IO, false, true) WAIT_EVENT_DEF(SLOG_NORMAL_RETRY_SLEEP, 30102, "sleep: slog has io error and retrying", "sleep_interval", "", "", USER_IO, true, true) -WAIT_EVENT_DEF(INSUFFICIENT_PX_WORKER_RETRY_WAIT, 30103, "retry wait event because of insufficient px worker", "parallel level", "number of px workers required", "the total number of idle PX workers currently", CONFIGURATION, true, false) +WAIT_EVENT_DEF(INSUFFICIENT_PX_WORKER_RETRY_WAIT, 30103, "retry: insufficient px worker wait", "degree of parallel", "number of px workers required", "the total number of idle PX workers currently", CONFIGURATION, true, true) // sleep 31000-31999 WAIT_EVENT_DEF(GARBAGE_COLLECTOR_SLEEP, 31000, "sleep: wait log callback sleep wait", "sleep_interval", "", "", SYSTEM_IO, true, true) // cluster 32000-32999 -WAIT_EVENT_DEF(GTS_NOT_READEY_RETRY_WAIT, 32000, "retry wait because of GTS service not ready", "error code", "ls leader addr", "ls leader port", CLUSTER, true, false) -WAIT_EVENT_DEF(REPLICA_NOT_READABLE_RETRY_WAIT, 32001, "retry wait because of replica not readable", "ls_id", "", "", CLUSTER, true, false) -WAIT_EVENT_DEF(SCHEMA_RETRY_WAIT, 32002, "retry wait because of schema", "error code", "table id", "table schema version", CLUSTER, true, false) -WAIT_EVENT_DEF(LOCATION_RETRY_WAIT, 32003, "retry wait because of location", "error", "ls_id", "", CLUSTER, true, false) -WAIT_EVENT_DEF(OTHER_RETRY_WAIT, 32004, "retry wait because of other", "error", "", "", CLUSTER, true, false) - +WAIT_EVENT_DEF(GTS_NOT_READEY_RETRY_WAIT, 32000, "retry: wait GTS ready", "error code", "ls leader addr", "ls leader port", CLUSTER, true, true) +WAIT_EVENT_DEF(REPLICA_NOT_READABLE_RETRY_WAIT, 32001, "retry: wait replica readable", "ls_id", "tablet_id", "", CLUSTER, true, true) +WAIT_EVENT_DEF(SCHEMA_RETRY_WAIT, 32002, "retry: wait schema cache load", "error code", "table id", "table schema version", CLUSTER, true, true) +WAIT_EVENT_DEF(LOCATION_RETRY_WAIT, 32003, "retry: wait location cache load", "error", "ls_id", "", CLUSTER, true, true) +WAIT_EVENT_DEF(OTHER_RETRY_WAIT, 32004, "retry: other retry wait", "error", "", "", CLUSTER, true, true) +WAIT_EVENT_DEF(INSUFFICIENT_PX_WORKER_RETRY_WAIT, 30103, "retry wait event because of insufficient px worker", "parallel level", "number of px workers required", "the total number of idle PX workers currently", CONFIGURATION, true, false) // END. DO NOT MODIFY. WAIT_EVENT_DEF(WAIT_EVENT_DEF_END, 99999, "event end", "", "", "", OTHER, false, true) @@ -194,7 +193,7 @@ WAIT_EVENT_DEF(WAIT_EVENT_DEF_END, 99999, "event end", "", "", "", OTHER, false, #include "lib/ob_errno.h" #include "lib/alloc/alloc_assist.h" #include "lib/wait_event/ob_wait_class.h" - +#include namespace oceanbase { @@ -221,6 +220,60 @@ WAIT_EVENT_DEF_##enable(def, id, name, param1, param2, param3, wait_class, is_ph #undef WAIT_EVENT_DEF_true #undef WAIT_EVENT_DEF_false +template +struct is_idle_wait_event +{ + static constexpr bool value = false; +}; + +template +inline constexpr typename std::enable_if::type + is_idle_class() +{ + return false; +}; + +template +inline constexpr typename std::enable_if::type + is_idle_class() +{ + return true; +}; + +#define WAIT_EVENT_DEF_true(def, id, name, param1, param2, param3, wait_class, is_phy) \ + template <> \ + struct is_idle_wait_event \ + { \ + static constexpr bool value = is_idle_class(); \ + }; +#define WAIT_EVENT_DEF_false(def, id, name, param1, param2, param3, wait_class, is_phy) +#define WAIT_EVENT_DEF(def, id, name, param1, param2, param3, wait_class, is_phy, enable) \ +WAIT_EVENT_DEF_##enable(def, id, name, param1, param2, param3, wait_class, is_phy) +#include "lib/wait_event/ob_wait_event.h" +#undef WAIT_EVENT_DEF +#undef WAIT_EVENT_DEF_true +#undef WAIT_EVENT_DEF_false + +template +struct is_physical_wait_event +{ + static constexpr bool value = false; +}; + +#define WAIT_EVENT_DEF_true(def, id, name, param1, param2, param3, wait_class, is_phy) \ + template <> \ + struct is_physical_wait_event \ + { \ + static constexpr bool value = is_phy; \ + }; +#define WAIT_EVENT_DEF_false(def, id, name, param1, param2, param3, wait_class, is_phy) +#define WAIT_EVENT_DEF(def, id, name, param1, param2, param3, wait_class, is_phy, enable) \ +WAIT_EVENT_DEF_##enable(def, id, name, param1, param2, param3, wait_class, is_phy) +#include "lib/wait_event/ob_wait_event.h" +#undef WAIT_EVENT_DEF +#undef WAIT_EVENT_DEF_true +#undef WAIT_EVENT_DEF_false + struct ObWaitEventDesc { int64_t event_no_; @@ -250,6 +303,7 @@ struct ObWaitEventDesc inline bool operator==(const ObWaitEventDesc &other) const; inline bool operator!=(const ObWaitEventDesc &other) const; inline int add(const ObWaitEventDesc &other); + bool is_valid(); void reset() { event_no_ = 0; @@ -307,7 +361,7 @@ struct ObWaitEventDef }; -extern ObWaitEventDef OB_WAIT_EVENTS[]; +const extern ObWaitEventDef OB_WAIT_EVENTS[]; #define EVENT_NO_TO_CLASS_ID(event_no) OB_WAIT_CLASSES[OB_WAIT_EVENTS[event_no].wait_class_].wait_class_id_ #define EVENT_NO_TO_CLASS(event_no) OB_WAIT_CLASSES[OB_WAIT_EVENTS[event_no].wait_class_].wait_class_ diff --git a/deps/oblib/src/lib/xml/ob_xml_util.cpp b/deps/oblib/src/lib/xml/ob_xml_util.cpp index 7268f503ca..c232de6d42 100644 --- a/deps/oblib/src/lib/xml/ob_xml_util.cpp +++ b/deps/oblib/src/lib/xml/ob_xml_util.cpp @@ -1560,5 +1560,9 @@ ObXmlNode* ObXmlUtil::clone_new_node(ObIAllocator* allocator, Args &&... args) } +template ObXmlNode* ObXmlUtil::clone_new_node(ObIAllocator*, ObMulModeNodeType&&, ObMulModeMemCtx*&); +template ObXmlNode* ObXmlUtil::clone_new_node(ObIAllocator*, ObMulModeNodeType&&, ObMulModeMemCtx*&); +template ObXmlNode* ObXmlUtil::clone_new_node(ObIAllocator*, ObMulModeNodeType&&, ObMulModeMemCtx*&); +template ObXmlNode* ObXmlUtil::clone_new_node(ObIAllocator*, ObMulModeNodeType&&, ObMulModeMemCtx*&); } // namespace common } // namespace oceanbase diff --git a/deps/oblib/src/rpc/ob_request.cpp b/deps/oblib/src/rpc/ob_request.cpp index 45bebbd9e2..1609beb25b 100644 --- a/deps/oblib/src/rpc/ob_request.cpp +++ b/deps/oblib/src/rpc/ob_request.cpp @@ -48,5 +48,11 @@ int ObRequest::set_trace_point(int trace_point) return OB_SUCCESS; } +int ObRequest::set_traverse_index(int64_t index) { + int ret = OB_SUCCESS; + traverse_index_ = index; + return ret; +} + } //end of namespace rpc } //end of namespace oceanbase diff --git a/deps/oblib/src/rpc/ob_request.h b/deps/oblib/src/rpc/ob_request.h index 469b3e6bc7..2e66f967c4 100644 --- a/deps/oblib/src/rpc/ob_request.h +++ b/deps/oblib/src/rpc/ob_request.h @@ -31,6 +31,11 @@ namespace oceanbase namespace obmysql { int get_fd_from_sess(void *sess); + void* get_sql_sess_from_sess(void *sess); +} +namespace common +{ +class ObDiagnosticInfo; } namespace rpc @@ -71,10 +76,10 @@ public: : ez_req_(NULL), handling_state_(-1), nio_protocol_(nio_protocol), type_(type), handle_ctx_(NULL), group_id_(0), sql_req_level_(0), pkt_(NULL), connection_phase_(ConnectionPhaseEnum::CPE_CONNECTED), recv_timestamp_(0), enqueue_timestamp_(0), - request_arrival_time_(0), recv_mts_(), arrival_push_diff_(0), + request_arrival_time_(0), traverse_index_(0), recv_mts_(), arrival_push_diff_(0), push_pop_diff_(0), pop_process_start_diff_(0), process_start_end_diff_(0), process_end_response_diff_(0), - trace_id_(), discard_flag_(false), large_retry_flag_(false), retry_times_(0) + trace_id_(), discard_flag_(false), large_retry_flag_(false), retry_times_(0), diagnostic_info_ptr_(nullptr) { } virtual ~ObRequest() {} @@ -118,10 +123,11 @@ public: int32_t get_pop_process_start_diff() const; int32_t get_process_start_end_diff() const; int32_t get_process_end_response_diff() const; + int64_t get_traverse_index() const { return traverse_index_; } bool get_discard_flag() const; int32_t get_retry_times() const; int get_connfd(); - + int get_pcode(); void set_connection_phase(ConnectionPhaseEnum connection_phase) { connection_phase_ = connection_phase; } bool is_in_connected_phase() const { return ConnectionPhaseEnum:: CPE_CONNECTED == connection_phase_; } bool is_from_unix_domain() const; @@ -133,9 +139,22 @@ public: const TraceId &get_trace_id() const { return trace_id_; } void reset_trace_id() { trace_id_.reset(); } int set_trace_point(int trace_point = 0); + int set_traverse_index(int64_t index); ObLockWaitNode &get_lock_wait_node() { return lock_wait_node_; } bool is_retry_on_lock() const { return lock_wait_node_.try_lock_times_ > 0;} + common::ObDiagnosticInfo *get_diagnostic_info() + { + return diagnostic_info_ptr_; + }; + void set_diagnostic_info(common::ObDiagnosticInfo *ptr) + { + diagnostic_info_ptr_ = ptr; + }; + void reset_diagnostic_info() + { + diagnostic_info_ptr_ = nullptr; + }; VIRTUAL_TO_STRING_KV("packet", pkt_, "type", type_, "group", group_id_, "sql_req_level", sql_req_level_, "connection_phase", connection_phase_, K(recv_timestamp_), K(enqueue_timestamp_), K(request_arrival_time_), K(trace_id_)); ObLockWaitNode lock_wait_node_; @@ -154,6 +173,7 @@ protected: int64_t recv_timestamp_; int64_t enqueue_timestamp_; int64_t request_arrival_time_; + int64_t traverse_index_; // only used by transaction common::ObMonotonicTs recv_mts_; int32_t arrival_push_diff_; @@ -166,6 +186,7 @@ protected: bool discard_flag_; bool large_retry_flag_; int32_t retry_times_; + common::ObDiagnosticInfo *diagnostic_info_ptr_; private: DISALLOW_COPY_AND_ASSIGN(ObRequest); }; // end of class ObRequest diff --git a/deps/oblib/src/rpc/ob_rpc_request_operator.cpp b/deps/oblib/src/rpc/ob_rpc_request_operator.cpp index c1750179b7..f4877912a0 100644 --- a/deps/oblib/src/rpc/ob_rpc_request_operator.cpp +++ b/deps/oblib/src/rpc/ob_rpc_request_operator.cpp @@ -14,6 +14,8 @@ #include "rpc/obrpc/ob_easy_rpc_request_operator.h" #include "rpc/obrpc/ob_poc_rpc_request_operator.h" #include "rpc/obrpc/ob_rpc_opts.h" +#include "lib/stat/ob_diagnostic_info_guard.h" +#include "lib/stat/ob_diagnostic_info_container.h" namespace oceanbase { @@ -35,6 +37,15 @@ ObIRpcRequestOperator& ObRpcRequestOperator::get_operator(const ObRequest* req) return *op; } +void ObRpcRequestOperator::response_result(ObRequest* req, obrpc::ObRpcPacket* pkt) { + if (OB_NOT_NULL(req->get_diagnostic_info())) { + common::ObLocalDiagnosticInfo::dec_ref(req->get_diagnostic_info()); + common::ObLocalDiagnosticInfo::return_diagnostic_info(req->get_diagnostic_info()); + req->reset_diagnostic_info(); + } + return get_operator(req).response_result(req, pkt); +} + ObRpcRequestOperator global_rpc_req_operator; }; // end namespace rpc }; // end namespace oceanbase diff --git a/deps/oblib/src/rpc/ob_rpc_request_operator.h b/deps/oblib/src/rpc/ob_rpc_request_operator.h index 678527e47e..7ca92a952b 100644 --- a/deps/oblib/src/rpc/ob_rpc_request_operator.h +++ b/deps/oblib/src/rpc/ob_rpc_request_operator.h @@ -36,9 +36,7 @@ public: virtual void* alloc_response_buffer(ObRequest* req, int64_t size) override { return get_operator(req).alloc_response_buffer(req, size); } - virtual void response_result(ObRequest* req, obrpc::ObRpcPacket* pkt) override { - return get_operator(req).response_result(req, pkt); - } + virtual void response_result(ObRequest* req, obrpc::ObRpcPacket* pkt) override; virtual common::ObAddr get_peer(const ObRequest* req) override { return get_operator(req).get_peer(req); } diff --git a/deps/oblib/src/rpc/obmysql/ob_2_0_protocol_utils.cpp b/deps/oblib/src/rpc/obmysql/ob_2_0_protocol_utils.cpp index 997e609d7f..8f802517dc 100644 --- a/deps/oblib/src/rpc/obmysql/ob_2_0_protocol_utils.cpp +++ b/deps/oblib/src/rpc/obmysql/ob_2_0_protocol_utils.cpp @@ -22,6 +22,7 @@ #include "rpc/obmysql/ob_2_0_protocol_struct.h" #include "rpc/obmysql/ob_mysql_packet.h" #include "rpc/obmysql/obsm_struct.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase::common; diff --git a/deps/oblib/src/rpc/obmysql/ob_mysql_request_utils.cpp b/deps/oblib/src/rpc/obmysql/ob_mysql_request_utils.cpp index b7bcda6047..eb24692773 100644 --- a/deps/oblib/src/rpc/obmysql/ob_mysql_request_utils.cpp +++ b/deps/oblib/src/rpc/obmysql/ob_mysql_request_utils.cpp @@ -304,7 +304,7 @@ int ObMySQLRequestUtils::flush_buffer_internal(easy_buf_t *send_buf, // wait for wake up by IO thread in `process' callback { - ObWaitEventGuard guard(ObWaitEventIds::MYSQL_RESPONSE_WAIT_CLIENT, 0, 0, 0); + ObWaitEventGuard guard(ObWaitEventIds::MYSQL_RESPONSE_WAIT_CLIENT, 0); easy_client_wait(&wait_obj, 1); } diff --git a/deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp b/deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp index 02aa124295..4be82e2276 100644 --- a/deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp +++ b/deps/oblib/src/rpc/obmysql/ob_sql_nio.cpp @@ -34,6 +34,8 @@ #include #include "rpc/obrpc/ob_listener.h" #include "common/ob_clock_generator.h" +#include "lib/ash/ob_active_session_guard.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase::common; @@ -503,6 +505,7 @@ public: ObSqlSockSession* sess = (ObSqlSockSession *)sess_; return sess->on_disconnect(); } + void* get_sql_session_info() { return sql_session_info_; } void set_sql_session_info(void* sess) { sql_session_info_ = sess; } void reset_sql_session_info() { ATOMIC_STORE(&sql_session_info_, NULL); } bool sql_session_info_is_null() { return NULL == ATOMIC_LOAD(&sql_session_info_); } @@ -576,6 +579,19 @@ int get_fd_from_sess(void *sess) return fd; } +void* get_sql_sess_from_sess(void *sess) +{ + ObSqlSock *sock = nullptr; + void* sql_sess = nullptr; + if (OB_NOT_NULL(sess)) { + sock = sess2sock(sess); + } + if (OB_NOT_NULL(sock) && !sock->sql_session_info_is_null()) { + sql_sess = sock->get_sql_session_info(); + } + return sql_sess; +} + int ObSqlSock::set_ssl_enabled() { int ret = OB_SUCCESS; @@ -928,7 +944,12 @@ private: void handle_epoll_event() { const int maxevents = 512; struct epoll_event events[maxevents]; - int cnt = ob_epoll_wait(epfd_, events, maxevents, 1000); + int cnt = 0; + { + common::ObBKGDSessInActiveGuard inactive_guard; + cnt = ob_epoll_wait(epfd_, events, maxevents, 1000); + } + for(int i = 0; i < cnt; i++) { uint64_t num64 = events[i].data.u64; if (is_wrapped_fd(num64)) { @@ -1236,6 +1257,7 @@ void ObSqlNio::destroy() void ObSqlNio::run(int64_t idx) { if (NULL != impl_) { + common::ObBackGroundSessionGuard backgroud_session_guard(GET_TENANT_ID(), THIS_WORKER.get_group_id()); lib::set_thread_name("sql_nio", idx); // SET_GROUP_ID(OBCG_SQL_NIO); while(!has_set_stop() && !(OB_NOT_NULL(&lib::Thread::current()) ? lib::Thread::current().has_set_stop() : false)) { diff --git a/deps/oblib/src/rpc/obmysql/obsm_struct.h b/deps/oblib/src/rpc/obmysql/obsm_struct.h index 583c07a679..5a55a863d3 100644 --- a/deps/oblib/src/rpc/obmysql/obsm_struct.h +++ b/deps/oblib/src/rpc/obmysql/obsm_struct.h @@ -81,6 +81,7 @@ public: client_addr_port_ = 0; client_create_time_ = 0; has_service_name_ = false; + di_ = nullptr; logined_ = false; } @@ -225,6 +226,7 @@ public: int64_t client_create_time_; bool has_service_name_; bool logined_; + common::ObDiagnosticInfo *di_; }; } // end of namespace observer } // end of namespace oceanbase diff --git a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp index 43cf222518..49547c204c 100644 --- a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp @@ -34,6 +34,7 @@ #include "rpc/frame/ob_net_easy.h" #include "rpc/frame/ob_req_transport.h" #include "io/easy_negotiation.h" +#include "lib/ash/ob_active_session_guard.h" extern "C" { extern int ob_epoll_wait(int __epfd, struct epoll_event *__events, @@ -420,7 +421,11 @@ void ObNetKeepAlive::do_server_loop() ob_abort(); } while (!has_set_stop()) { - int cnt = ob_epoll_wait(epfd, events, sizeof events/sizeof events[0], 1000); + int cnt = 0; + { + common::ObBKGDSessInActiveGuard inactive_guard; + cnt = ob_epoll_wait(epfd, events, sizeof events/sizeof events[0], 1000); + } ObTimeGuard timeguard_server("net_keepalive_server_loop", 100 * 1000); for (int i = 0; i < cnt; i++) { struct server *s = (struct server *)events[i].data.ptr; @@ -625,7 +630,7 @@ int ret = OB_SUCCESS; int64_t now = get_usec(); int64_t past = now - last_check_ts; if (past < KEEPALIVE_INTERVAL) { - ob_usleep(KEEPALIVE_INTERVAL - past); + ob_usleep(KEEPALIVE_INTERVAL - past, true/*is_idle_sleep*/); } last_check_ts = get_usec(); // traverse all registed dest, send keepalive data, try to receive response and check if the dest is available diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_endec.h b/deps/oblib/src/rpc/obrpc/ob_rpc_endec.h index decdb76fc2..cd2eba9eda 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_endec.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_endec.h @@ -17,6 +17,7 @@ #include "rpc/obrpc/ob_rpc_packet.h" #include "rpc/obrpc/ob_rpc_result_code.h" #include "lib/compress/ob_compressor_pool.h" +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -44,6 +45,7 @@ template int64_t session_id = 0 ) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_encode); int ret = common::OB_SUCCESS; ObRpcPacket pkt; const int64_t header_sz = pkt.get_header_size(); @@ -151,6 +153,7 @@ template template int rpc_decode_resp(const char* resp_buf, int64_t resp_sz, T& result, ObRpcPacket &pkt, ObRpcResultCode &rcode) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_decode); int ret = common::OB_SUCCESS; int64_t pos = 0; if (OB_FAIL(pkt.decode(resp_buf, resp_sz))) { diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet.h index 226cfd4db5..192a93100b 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet.h @@ -103,6 +103,11 @@ public: return name; } + const char *name_of_pcode(ObRpcPacketCode code) const + { + return name_of_idx(idx_of_pcode(code)); + } + const char *label_of_idx(int64_t idx) const { const char *name = "Unknown"; diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_processor_base.cpp b/deps/oblib/src/rpc/obrpc/ob_rpc_processor_base.cpp index b0d59a535a..4680d5ff29 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_processor_base.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_processor_base.cpp @@ -31,6 +31,7 @@ #include "rpc/obrpc/ob_rpc_processor_base.h" #include "rpc/obrpc/ob_rpc_net_handler.h" #include "rpc/obrpc/ob_poc_rpc_server.h" +#include "lib/ash/ob_active_session_guard.h" using namespace oceanbase::common; @@ -167,6 +168,7 @@ int ObRpcProcessorBase::update_data_version() int ObRpcProcessorBase::deserialize() { int ret = OB_SUCCESS; + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_decode); if (OB_ISNULL(rpc_pkt_)) { ret = OB_ERR_UNEXPECTED; RPC_OBRPC_LOG(ERROR, "rpc_pkt_ should not be NULL", K(ret)); @@ -498,6 +500,7 @@ int ObRpcProcessorBase::part_response(const int retcode, bool is_last) // serialize if (OB_SUCC(ret)) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_encode); if (OB_ISNULL(using_buffer_)) { ret = OB_ERR_UNEXPECTED; RPC_OBRPC_LOG(ERROR, "using_buffer_ is NULL", K(ret)); diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.h b/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.h index 7dd7fc77a0..1c738b9119 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.h @@ -27,6 +27,7 @@ #include "rpc/obrpc/ob_rpc_proxy_macros.h" #include "rpc/obrpc/ob_rpc_processor.h" #include "rpc/obrpc/ob_rpc_opts.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.ipp b/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.ipp index 7a15b3e716..a62b1a476b 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.ipp +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_proxy.ipp @@ -23,6 +23,7 @@ #include "lib/trace/ob_trace.h" #include "rpc/obrpc/ob_rpc_stat.h" #include "rpc/obrpc/ob_irpc_extra_payload.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { @@ -164,16 +165,18 @@ int SSHandle::get_more(typename pcodeStruct::Response &result) } int64_t pos = 0; - if (OB_FAIL(ret)) { - } else if (OB_FAIL(rcode_.deserialize(buf, len, pos))) { - RPC_OBRPC_LOG(WARN, "deserialize result code fail", K(ret)); - } else if (rcode_.rcode_ != OB_SUCCESS) { - ret = rcode_.rcode_; - RPC_OBRPC_LOG(WARN, "execute rpc fail", K(ret)); - } else if (OB_FAIL(common::serialization::decode(buf, len, pos, result))) { - RPC_OBRPC_LOG(WARN, "deserialize result fail", K(ret)); - } else { - has_more_ = r.pkt()->is_stream_next(); + if (OB_SUCC(ret)) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_decode); + if (OB_FAIL(rcode_.deserialize(buf, len, pos))) { + RPC_OBRPC_LOG(WARN, "deserialize result code fail", K(ret)); + } else if (rcode_.rcode_ != OB_SUCCESS) { + ret = rcode_.rcode_; + RPC_OBRPC_LOG(WARN, "execute rpc fail", K(ret)); + } else if (OB_FAIL(common::serialization::decode(buf, len, pos, result))) { + RPC_OBRPC_LOG(WARN, "deserialize result fail", K(ret)); + } else { + has_more_ = r.pkt()->is_stream_next(); + } } // free the uncompress buffer @@ -361,6 +364,7 @@ int ObRpcProxy::AsyncCB::decode(void *pkt) } } if (OB_SUCC(ret)) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_decode); if (OB_FAIL(rcode_.deserialize(buf, len, pos))) { RPC_OBRPC_LOG(WARN, "decode result code fail", K(*rpkt), K(ret)); } else if (rcode_.rcode_ != OB_SUCCESS) { @@ -473,9 +477,15 @@ int ObRpcProxy::rpc_call(ObRpcPacketCode pcode, const Input &args, } else if (NULL == req.pkt() || NULL == req.buf()) { ret = OB_ALLOCATE_MEMORY_FAILED; RPC_OBRPC_LOG(WARN, "request packet is NULL", K(req), K(ret)); - } else if (OB_FAIL(common::serialization::encode( - req.buf(), payload, pos, args))) { + } else if (FALSE_IT(nullptr != ObLocalDiagnosticInfo::get() + ? (ObLocalDiagnosticInfo::get()->get_ash_stat().in_rpc_encode_ = true) + : false)) { + } else if (OB_FAIL(common::serialization::encode(req.buf(), payload, pos, args))) { + GET_DIAGNOSTIC_INFO->get_ash_stat().in_rpc_encode_ = false; RPC_OBRPC_LOG(WARN, "serialize argument fail", K(pos), K(payload), K(ret)); + } else if (FALSE_IT(nullptr != ObLocalDiagnosticInfo::get() + ? (ObLocalDiagnosticInfo::get()->get_ash_stat().in_rpc_encode_ = false) + : false)) { } else if (OB_FAIL(fill_extra_payload(req, payload, pos))) { RPC_OBRPC_LOG(WARN, "fill extra payload fail", K(ret), K(pos), K(payload)); } else if (OB_FAIL(init_pkt(req.pkt(), pcode, opts, false))) { @@ -518,6 +528,7 @@ int ObRpcProxy::rpc_call(ObRpcPacketCode pcode, const Input &args, int64_t pos = 0; if (OB_SUCC(ret)) { UNIS_VERSION_GUARD(r.pkt()->get_unis_version()); + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_decode); if (OB_FAIL(rcode_.deserialize(buf, len, pos))) { RPC_OBRPC_LOG(WARN, "deserialize result code fail", K(ret)); } else { @@ -602,6 +613,7 @@ int ObRpcProxy::rpc_post(const typename pcodeStruct::Request &args, bool use_context = false; bool has_trace_info = false; if (OB_SUCC(ret) && need_compressed) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_encode); int64_t tmp_pos = 0; if (OB_FAIL(ObCompressorPool::get_instance().get_compressor(compressor_type_, compressor))) { @@ -700,6 +712,7 @@ int ObRpcProxy::rpc_post(const typename pcodeStruct::Request &args, } if (!need_compressed) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_rpc_encode); if (OB_FAIL(common::serialization::encode(req.buf(), payload, pos, args))) { RPC_OBRPC_LOG(WARN, "serialize argument fail", K(ret)); } else if (OB_FAIL(fill_extra_payload(req, payload, pos))) { diff --git a/deps/oblib/src/rpc/pnio/io/eloop.c b/deps/oblib/src/rpc/pnio/io/eloop.c index 73035beea7..134288bd71 100644 --- a/deps/oblib/src/rpc/pnio/io/eloop.c +++ b/deps/oblib/src/rpc/pnio/io/eloop.c @@ -60,7 +60,9 @@ void eloop_fire(eloop_t* ep, sock_t* s) { static void eloop_refire(eloop_t* ep, int64_t timeout) { const int maxevents = 512; struct epoll_event events[maxevents]; - int cnt = ob_epoll_wait(ep->fd, events, maxevents, timeout); + int cnt = 0; + cnt = ob_epoll_wait(ep->fd, events, maxevents, timeout); + for(int i = 0; i < cnt; i++) { sock_t* s = (sock_t*)events[i].data.ptr; s->mask |= events[i].events; diff --git a/deps/oblib/unittest/CMakeLists.txt b/deps/oblib/unittest/CMakeLists.txt index fb43b5f0e6..d335195313 100644 --- a/deps/oblib/unittest/CMakeLists.txt +++ b/deps/oblib/unittest/CMakeLists.txt @@ -4,11 +4,13 @@ target_link_libraries(oblib_testbase INTERFACE -lgmock -lgtest) file(COPY run_tests.sh DESTINATION .) enable_testing() +add_definitions(-DOB_UNITTEST) + function(oblib_addtest mainfile) get_filename_component(testname ${mainfile} NAME_WE) add_executable(${testname} ${mainfile}) add_test(${testname} ${testname}) - target_link_libraries(${testname} PRIVATE oblib oblib_testbase -static-libgcc -static-libstdc++ ${ARGN} + target_link_libraries(${testname} PRIVATE -Wl,--whole-archive mock_di -Wl,--no-whole-archive oblib oblib_testbase -static-libgcc -static-libstdc++ ${ARGN} ${OB_RELRO_FLAG} -Wl,-T,${CMAKE_SOURCE_DIR}/rpm/ld.lds) endfunction() diff --git a/deps/oblib/unittest/lib/CMakeLists.txt b/deps/oblib/unittest/lib/CMakeLists.txt index eb577e0b09..4e67b5c4df 100644 --- a/deps/oblib/unittest/lib/CMakeLists.txt +++ b/deps/oblib/unittest/lib/CMakeLists.txt @@ -98,9 +98,7 @@ oblib_addtest(resource/test_resource_mgr.cpp) # oblib_addtest(restore/test_common_storage.cpp) #oblib_addtest(restore/test_storage_info.cpp) #oblib_addtest(restore/test_storage.cpp) -oblib_addtest(stat/test_di_cache.cpp) -oblib_addtest(stat/test_diagnose_info.cpp) -oblib_addtest(stat/test_stat_template.cpp) +oblib_addtest(stat/test_diagnostic_info.cpp) oblib_addtest(string/test_fixed_length_string.cpp) oblib_addtest(task/test_timer.cpp) oblib_addtest(task/test_cancel_task.cpp) diff --git a/deps/oblib/unittest/lib/stat/test_di_cache.cpp b/deps/oblib/unittest/lib/stat/test_di_cache.cpp index 01e2f957ed..22b7910cd2 100644 --- a/deps/oblib/unittest/lib/stat/test_di_cache.cpp +++ b/deps/oblib/unittest/lib/stat/test_di_cache.cpp @@ -33,7 +33,6 @@ public: virtual void run(int64_t idx) { uint64_t session_id = (long)idx % 2 + 1; - ObSessionStatEstGuard session_guard(1, session_id, true /*is_multi_thread_plan*/); ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); ASSERT_TRUE(NULL != di); for (int i = 0; i < update_cnt; i++) { @@ -59,7 +58,6 @@ TEST(ObDICache, multithread) }, 1); pool1.start(false); cotesting::FlexPool pool2([&stop, &round]{ - ObSessionStatEstGuard guard(1,1); while (!stop) { //uint32_t tenant_id = (uint32_t)rand.get(1+(uint64_t)arg*100, 100+(uint64_t)arg*100); for (int64_t i = 0; i < 1000; ++i) { @@ -85,24 +83,24 @@ TEST(ObDICache, multithread) } -TEST(ObDICache, session_multi_threads) -{ - ObDISessionCollect *collect; - TestSessionMultiThread tester; - ObSEArray, 10> session_status; - const int64_t th_cnt = 10; - tester.set_thread_count(th_cnt); - tester.start(); - tester.wait(); - ObDISessionCache::get_instance().get_the_diag_info(1, collect); - ASSERT_EQ(th_cnt * update_cnt / 2, collect->base_value_.get_add_stat_stats().get(ObStatEventIds::IO_READ_COUNT)->stat_value_); - ObDISessionCache::get_instance().get_all_diag_info(session_status); - ASSERT_EQ(2, session_status.count()); - for (int i = 0; i < session_status.count(); i++) { - collect = session_status.at(i).second; - ASSERT_EQ(th_cnt * update_cnt / 2, collect->base_value_.get_add_stat_stats().get(ObStatEventIds::IO_READ_COUNT)->stat_value_); - } -} +// TEST(ObDICache, session_multi_threads) +// { +// ObDISessionCollect *collect; +// TestSessionMultiThread tester; +// ObSEArray, 10> session_status; +// const int64_t th_cnt = 10; +// tester.set_thread_count(th_cnt); +// tester.start(); +// tester.wait(); +// ObDISessionCache::get_instance().get_the_diag_info(1, collect); +// ASSERT_EQ(th_cnt * update_cnt / 2, collect->base_value_.get_add_stat_stats().get(ObStatEventIds::IO_READ_COUNT)->stat_value_); +// ObDISessionCache::get_instance().get_all_diag_info(session_status); +// ASSERT_EQ(2, session_status.count()); +// for (int i = 0; i < session_status.count(); i++) { +// collect = session_status.at(i).second; +// ASSERT_EQ(th_cnt * update_cnt / 2, collect->base_value_.get_add_stat_stats().get(ObStatEventIds::IO_READ_COUNT)->stat_value_); +// } +// } TEST(ObDICache, tenant) { @@ -113,7 +111,6 @@ TEST(ObDICache, tenant) cotesting::FlexPool pool([&stop]{ while (!stop) { for (uint64_t i = 1; i < 100000; i++) { - ObSessionStatEstGuard guard(ObRandom::rand(1, 100), i); EVENT_ADD(RPC_PACKET_IN, 1); } sleep(1); @@ -139,7 +136,6 @@ TEST(ObDISessionCache, multithread) ths[i] = std::thread([&]() { while (!stop) { for (uint64_t i = 1; i < 100000; i++) { - ObSessionStatEstGuard guard(1,i); EVENT_ADD(RPC_PACKET_IN, 1); } sleep(1); diff --git a/deps/oblib/unittest/lib/stat/test_diagnose_info.cpp b/deps/oblib/unittest/lib/stat/test_diagnose_info.cpp index a748e513a7..e5d262825e 100644 --- a/deps/oblib/unittest/lib/stat/test_diagnose_info.cpp +++ b/deps/oblib/unittest/lib/stat/test_diagnose_info.cpp @@ -39,120 +39,121 @@ namespace common ret; \ }) -TEST(ObDiagnoseSessionInfo, guard) -{ - EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); - EXPECT_EQ(1, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); - EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); - { - ObTenantStatEstGuard tenant_guard(2); - EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); - EXPECT_EQ(2, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); - EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); - { - ObTenantStatEstGuard tenant_guard(3); - EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); - EXPECT_EQ(3, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); - EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); - } - EXPECT_EQ(2, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); - } - EXPECT_EQ(1, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); -} +// TEST(ObDiagnoseSessionInfo, guard) +// { +// EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); +// EXPECT_EQ(1, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); +// EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); +// { +// ObTenantStatEstGuard tenant_guard(2); +// EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); +// EXPECT_EQ(2, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); +// EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); +// { +// ObTenantStatEstGuard tenant_guard(3); +// EVENT_INC(SYS_TIME_MODEL_ENCRYPT_CPU); +// EXPECT_EQ(3, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); +// EXPECT_EQ(1, TENANT_EVENT_GET(ObStatEventIds::SYS_TIME_MODEL_ENCRYPT_CPU)); +// } +// EXPECT_EQ(2, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); +// } +// EXPECT_EQ(1, GET_TSI(ObSessionDIBuffer)->get_tenant_id()); +// } -TEST(ObDISessionCache, multithread) -{ - ObDiagnoseSessionInfo info; - ObDiagnoseTenantInfo tenant_info; - ObWaitEventHistory &history = info.get_event_history(); - for (uint64_t i = 0; i <2; i++) { - info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); - EXPECT_EQ(1, history.curr_pos_); - EXPECT_EQ(1, history.item_cnt_); - EXPECT_EQ(1, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - ::usleep(1); - info.notify_wait_end(&tenant_info); - EXPECT_EQ(1, history.curr_pos_); - EXPECT_EQ(1, history.item_cnt_); - EXPECT_EQ(0, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - EXPECT_EQ(2, history.curr_pos_); - EXPECT_EQ(2, history.item_cnt_); - EXPECT_EQ(1, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - EXPECT_EQ(3, history.curr_pos_); - EXPECT_EQ(3, history.item_cnt_); - EXPECT_EQ(2, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_end(&tenant_info); - EXPECT_EQ(3, history.curr_pos_); - EXPECT_EQ(3, history.item_cnt_); - EXPECT_EQ(2, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - EXPECT_EQ(4, history.curr_pos_); - EXPECT_EQ(4, history.item_cnt_); - EXPECT_EQ(3, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_end(&tenant_info); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - info.notify_wait_end(&tenant_info); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - EXPECT_EQ(7, history.curr_pos_); - EXPECT_EQ(7, history.item_cnt_); - EXPECT_EQ(6, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(2, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); - EXPECT_EQ(8, history.curr_pos_); - EXPECT_EQ(8, history.item_cnt_); - EXPECT_EQ(7, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(3, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_end(&tenant_info); - info.notify_wait_end(&tenant_info); - EXPECT_EQ(8, history.curr_pos_); - EXPECT_EQ(8, history.item_cnt_); - EXPECT_EQ(7, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - info.notify_wait_end(&tenant_info); - if (1 == i) { - info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); - ::usleep(1); - info.notify_wait_end(&tenant_info); - info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); - ::usleep(1); - info.notify_wait_end(&tenant_info); - info.notify_wait_end(&tenant_info); - EXPECT_EQ(2, history.curr_pos_); - EXPECT_EQ(2, history.item_cnt_); - EXPECT_EQ(0, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - EXPECT_EQ(history.items_[8].wait_begin_time_, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].wait_begin_time_); - EXPECT_EQ(history.items_[9].wait_end_time_, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].wait_end_time_); - } else { - info.notify_wait_end(&tenant_info); - EXPECT_EQ(1, history.curr_pos_); - EXPECT_EQ(1, history.item_cnt_); - EXPECT_EQ(0, history.nest_cnt_); - EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); - EXPECT_EQ(0, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); - } - info.reset(); - } -} +// disallow nested wait event for now. +// TEST(ObDISessionCache, multithread) +// { +// ObDiagnoseSessionInfo info; +// ObDiagnoseTenantInfo tenant_info; +// ObWaitEventHistory &history = info.get_event_history(); +// for (uint64_t i = 0; i <2; i++) { +// info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(1, history.curr_pos_); +// EXPECT_EQ(1, history.item_cnt_); +// EXPECT_EQ(1, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// ::usleep(1); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::DEFAULT_COND_WAIT].is_phy_, false); +// EXPECT_EQ(1, history.curr_pos_); +// EXPECT_EQ(1, history.item_cnt_); +// EXPECT_EQ(0, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(2, history.curr_pos_); +// EXPECT_EQ(2, history.item_cnt_); +// EXPECT_EQ(1, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(3, history.curr_pos_); +// EXPECT_EQ(3, history.item_cnt_); +// EXPECT_EQ(2, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// EXPECT_EQ(3, history.curr_pos_); +// EXPECT_EQ(3, history.item_cnt_); +// EXPECT_EQ(2, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(4, history.curr_pos_); +// EXPECT_EQ(4, history.item_cnt_); +// EXPECT_EQ(3, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(7, history.curr_pos_); +// EXPECT_EQ(7, history.item_cnt_); +// EXPECT_EQ(6, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(2, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_begin(ObWaitEventIds::MT_READ_LOCK_WAIT, 0, 0, 0, 0); +// EXPECT_EQ(8, history.curr_pos_); +// EXPECT_EQ(8, history.item_cnt_); +// EXPECT_EQ(7, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(3, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// EXPECT_EQ(8, history.curr_pos_); +// EXPECT_EQ(8, history.item_cnt_); +// EXPECT_EQ(7, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(1, history.items_[(history.current_wait_ + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// if (1 == i) { +// info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); +// ::usleep(1); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::DEFAULT_COND_WAIT].is_phy_, false); +// info.notify_wait_begin(ObWaitEventIds::DEFAULT_COND_WAIT, 0, 0, 0, 0); +// ::usleep(1); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::DEFAULT_COND_WAIT].is_phy_, false); +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::MT_READ_LOCK_WAIT].is_phy_, false); +// EXPECT_EQ(2, history.curr_pos_); +// EXPECT_EQ(2, history.item_cnt_); +// EXPECT_EQ(0, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::MT_READ_LOCK_WAIT, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// EXPECT_EQ(history.items_[8].wait_begin_time_, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].wait_begin_time_); +// EXPECT_EQ(history.items_[9].wait_end_time_, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].wait_end_time_); +// } else { +// info.notify_wait_end(&tenant_info, OB_WAIT_EVENTS[ObWaitEventIds::DEFAULT_COND_WAIT].is_phy_, false); +// EXPECT_EQ(1, history.curr_pos_); +// EXPECT_EQ(1, history.item_cnt_); +// EXPECT_EQ(0, history.nest_cnt_); +// EXPECT_EQ(ObWaitEventIds::DEFAULT_COND_WAIT, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].event_no_); +// EXPECT_EQ(0, history.items_[(history.curr_pos_ - 1 + SESSION_WAIT_HISTORY_CNT) % SESSION_WAIT_HISTORY_CNT].level_); +// } +// info.reset(); +// } +// } TEST(ObDiagnoseSessionInfo, normal) { @@ -161,30 +162,29 @@ TEST(ObDiagnoseSessionInfo, normal) ObWaitEventDesc max_wait1; ObWaitEventStat total_wait1; { - ObSessionStatEstGuard session_guard(1, 1); { ObMaxWaitGuard max_guard(&max_wait); ObTotalWaitGuard total_guard(&total_wait); for (int i = 0; i < 30; i++) { { - ObWaitEventGuard wait_guard(i); + ObWaitEventGuard wait_guard(0); ::usleep(i); } ObMaxWaitGuard max_guard1(&max_wait1); ObTotalWaitGuard total_guard1(&total_wait1); { - ObWaitEventGuard wait_guard1(29-i); + ObWaitEventGuard wait_guard1(0); ::usleep(i*200); } } - ObDiagnoseSessionInfo *info = ObDiagnoseSessionInfo::get_local_diagnose_info(); + ObDiagnosticInfo *info = ObDiagnoseSessionInfo::get_local_diagnose_info(); EXPECT_EQ(1, info->get_tenant_id()); ObWaitEventDesc *last_wait = NULL; info->get_event_history().get_last_wait(last_wait); EXPECT_EQ(0, last_wait->event_no_); EXPECT_EQ(0, info->get_curr_wait().event_no_); //EXPECT_EQ(0, max_wait.event_no_); - EXPECT_EQ(54, total_wait.total_waits_); + EXPECT_EQ(60, total_wait.total_waits_); uint64_t begin_time = ::oceanbase::common::ObTimeUtility::current_time(); for (int i = 0; i < 1000000; i++) { ObWaitEventGuard wait_guard(ObWaitEventIds::MT_READ_LOCK_WAIT); diff --git a/deps/oblib/unittest/lib/stat/test_diagnostic_info.cpp b/deps/oblib/unittest/lib/stat/test_diagnostic_info.cpp new file mode 100644 index 0000000000..21e813ebc9 --- /dev/null +++ b/deps/oblib/unittest/lib/stat/test_diagnostic_info.cpp @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX COMMON + +#include +#define private public +#define protected public +#include "lib/stat/ob_diagnostic_info_container.h" +#undef private +#undef protected + +namespace oceanbase +{ +namespace common +{ + +TEST(ObDiagnosticInfo, obj) +{ + int ret = OB_SUCCESS; + ObWaitEventPool wait_event_pool(1, true, lib::is_mini_mode(), get_cpu_count()); + wait_event_pool.init(); + ObDiagnosticInfo test; + ASSERT_EQ(test.init(1, 1, 1, wait_event_pool), OB_SUCCESS); + + ObWaitEventStat *cur = nullptr; + for (int i = 1; i < ObWaitEventIds::WAIT_EVENT_DEF_END; i++) { + ASSERT_EQ(test.get_event_stats().get( + static_cast(i), cur), + OB_ITEM_NOT_SETTED); + ASSERT_EQ(nullptr, cur); + } + for (int i = 1; i < ObWaitEventIds::WAIT_EVENT_DEF_END; i++) { + ASSERT_EQ(test.get_event_stats().get_and_set( + static_cast(i), cur), + OB_SUCCESS); + ASSERT_NE(nullptr, cur); + ObWaitEventStat *prev = cur; + ASSERT_EQ(test.get_event_stats().get_and_set( + static_cast(i), cur), + OB_SUCCESS); + ASSERT_EQ(cur, prev); + ASSERT_EQ(test.get_event_stats().get( + static_cast(i), cur), + OB_SUCCESS); + ASSERT_EQ(cur, prev); + if (i <= WAIT_EVENT_LIST_THRESHOLD) { + ASSERT_EQ(test.get_event_stats().rule_, ObWaitEventRule::LIST); + } else { + ASSERT_EQ(test.get_event_stats().rule_, ObWaitEventRule::ARRAY); + } + cur->total_timeouts_ = i; + cur->max_wait_ = i; + cur->total_waits_ = i; + cur->total_waits_ = i; + int cnt = 0; + auto fn = [&cnt](oceanbase::common::ObWaitEventIds::ObWaitEventIdEnum event_no, + const ObWaitEventStat &stat) { + ++cnt; + ASSERT_EQ(stat.total_timeouts_, event_no); + ASSERT_EQ(stat.max_wait_, event_no); + ASSERT_EQ(stat.total_waits_, event_no); + ASSERT_EQ(stat.total_waits_, event_no); + }; + test.get_event_stats().for_each(fn); + ASSERT_EQ(cnt, i); + } + for (int i = 0; i < ObStatEventIds::STAT_EVENT_ADD_END; i++) { + test.get_add_stat_stats().get(i)->add(i); + } +} + +TEST(ObDiagnosticInfo, summary) +{ + int64_t session_id = 0; + ObWaitEventPool wait_event_pool(1, true, lib::is_mini_mode(), get_cpu_count()); + wait_event_pool.init(); + ObFixedClassAllocator di_collector_allocator(lib::ObMemAttr(1, "DICollector"), 1, 4); + DiagnosticInfoValueAlloc value_alloc( + &di_collector_allocator); + ObBaseDiagnosticInfoSummary sum(value_alloc); + int64_t session_sum = 0, wait_time_sum = 0; + ASSERT_EQ(sum.init(4), OB_SUCCESS); + int slot_cnt = 0; + for (int tenant_id = 1; tenant_id <= 20; tenant_id++) { + for (int group_id = 1; group_id <= 20; group_id++) { + ++slot_cnt; + for (int i = 0; i < 10; i++) { + ObDiagnosticInfo cur; + ASSERT_EQ(cur.init(tenant_id, group_id, session_id++, wait_event_pool), OB_SUCCESS); + + for (int i = 1; i <= tenant_id; i++) { + ObWaitEventStat *wait_event = nullptr; + ASSERT_EQ( + cur.get_event_stats().get_and_set( + static_cast(i), wait_event), + OB_SUCCESS); + ASSERT_NE(nullptr, wait_event); + if (i <= WAIT_EVENT_LIST_THRESHOLD) { + ASSERT_EQ(cur.get_event_stats().rule_, ObWaitEventRule::LIST); + } else { + ASSERT_EQ(cur.get_event_stats().rule_, ObWaitEventRule::ARRAY); + } + wait_event->total_waits_ = session_id; + wait_time_sum += session_id; + ASSERT_EQ( + cur.get_event_stats().get_and_set( + static_cast(i), wait_event), + OB_SUCCESS); + ASSERT_EQ(wait_event->total_waits_, session_id); + } + for (int i = 0; i < tenant_id; i++) { + cur.get_add_stat_stats().get(i)->add(session_id); + session_sum += session_id; + } + ASSERT_EQ(sum.add_diagnostic_info(cur), OB_SUCCESS); + } + } + } + + // verify summary info + ObWaitEventStatArray events; + ObStatEventAddStatArray stats; + ObDiagnosticInfoCollector *cur = nullptr; + ObBaseDiagnosticInfoSummary::SummaryMap::Iterator iter(sum.collectors_); + int summary_collect_count = 0; + while (OB_NOT_NULL(iter.next(cur))) { + cur->get_all_add_stats(stats); + cur->get_all_events(events); + ++summary_collect_count; + } + ASSERT_EQ(summary_collect_count, slot_cnt); + int64_t verified_event_sum = 0; + int64_t verified_stat_sum = 0; + for (int i = 1; i < WAIT_EVENTS_TOTAL; i++) { + verified_event_sum += events.get(i)->total_waits_; + } + for (int i = 0; i < ObStatEventIds::STAT_EVENT_ADD_END; i++) { + verified_stat_sum += stats.get(i)->get_stat_value(); + } + ASSERT_EQ(verified_stat_sum, session_sum); + ASSERT_EQ(verified_event_sum, wait_time_sum); +} + +TEST(ObDiagnosticInfo, container) +{ + for (int cpu_cnt = 1; cpu_cnt < 128; cpu_cnt++) { + ObDiagnosticInfoContainer container(cpu_cnt); + ASSERT_EQ(container.init(cpu_cnt), OB_SUCCESS); + ObArray arr; + ObDiagnosticInfo *cur = nullptr; + int64_t session_id = 0; + int cnt = 0; + for (int group_id = 0; group_id < 10; group_id++) { + for (int i = 0; i < 20; i++) { + ASSERT_EQ( + OB_SUCCESS, container.acquire_diagnostic_info(cpu_cnt, group_id, session_id++, cur)); + ASSERT_EQ(arr.push_back(cur), OB_SUCCESS); + } + } + ASSERT_EQ(session_id, arr.size()); + + for (int group_id = 0; group_id < 10; group_id++) { + for (int i = 0; i < 20; i++) { + ASSERT_EQ(arr.pop_back(cur), OB_SUCCESS); + ASSERT_EQ(OB_SUCCESS, container.return_diagnostic_info(cur)); + } + } + int remains = 0; + auto fn = [&remains](const ObDiagnosticInfo &) {++remains;}; + ASSERT_EQ(remains, 0); + } +} + +} // namespace common +} // namespace oceanbase + +int main(int argc, char **argv) +{ + oceanbase::common::ObLogger::get_logger().set_log_level("INFO"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/deps/oblib/unittest/lib/stat/test_stat_template.cpp b/deps/oblib/unittest/lib/stat/test_stat_template.cpp index 0b5571d50e..f04a0fe4e6 100644 --- a/deps/oblib/unittest/lib/stat/test_stat_template.cpp +++ b/deps/oblib/unittest/lib/stat/test_stat_template.cpp @@ -23,28 +23,15 @@ TEST(ObStatArray, normal) int ret = OB_SUCCESS; ObWaitEventStatArray stats1; ObWaitEventStatArray stats2; - ObWaitEventStatArray::Iterator iter; - const ObWaitEventStat *item = NULL; stats1.get(0)->total_waits_ = 1; stats1.get(3)->total_waits_ = 2; stats2.get(4)->total_waits_ = 3; stats1.add(stats2); - stats1.get_iter(iter); - ret = iter.get_next(item); - ASSERT_EQ(OB_SUCCESS, ret); - ASSERT_EQ(1, item->total_waits_); - ret = iter.get_next(item); - ASSERT_EQ(OB_SUCCESS, ret); - ASSERT_EQ(2, item->total_waits_); - ret = iter.get_next(item); - ASSERT_EQ(OB_SUCCESS, ret); - ASSERT_EQ(3, item->total_waits_); - ret = iter.get_next(item); - ASSERT_EQ(OB_ITER_END, ret); - - + ASSERT_EQ(1, stats1.get(0)->total_waits_); + ASSERT_EQ(2, stats1.get(3)->total_waits_); + ASSERT_EQ(3, stats1.get(4)->total_waits_); } } diff --git a/deps/oblib/unittest/lib/trace/test_trace_event.cpp b/deps/oblib/unittest/lib/trace/test_trace_event.cpp index a8266ef2d7..9dfa4ff1ba 100644 --- a/deps/oblib/unittest/lib/trace/test_trace_event.cpp +++ b/deps/oblib/unittest/lib/trace/test_trace_event.cpp @@ -10,6 +10,7 @@ * See the Mulan PubL v2 for more details. */ +#include "deps/oblib/unittest/lib/unittest_diagnostic_info_util.h" #include "lib/trace/ob_trace_event.h" #include #include "lib/utility/ob_test_util.h" @@ -164,5 +165,6 @@ int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc,argv); OB_LOGGER.set_log_level("INFO"); + oceanbase::lib::ObUnitTestEnableDiagnoseGuard enable_guard; return RUN_ALL_TESTS(); } diff --git a/deps/oblib/unittest/lib/unittest_diagnostic_info_util.h b/deps/oblib/unittest/lib/unittest_diagnostic_info_util.h new file mode 100644 index 0000000000..91fd93e459 --- /dev/null +++ b/deps/oblib/unittest/lib/unittest_diagnostic_info_util.h @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_UNITTEST_DIAGNOSTIC_INFO_UTIL_H_ +#define OB_UNITTEST_DIAGNOSTIC_INFO_UTIL_H_ + +#define private public +#define protected public +#include "deps/oblib/src/lib/ob_lib_config.h" +#undef private +#undef protected + +namespace oceanbase +{ +namespace lib +{ + +class ObUnitTestEnableDiagnoseGuard +{ + friend class common::ObBackGroundSessionGuard; + friend class common::ObDiagnosticInfoSwitchGuard; + friend bool is_diagnose_info_enabled(); + friend bool is_trace_log_enabled(); +public: + explicit ObUnitTestEnableDiagnoseGuard() : old_value_(ObPerfModeGuard::get_tl_instance()) + { + ObPerfModeGuard::get_tl_instance() = false; + } + ~ObUnitTestEnableDiagnoseGuard() + { + ObPerfModeGuard::get_tl_instance() = old_value_; + } +private: + bool old_value_; +}; + + +} /* namespace lib */ +} /* namespace oceanbase */ + +#endif /* OB_UNITTEST_DIAGNOSTIC_INFO_UTIL_H_ */ \ No newline at end of file diff --git a/hotfuncs.txt b/hotfuncs.txt index 8783963273..78e327279a 100644 --- a/hotfuncs.txt +++ b/hotfuncs.txt @@ -2,7 +2,6 @@ _ZSt16__introsort_loopIN9oceanbase3lib15IteratorWrapperIPPNS0_3sql17ObChunkDatum _ZSt21__unguarded_partitionIN9oceanbase3lib15IteratorWrapperIPPNS0_3sql17ObChunkDatumStore9StoredRowEEEN9__gnu_cxx5__ops15_Iter_comp_iterINS3_12ObSortOpImpl16CopyableComparerEEEET_SF_SF_SF_T0_ _ZN9oceanbase3sql12ObSortOpImpl7CompareclEPKNS0_17ObChunkDatumStore9StoredRowES6_ _ZN9oceanbase6common21ObNullSafeDatumStrCmpILNS0_15ObCollationTypeE45ELb0ELb1EE3cmpERKNS0_7ObDatumES6_Ri -_ZN9oceanbase6common9ObCharset8strcmpspENS0_15ObCollationTypeEPKclS4_lb _ZL22ob_strnncollsp_utf8mb4PK13ObCharsetInfoPKhmS3_mb _ZL16ob_mb_wc_utf8mb4PK13ObCharsetInfoPmPKhS4_ _ZN9oceanbase6common9ObCharset17is_argument_validENS0_15ObCollationTypeEPKclS4_l @@ -24,6 +23,7 @@ _ZN9oceanbase3sql13ObDASScanIter19inner_get_next_rowsERll _ZN9oceanbase3sql14ObDASMergeIter19inner_get_next_rowsERll _ZN9oceanbase3sql14ObDASMergeIter20clear_evaluated_flagEv _ZN9oceanbase7storage19ObTableScanIterator13get_next_rowsERll +_ZN9oceanbase3sql18ObPushdownOperator20clear_evaluated_flagEv _ZN9oceanbase7storage15ObMultipleMerge13get_next_rowsERll _ZN9oceanbase7storage19ObMultipleScanMerge14can_batch_scanERb _ZThn8_N9oceanbase7storage20ObAggregatedStoreVec8fill_rowERNS_12blocksstable10ObDatumRowE @@ -31,6 +31,8 @@ _ZN9oceanbase7storage15ObMultipleMerge20get_next_normal_rowsERll _ZNK9oceanbase7storage15ObTableReadInfo23get_group_idx_col_indexEv _ZN9oceanbase7storage13ObVectorStore8fill_rowERNS_12blocksstable10ObDatumRowE _ZN9oceanbase3sql18ObPushdownOperator9deep_copyEPKNS_6common8ObIArrayIPNS0_6ObExprEEEl +_ZN9oceanbase7storage19ObMultipleScanMerge14can_batch_scanERb +_ZN9oceanbase7storage15ObMultipleMerge22fill_group_idx_if_needERNS_12blocksstable10ObDatumRowE _ZN9oceanbase7storage15ObMultipleMerge16process_fuse_rowEbRNS_12blocksstable10ObDatumRowERPS3_ _ZN9oceanbase7storage15ObMultipleMerge14check_filteredERKNS_12blocksstable10ObDatumRowERb _ZN9oceanbase7storage15ObMultipleMerge22fill_group_idx_if_needERNS_12blocksstable10ObDatumRowE @@ -56,10 +58,10 @@ _ZN9oceanbase12blocksstableL21nonext_nonext_compareERKNS0_14ObStorageDatumES3_RK _ZNK9oceanbase12blocksstable13ObDatumRowkey7compareERKS1_RKNS0_19ObStorageDatumUtilsERib _ZN9oceanbase6common20ObNullSafeDatumTCCmpILNS0_14ObObjTypeClassE1ELS2_1ELb1EE3cmpERKNS0_7ObDatumES6_Ri _ZN9oceanbase7storage19ObSSTableRowScannerINS0_30ObIndexTreeMultiPassPrefetcherILi32ELi3EEEE18inner_get_next_rowERPKNS_12blocksstable10ObDatumRowE -_ZN9oceanbase6common21ObDiagnoseSessionInfo23get_local_diagnose_infoEv -_ZN9oceanbase6common21ObDiagnoseSessionInfo11update_statEsl +_ZN9oceanbase6common18ObStatEventAddStat3addEl _ZNK9oceanbase7storage19ObSSTableRowScannerINS0_30ObIndexTreeMultiPassPrefetcherILi32ELi3EEEE14can_batch_scanEv _ZNK9oceanbase7storage19ObSSTableRowScannerINS0_30ObIndexTreeMultiPassPrefetcherILi32ELi3EEEE13can_blockscanEv +_ZNK9oceanbase7storage8ObITable16is_major_sstableEv _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE8prefetchEv _ZN9oceanbase8memtable22ObMemtableScanIterator18inner_get_next_rowERPKNS_12blocksstable10ObDatumRowE _ZN9oceanbase5share3SCNaSERKS1_ @@ -94,6 +96,7 @@ _ZN9oceanbase8memtable19ObMvccValueIterator14lock_for_read_ERKNS_6common11ObQuer _ZN9oceanbase7storage29return_array_idx_for_memtableEjjlRKNS0_19ObFixedMetaObjArrayIiEE _ZNK9oceanbase5share3SCN6is_maxEv _ZN9oceanbase12blocksstable11ObRowReader9setup_rowEPKcl +_ZNK9oceanbase5share3SCN6is_maxEv _ZN9oceanbase7storage19ObMultipleScanMerge17prepare_blockscanERNS0_18ObStoreRowIteratorE _ZN9oceanbase7storage19ObSSTableRowScannerINS0_30ObIndexTreeMultiPassPrefetcherILi32ELi3EEEE25refresh_blockscan_checkerERKNS_12blocksstable13ObDatumRowkeyE _ZN9oceanbase7storage20ObRow2ExprsProjector7projectERKNS_6common8ObIArrayIPNS_3sql6ObExprEEEPKNS_12blocksstable14ObStorageDatumEPsRl @@ -174,6 +177,7 @@ _ZN9oceanbase8memtable21ObMemtableGetIterator18inner_get_next_rowERPKNS_12blocks _ZNK9oceanbase7storage16ObReadInfoStruct16get_columns_descEv _ZN9oceanbase12blocksstable23ObIMicroBlockRowScanner5reuseEv _ZN9oceanbase3lib20ObTenantCtxAllocator20inner_common_reallocINS0_10IObjectMgrEEEPvPKvlRKNS0_9ObMemAttrERS1_RT_ +_ZN9oceanbase3lib9IBlockMgr10get_ctx_idEv _ZN9oceanbase3lib20ObTenantCtxAllocator8on_allocERNS0_7AObjectERKNS0_9ObMemAttrE _ZN9oceanbase6common15light_backtraceEPPvi _ZN9oceanbase8observer23ObProcessMallocCallbackclERKNS_3lib9ObMemAttrEl @@ -195,12 +199,12 @@ _ZN9oceanbase3lib17ObMallocAllocator5allocElRKNS0_9ObMemAttrE _ZN9oceanbase7storage20ObTableAccessContext20inc_micro_access_cntEv _ZN9oceanbase8memtable10ObMemtable3getERKNS_7storage16ObTableIterParamERNS2_20ObTableAccessContextERKNS_12blocksstable13ObDatumRowkeyERNS8_10ObDatumRowE _ZNK9oceanbase7storage16ObTableIterParam8is_validEv -_ZN9oceanbase8memtable13ObMemtableKey6encodeERKNS_6common8ObIArrayINS_5share6schema9ObColDescEEEPKNS2_13ObStoreRowkeyE _ZN9oceanbase8memtable12ObMvccEngine3getERNS0_15ObMvccAccessCtxERKNS_6common11ObQueryFlagEPKNS0_13ObMemtableKeyENS_5share6ObLSIDEPS8_RNS0_19ObMvccValueIteratorERNS_7storage19ObStoreRowLockStateE _ZN9oceanbase8memtable13ObQueryEngine3getEPKNS0_13ObMemtableKeyERPNS0_9ObMvccRowEPS2_ _ZN9oceanbase8memtable8ObMtHash6do_getEPKNS0_20ObStoreRowkeyWrapperERPNS0_9ObMvccRowERS4_ _ZNK9oceanbase6common8ObRowkey10murmurhashEm _ZN9oceanbase6common17ObjHashCalculatorILNS0_9ObObjTypeE4ENS0_13ObDefaultHashENS0_5ObObjEE15calc_hash_valueERKS4_mRm +_ZN9oceanbase8memtable13ObMemtableKey6encodeERKNS_6common8ObIArrayINS_5share6schema9ObColDescEEEPKNS2_13ObStoreRowkeyE _ZNK9oceanbase8memtable20ObStoreRowkeyWrapper5equalERKS1_Rb _ZN9oceanbase8memtable8ObMtHash15get_bucket_nodeElmRPNS0_10ObHashNodeERNS1_9GenealogyE _ZZN9oceanbase3sql13ObDASScanIter19inner_get_next_rowsERllENK5$_147clEPKc @@ -285,6 +289,7 @@ _ZN9oceanbase12blocksstable26ObTFMIndexBlockRowIterator8get_nextERPKNS0_21ObInde _ZN9oceanbase12blocksstable26ObTFMIndexBlockRowIterator11get_currentERPKNS0_21ObIndexBlockRowHeaderERNS0_19ObCommonDatumRowkeyE _ZNK9oceanbase12blocksstable14ObRowkeyVector10get_rowkeyElRNS0_19ObCommonDatumRowkeyE _ZNK9oceanbase12blocksstable22ObIndexBlockDataHeader14get_index_dataElRPKcRl +_ZNK9oceanbase12blocksstable21ObIndexBlockRowHeader19fill_micro_des_metaEbRNS0_19ObMicroBlockDesMetaE _ZN9oceanbase12blocksstable21ObIndexBlockRowParser4initEPKcl _ZNK9oceanbase12blocksstable21ObIndexBlockRowHeader19fill_micro_des_metaEbRNS0_19ObMicroBlockDesMetaE _ZN9oceanbase12blocksstable12MacroBlockIdC1ERKS1_ @@ -448,7 +453,6 @@ _ZNK9oceanbase12blocksstable17ObFuseRowCacheKey9deep_copyEPclRPNS_6common13ObIKV _ZNK9oceanbase12blocksstable21ObFuseRowCacheKeyBase9deep_copyEPclRS1_ _ZNK9oceanbase12blocksstable20ObMicroBlockCacheKey4sizeEv _ZN9oceanbase6common12ObKVCacheMap3putERNS0_13ObKVCacheInstERKNS0_13ObIKVCacheKeyEPKNS0_13ObKVCachePairEPNS0_18ObKVMemBlockHandleEb -_ZN9oceanbase6common11upper_alignEll _ZN9oceanbase6common13ObVSliceAlloc5allocEl _ZN9oceanbase7storage20ObCacheMemController19need_sync_io_nlimitERKNS_6common11ObQueryFlagERNS0_22ObMicroBlockDataHandleEPNS_12blocksstable18ObIMicroBlockCacheERNS2_15ObFIFOAllocatorE _ZNK9oceanbase12blocksstable20ObMicroBlockCacheKey4hashEv @@ -544,6 +548,7 @@ _ZN9oceanbase11transaction12ObLSTxCtxMgr18check_with_tx_dataERKNS0_9ObTransIDERN _ZN9oceanbase11transaction14ObPartTransCtx18check_with_tx_dataERNS_7storage21ObITxDataCheckFunctorE _ZN9oceanbase11transaction11ObCtxTxData15get_tx_data_ptrERPNS_7storage8ObTxDataE _ZN9oceanbase7storage18LockForReadFunctorclERKNS0_8ObTxDataEPNS0_9ObTxCCCtxE +_ZN9oceanbase5share3SCN7set_minEv _ZN9oceanbase7storage21ObITxDataCheckFunctor27resolve_tx_data_check_data_EiNS_5share3SCNES3_b _ZN9oceanbase7storage18LockForReadFunctor19inner_lock_for_readERKNS0_8ObTxDataEPNS0_9ObTxCCCtxE _ZN9oceanbase6common5ObObj10set_numberENS0_9ObObjTypeE12ObNumberDescPj @@ -580,7 +585,6 @@ _ZN9oceanbase12blocksstable18ObIMicroBlockCache8prefetchEmRKNS0_12MacroBlockIdER _ZN9oceanbase6common8ObIOFlag17set_sys_module_idEm _ZN9oceanbase6common8ObIOFlag8set_modeENS0_8ObIOModeE _ZN9oceanbase12blocksstable18ObIMicroBlockCache8prefetchEmRKNS0_12MacroBlockIdERKNS0_16ObMicroIndexInfoERNS0_21ObStorageObjectHandleERNS0_23ObIMicroBlockIOCallbackEb -_ZN9oceanbase12blocksstable21ObStorageObjectHandle10async_readERKNS0_23ObStorageObjectReadInfoE _ZNK9oceanbase6common8ObIOFlag8is_validEv _ZNK9oceanbase6common8ObIOFlag17get_sys_module_idEv _ZN9oceanbase6common11ObIOManager12get_instanceEv @@ -715,7 +719,6 @@ _ZN9oceanbase6common12TCRLockGuardC2ERKNS0_8TCRWLockE _ZN9oceanbase6common8TCRWLock10try_rdlockERl _ZN9oceanbase8memtable13ObLockWaitMgr4run1Ev _ZN9oceanbase8memtable13ObLockWaitMgr13check_timeoutEv -_ZN9oceanbase8memtable13ObLockWaitMgr26fetch_deadlocked_sessions_ERPNS_6common9ObSEArrayINS1_8SessPairELl16ENS2_19ModulePageAllocatorELb0EEE _ZN9oceanbase6common13ObSEArrayImplINS_8memtable13ObLockWaitMgr8SessPairELl16ENS0_19ModulePageAllocatorELb0EE7destroyEv _ZN9oceanbase3lib6_SBaseD2Ev _ZN9oceanbase6common6DCHashINS0_9ObIntWarpELl8EE4nextEPNS0_11KeyHashNodeIS2_EE @@ -777,6 +780,9 @@ _ZN9oceanbase6common16ObWaitEventGuardC2Elmlllb _ZN9oceanbase5share2_SILNS0_12ObEntityTypeE0ELNS0_12EntitySourceE0EED2Ev _ZN9oceanbase3lib17__MemoryContext__15destory_contextEPS1_ _ZN9oceanbase6common11ObAllocator4freeEPv +_ZN9oceanbase6common11ObAllocatorD2Ev +_ZN9oceanbase3lib9ObjectSet5resetEv +_ZN9oceanbase5share2_SILNS0_12ObEntityTypeE0ELNS0_12EntitySourceE0EED2Ev _ZN9oceanbase3lib17__MemoryContext__6deinitEv _ZN9oceanbase6common12ObLatchMutexD1Ev _ZN9oceanbase6common12ObLatchMutexD2Ev @@ -791,6 +797,8 @@ _ZN9oceanbase6common11ObAllocatorD2Ev _ZN9oceanbase3lib9ObjectSet5resetEv _ZN9oceanbase3lib9ObjectSet11free_objectEPNS0_7AObjectE _ZN9oceanbase5share2_SILNS0_12ObEntityTypeE1ELNS0_12EntitySourceE2EED2Ev +_ZN9oceanbase6common15lib_get_cpu_khzEv +_ZN9oceanbase6common16ObDiagnosticInfo14end_wait_eventElb _ZN9oceanbase3lib9ObjectSet14do_free_objectEPNS0_7AObjectE _ZN9oceanbase3lib9ObjectSet18free_normal_objectEPNS0_7AObjectE _ZN9oceanbase3lib9ObjectSet9merge_objEPNS0_7AObjectE @@ -852,8 +860,11 @@ _ZN9oceanbase8observer16ObMPPacketSender7do_initEPNS_3rpc9ObRequestEhhbbl _ZN9oceanbase8observer9ObMPQuery11deserializeEv _ZN9oceanbase8observer9ObMPQuery7processEv _ZN9oceanbase6common23get_reserved_stack_sizeEv +_ZN9oceanbase6common14ObMaxWaitGuardD1Ev +_ZN9oceanbase6common14ObMaxWaitGuardD2Ev _ZN9oceanbase8observer16ObMySQLResultSetD2Ev _ZN9oceanbase5share15ObGlobalContext12get_instanceEv +_ZNK9oceanbase3sql8ObDASCtx22get_related_tablet_cntEv _ZN9oceanbase3sql16ObSQLSessionInfo18set_txn_free_routeEb _ZN9oceanbase6common16ObClusterVersion12get_instanceEv _ZN9oceanbase5trace7ObTrace10begin_spanEjhb @@ -1070,6 +1081,9 @@ _ZN9oceanbase3sql21ObLibCacheRlockAndRef4lockERNS0_15ObILibCacheNodeE _ZN9oceanbase6common4hash11ObHashTableIPNS_3sql14ObILibCacheKeyENS1_11HashMapPairIS5_PNS3_15ObILibCacheNodeEEENS1_9hash_funcIS5_EENS1_8equal_toIS5_EENS1_10pair_firstIS9_EENS1_13SimpleAllocerINS1_15ObHashTableNodeIS9_EELi108ENS1_19SpinMutexDefendModeENS1_29DefaultSimpleAllocerAllocatorEEENS1_24LatchReadWriteDefendModeENS1_13NormalPointerENS0_8ObMallocELl1EE11read_atomicINS3_18ObLibCacheAtomicOpENS1_8pre_procIS9_EEEEiRKS5_RT_RT0_ _ZNK9oceanbase3sql14ObILibCacheKey4hashERm _ZNK9oceanbase3sql14ObPlanCacheKey4hashEv +_ZN9oceanbase3sql15ObILibCacheNode6unlockEv +_ZN9oceanbase3sql15ObILibCacheNode13dec_ref_countENS0_16CacheRefHandleIDE +_ZN9oceanbase3sql17ObILibCacheObject13inc_ref_countENS0_16CacheRefHandleIDE _ZNK9oceanbase3sql14ObPlanCacheKey8is_equalERKNS0_14ObILibCacheKeyE _ZN9oceanbase3sql11ObPlanCache28construct_fast_parser_resultERNS_6common12ObIAllocatorERNS0_14ObPlanCacheCtxERKNS2_8ObStringERNS0_18ObFastParserResultE _ZN9oceanbase6common13ObSEArrayImplIPNS_3sql9ObPCParamELl4ENS0_19ModulePageAllocatorELb0EE7destroyEv @@ -1213,6 +1227,7 @@ _ZN9oceanbase3sql10ObOperator21convert_vector_formatEv _ZNK9oceanbase3sql6ObExpr15cast_to_uniformElRNS0_9ObEvalCtxEPKNS0_15ObBitVectorImplImEE _ZZN9oceanbase3sql10ObOperator21convert_vector_formatEvENK5$_226clEPKc _ZN9oceanbase6common8ObLogger13need_to_printEmmi +_ZN9oceanbase3sql13ObExecContext35try_reset_convert_charset_allocatorEv _ZN9oceanbase3sql10ObOperator13do_drain_exchEv _ZN9oceanbase3sql13ObExecContext35try_reset_convert_charset_allocatorEv _ZN9oceanbase8observer13ObQueryDriver21response_query_headerERNS_3sql11ObResultSetEbbb @@ -1389,10 +1404,11 @@ _ZN9oceanbase7storage14ObTabletHandleC2EPKciS3_ _ZN9oceanbase7storage15ObStoreCtxGuard4initERKNS_5share6ObLSIDE _ZN9oceanbase7storage10ObLSHandle5resetEv _ZN9oceanbase7storage14ObTabletHandle5resetEv -_ZN9oceanbase7storage18ObTenantMetaMemMgr20register_into_tb_mapEPKciS3_Ri _ZN9oceanbase7storage18ObTenantMetaMemMgr23dec_ref_in_leak_checkerEi _ZN9oceanbase7storage14ObMetaObjGuardINS0_8ObTabletEE9reset_objEv _ZN9oceanbase6common18ObServerObjectPoolINS_7storage19ObTableScanIteratorEE13borrow_objectEv +_ZN9oceanbase3sql13ObTableScanOp21GroupRescanParamGuardC2ERNS0_16ObTableScanRtDefERNS_6common9Ob2DArrayINS5_10ObObjParamELi2079744ENS5_18ObWrapperAllocatorELb0ENS5_9ObSEArrayIPS7_Ll1ES8_Lb0EEELb0ELb1EEE +_ZN9oceanbase3sql13ObTableScanOp21GroupRescanParamGuardD2Ev _ZN9oceanbase7storage17ObLSTabletService10table_scanERNS0_14ObTabletHandleERNS0_19ObTableScanIteratorERNS0_16ObTableScanParamE _ZNK9oceanbase5share3SCN6is_minEv _ZN9oceanbase7storage17ObLSTabletService16inner_table_scanERNS0_14ObTabletHandleERNS0_19ObTableScanIteratorERNS0_16ObTableScanParamE @@ -2050,6 +2066,7 @@ _ZN9oceanbase7storage19ObStorageMetaHandleC2Ev _ZN9oceanbase7storage17ObLobTabletDmlCtxC2Ev _ZN9oceanbase7storage15ObDMLRunningCtx4initEPKNS_6common8ObIArrayImEES6_PNS_5share6schema27ObMultiVersionSchemaServiceERNS0_14ObTabletHandleE _ZN9oceanbase5share6schema14is_index_tableENS1_11ObTableTypeE +_ZN9oceanbase7storage15ObDMLRunningCtx22prepare_relative_tableERKNS_5share6schema18ObTableSchemaParamERNS0_14ObTabletHandleERKNS2_3SCNE _ZN9oceanbase7storage15ObDMLRunningCtx14init_cmp_funcsEv _ZN9oceanbase6common12ObDatumFuncs14get_basic_funcENS0_9ObObjTypeENS0_15ObCollationTypeEsbbs _ZN9oceanbase6common24VectorCmpExprFuncsHelper11get_cmp_setERKNS_3sql11ObDatumMetaES5_RPFiRKNS0_9ObObjMetaES8_PKvibSA_ibRiESE_ @@ -2639,6 +2656,7 @@ _ZN9oceanbase8memtable13ObMemtableCtx10write_authEb _ZN9oceanbase6common7ObLatch10try_rdlockEj _ZN9oceanbase8memtable16ObMvccWriteGuardD1Ev _ZN9oceanbase8memtable16ObMvccWriteGuardD2Ev +_ZN9oceanbase8memtable18ObTransCallbackMgr26pending_log_size_too_largeERKNS_11transaction7ObTxSEQEl _ZN9oceanbase8memtable10ObMemtable18is_frozen_memtableEv _ZN9oceanbase8memtable18ObTransCallbackMgr26pending_log_size_too_largeERKNS_11transaction7ObTxSEQEl _ZN9oceanbase8memtable10ObMemtable4set_ERKNS_7storage16ObTableIterParamERKNS_6common8ObIArrayINS_5share6schema9ObColDescEEERKNS_12blocksstable10ObDatumRowEPSG_PKNS7_IlEEbRNS2_20ObTableAccessContextERNS0_22ObMemtableKeyGeneratorEPNS0_23ObMvccRowAndWriteResultE diff --git a/mittest/mtlenv/mock_tenant_module_env.h b/mittest/mtlenv/mock_tenant_module_env.h index 3cdeab3398..6ee0763f1a 100644 --- a/mittest/mtlenv/mock_tenant_module_env.h +++ b/mittest/mtlenv/mock_tenant_module_env.h @@ -902,6 +902,7 @@ int MockTenantModuleEnv::init() MTL_BIND2(mtl_new_default, ObOptStatMonitorManager::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, memtable::ObLockWaitMgr::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObGlobalIteratorPool::mtl_init, nullptr, nullptr, nullptr, ObGlobalIteratorPool::mtl_destroy); + MTL_BIND2(mtl_new_default, observer::ObTenantQueryRespTimeCollector::mtl_init,nullptr, nullptr, nullptr, observer::ObTenantQueryRespTimeCollector::mtl_destroy); MTL_BIND2(mtl_new_default, table::ObTableClientInfoMgr::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, observer::ObTableQueryASyncMgr::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); } diff --git a/observer.prof.1702984872675 b/observer.prof.1702984872675 index ee3383576f..d66ff470ef 100644 --- a/observer.prof.1702984872675 +++ b/observer.prof.1702984872675 @@ -720,14 +720,10 @@ _ZN9oceanbase6common7ObDITlsINS0_17ObSessionDIBufferELm0EE12get_instanceEv:93507 4.2: 0 5: 128334 5.1: 0 - 5.2: 0 - 6: 0 - 6.1: 0 - 6.2: 0 - 6.3: 0 - 6.4: 0 + 6.1: 163 _ZNK9oceanbase7storage19ObSSTableRowScannerINS0_30ObIndexTreeMultiPassPrefetcherILi32ELi3EEEE14can_batch_scanEv:139 7: 0 - 9: 0 + 9.1: 4 + 10: 191 _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE8prefetchEv:196 11.1: 0 11.2: 0 13: 137555 @@ -746,8 +742,63 @@ _ZN9oceanbase6common7ObDITlsINS0_17ObSessionDIBufferELm0EE12get_instanceEv:93507 12: 0 10: _ZN9oceanbase3lib10DoNotUseMeERNS0_9ObMemAttrE:0 3: 0 - 11: _ZN9oceanbase6common9ob_mallocElRKNS_3lib9ObMemAttrE:0 + 4: 0 + 5: 0 + 3: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE21prefetching_range_idxEv:0 + 2: 0 + 2.1: 0 + 3: 0 + 3: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE22ObIndexTreeLevelHandle25current_block_read_handleEv:0 + 2: 0 + 3: 0 + 3.1: _ZNK9oceanbase12blocksstable16ObMicroIndexInfo9range_idxEv:0 + 2: 0 + 4: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE19current_read_handleEv:0 + 1: 0 + 1: _ZN9oceanbase6common16ObFixedArrayImplINS_7storage19ObSSTableReadHandleENS0_12ObIAllocatorEEixEl:0 + 0: _ZN9oceanbase6common12ObIArrayWrapINS_7storage19ObSSTableReadHandleEE2atEl:0 + 6: 0 + 24: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE19current_read_handleEv:5260 + 1: 150 + 1: _ZN9oceanbase6common16ObFixedArrayImplINS_7storage19ObSSTableReadHandleENS0_12ObIAllocatorEEixEl:1792 + 0: _ZN9oceanbase6common12ObIArrayWrapINS_7storage19ObSSTableReadHandleEE2atEl:1792 + 6: 128 + 26: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE21prefetching_range_idxEv:20 + 2: 1 + 2.1: 1 3: 0 + 3: _ZN9oceanbase7storage30ObIndexTreeMultiPassPrefetcherILi32ELi3EE22ObIndexTreeLevelHandle25current_block_read_handleEv:0 + 2: 0 + 3: 0 + 3.1: _ZNK9oceanbase12blocksstable16ObMicroIndexInfo9range_idxEv:0 + 2: 0 + 40: _ZNK9oceanbase12blocksstable12ObDmlRowFlag12is_not_existEv:1358 + 2: 194 + 45.1: _ZN9oceanbase3lib24is_diagnose_info_enabledEv:10816 + 2: 169 + 2.1: 169 + 2.1: _ZN9oceanbase3lib15ObPerfModeGuard15get_tl_instanceEv:4225 + 2: 169 + 2.1: 0 + 45.2: _ZN9oceanbase6common21ObLocalDiagnosticInfo8add_statENS0_14ObStatEventIds17ObStatEventIdEnumEl:15379 + 4: 169 + 5: 169 + 8: 169 + 9: 169 + 3: _ZN9oceanbase6common21ObLocalDiagnosticInfo12get_instanceEv:4225 + 2: 169 + 2.1: 0 + 6: _ZN9oceanbase6common20ObDiagnosticInfoSlot15atomic_add_statENS0_14ObStatEventIds17ObStatEventIdEnumEl:0 + 4: 0 + 10: _ZN9oceanbase6common16ObDiagnosticInfo8add_statENS0_14ObStatEventIds17ObStatEventIdEnumEl:1014 + 5: 169 _ZN9oceanbase6common18ObStatEventAddStat3addEl:194 + 48.1: _ZN9oceanbase3lib24is_diagnose_info_enabledEv:0 + 2: 0 + 2.1: 0 + 2.1: _ZN9oceanbase3lib15ObPerfModeGuard15get_tl_instanceEv:0 + 2: 0 + 2.1: 0 + 48.2: _ZN9oceanbase6common21ObLocalDiagnosticInfo8add_statENS0_14ObStatEventIds17ObStatEventIdEnumEl:0 4: 0 5: 0 6: 0 @@ -247427,7 +247478,6 @@ _ZN9oceanbase6common8OB_PRINTIJNS0_8ObILogKVES2_S2_S2_S2_EEEvPKciS4_iS4_miS4_S4_ 14: _ZN9oceanbase6common8ObLogger10get_loggerEv:12 2: 1 2.1: 0 - 2.2: 0 2.3: 0 2.6: 0 _ZNK9oceanbase7storage8ObTablet22get_kept_snapshot_infoElRNS0_21ObStorageSnapshotInfoE:597:1 @@ -253384,7 +253434,6 @@ _ZZN9oceanbase4palf9LogEngine21submit_flush_log_taskERKNS0_13FlushLogCbCtxERKNS0 2.1: 0 2.2: 0 2.3: 0 - 2.4: 0 2.6: 0 0.4: _ZN9oceanbase6common7ObLogKVIRKiLb0EEC2EPKcS3_:0 0: 0 @@ -272990,6 +273039,7 @@ _ZN9oceanbase6common10ObIOResult6finishERKNS0_11ObIORetCodeEPNS0_11ObIORequestE: 2.1: 0 2.2: 0 2.3: 0 + 2.4: 0 2.6: 0 35.1: _ZNK9oceanbase6common11ObIORequest10timeout_tsEv:0 2: 0 @@ -296608,7 +296658,6 @@ _ZZN9oceanbase5share6schema19ObSchemaGetterGuard18get_schema_versionENS1_12ObSch 2.1: 0 2.2: 0 2.3: 0 - 2.4: 0 2.6: 0 0.1: _ZN9oceanbase6common7ObLogKVIiLb0EEC2EPKcRKi:0 0: 0 diff --git a/src/diagnose/lua/ob_lua_api.cpp b/src/diagnose/lua/ob_lua_api.cpp index 9c82aae4c2..97ce05a98c 100644 --- a/src/diagnose/lua/ob_lua_api.cpp +++ b/src/diagnose/lua/ob_lua_api.cpp @@ -41,6 +41,8 @@ #include "sql/engine/ob_tenant_sql_memory_manager.h" #include +#include "share/ash/ob_di_util.h" + using namespace oceanbase; using namespace common; @@ -866,7 +868,7 @@ int select_sysstat(lua_State* L) for (int64_t i = 0; i < ids.size() && !gen.is_end(); ++i) { ObArenaAllocator diag_allocator; HEAP_VAR(ObDiagnoseTenantInfo, diag_info, &diag_allocator) { - if (OB_FAIL(ObDIGlobalTenantCache::get_instance().get_the_diag_info(ids.at(i), diag_info))) { + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(ids.at(i), diag_info))) { OB_LOG(ERROR, "failed to get_the_diag_info", K(ids.at(i)), K(ret)); } else if (OB_FAIL(observer::ObAllVirtualSysStat::update_all_stats(ids.at(i), diag_info))) { OB_LOG(ERROR, "failed to update_all_stats", K(ids.at(i)), K(ret)); @@ -2031,7 +2033,7 @@ int get_tenant_sysstat(int64_t tenant_id, int64_t statistic, int64_t &value) || statistic >= ObStatEventIds::STAT_EVENT_SET_END || ObStatEventIds::STAT_EVENT_ADD_END == statistic) { ret = OB_INVALID_ARGUMENT; - } else if (OB_FAIL(ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + } else if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { // do nothing } else if (OB_FAIL(observer::ObAllVirtualSysStat::update_all_stats(tenant_id, diag_info))) { // do nothing diff --git a/src/diagnose/lua/ob_lua_handler.cpp b/src/diagnose/lua/ob_lua_handler.cpp index 14cf7c86d6..7ee1e99f2c 100644 --- a/src/diagnose/lua/ob_lua_handler.cpp +++ b/src/diagnose/lua/ob_lua_handler.cpp @@ -161,7 +161,11 @@ void ObUnixDomainListener::run1() while (OB_LIKELY(!has_set_stop())) { int conn_fd = -1; int ret = OB_SUCCESS; - int64_t event_cnt = ob_epoll_wait(epoll_fd, events, EPOLL_EVENT_BUFFER_SIZE, TIMEOUT); + int64_t event_cnt = 0; + { + common::ObBKGDSessInActiveGuard inactive_guard; + event_cnt = ob_epoll_wait(epoll_fd, events, EPOLL_EVENT_BUFFER_SIZE, TIMEOUT); + } if (event_cnt < 0) { if (EINTR == errno) { // timeout, ignore diff --git a/src/logservice/archiveservice/ob_archive_fetcher.cpp b/src/logservice/archiveservice/ob_archive_fetcher.cpp index 83ebdfd879..13698fc04c 100644 --- a/src/logservice/archiveservice/ob_archive_fetcher.cpp +++ b/src/logservice/archiveservice/ob_archive_fetcher.cpp @@ -41,6 +41,7 @@ #include "share/ob_ls_id.h" #include "share/ob_tenant_info_proxy.h" // ObAllTenantInfo #include "share/scn.h" +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -289,6 +290,7 @@ void ObArchiveFetcher::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; fetch_cond_.timedwait(wait_interval); } } diff --git a/src/logservice/archiveservice/ob_archive_sequencer.cpp b/src/logservice/archiveservice/ob_archive_sequencer.cpp index 8455e201f9..83df48010b 100644 --- a/src/logservice/archiveservice/ob_archive_sequencer.cpp +++ b/src/logservice/archiveservice/ob_archive_sequencer.cpp @@ -24,6 +24,8 @@ #include "logservice/palf_handle_guard.h" // PalfHandleGuard #include "share/backup/ob_archive_struct.h" #include +#include "lib/ash/ob_active_session_guard.h" + namespace oceanbase { @@ -143,6 +145,7 @@ void ObArchiveSequencer::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; seq_cond_.timedwait(wait_interval); } } diff --git a/src/logservice/archiveservice/ob_archive_service.cpp b/src/logservice/archiveservice/ob_archive_service.cpp index e889d40cc9..81f81e7d08 100644 --- a/src/logservice/archiveservice/ob_archive_service.cpp +++ b/src/logservice/archiveservice/ob_archive_service.cpp @@ -22,6 +22,7 @@ #include "share/scn.h" // LSN #include "share/backup/ob_backup_connectivity.h" #include "share/ob_debug_sync.h" +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -226,6 +227,7 @@ void ObArchiveService::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; cond_.timedwait(wait_interval); } } diff --git a/src/logservice/archiveservice/ob_archive_timer.cpp b/src/logservice/archiveservice/ob_archive_timer.cpp index 6cf259f347..6c83809aca 100644 --- a/src/logservice/archiveservice/ob_archive_timer.cpp +++ b/src/logservice/archiveservice/ob_archive_timer.cpp @@ -112,7 +112,7 @@ void ObArchiveTimer::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { - ob_usleep(wait_interval); + ob_usleep(wait_interval, true/*is_idle_sleep*/); } } } diff --git a/src/logservice/archiveservice/ob_ls_mgr.cpp b/src/logservice/archiveservice/ob_ls_mgr.cpp index 51417f51db..e292c97e2d 100644 --- a/src/logservice/archiveservice/ob_ls_mgr.cpp +++ b/src/logservice/archiveservice/ob_ls_mgr.cpp @@ -28,6 +28,7 @@ #include "ob_archive_util.h" // GET_LS_TASK_CTX #include "ob_archive_round_mgr.h" // ObArchiveRoundMgr #include +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -375,6 +376,7 @@ void ObArchiveLSMgr::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { + ObBKGDSessInActiveGuard inactive_guard; cond_.timedwait(wait_interval); } } diff --git a/src/logservice/cdcservice/ob_cdc_service.cpp b/src/logservice/cdcservice/ob_cdc_service.cpp index 4a5521aad5..3d0d3b31ba 100644 --- a/src/logservice/cdcservice/ob_cdc_service.cpp +++ b/src/logservice/cdcservice/ob_cdc_service.cpp @@ -243,7 +243,7 @@ void ObCdcService::run1() last_snapshot_traffic_info_ts = current_ts; } - ob_usleep(static_cast(BASE_INTERVAL)); + ob_usleep(static_cast(BASE_INTERVAL), true/*is_idle_sleep*/); } EXTLOG_LOG(INFO, "CdcSrv Thread Exit due to has_set_stop", "stop_flag", has_set_stop()); diff --git a/src/logservice/libobcdc/src/CMakeLists.txt b/src/logservice/libobcdc/src/CMakeLists.txt index e3f3d7ae82..fbf59e27fd 100644 --- a/src/logservice/libobcdc/src/CMakeLists.txt +++ b/src/logservice/libobcdc/src/CMakeLists.txt @@ -16,7 +16,7 @@ set_target_properties(rocksdb PROPERTIES add_library(obcdc_base INTERFACE) target_include_directories(obcdc_base INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(obcdc_base - INTERFACE ob_base + INTERFACE -Wl,--whole-archive mock_di -Wl,--no-whole-archive ob_base obcdc_msg rocksdb ${OB_RELRO_FLAG} -Wl,-T,${CMAKE_SOURCE_DIR}/rpm/ld.lds) diff --git a/src/logservice/ob_garbage_collector.cpp b/src/logservice/ob_garbage_collector.cpp index 839e2c9c85..50f55f6d5d 100644 --- a/src/logservice/ob_garbage_collector.cpp +++ b/src/logservice/ob_garbage_collector.cpp @@ -1480,7 +1480,7 @@ void ObGarbageCollector::run1() // safe destroy handler keep running even if ObServerCheckpointSlogHandler is not started, // because ls still need to be safe destroy when observer fail to start. (void) safe_destroy_handler_.handle(); - ob_usleep(gc_interval); + ob_usleep(gc_interval, true/*is_idle_sleep*/); } } diff --git a/src/logservice/palf/log_block_mgr.cpp b/src/logservice/palf/log_block_mgr.cpp index 75b03bfcec..1c5be2f011 100644 --- a/src/logservice/palf/log_block_mgr.cpp +++ b/src/logservice/palf/log_block_mgr.cpp @@ -420,7 +420,7 @@ int LogBlockMgr::check_after_truncate_(const char *block_path, const offset_t of while (OB_FAIL(ret)) { PALF_LOG(ERROR, "after truncate, data is not zero", KPC(this), K(io_fd), K(offset), KP(buf), KP(expected_data), K(in_read_size), K(backoff)); - usleep(1000*1000); + ob_usleep(1000*1000); } } else { PALF_LOG(INFO, "check_after_truncate_ success", KPC(this), K(block_path), K(offset)); diff --git a/src/logservice/palf/log_cache.cpp b/src/logservice/palf/log_cache.cpp index 829bfcaacd..a84cebe410 100644 --- a/src/logservice/palf/log_cache.cpp +++ b/src/logservice/palf/log_cache.cpp @@ -512,7 +512,6 @@ int LogColdCache::read(const int64_t flashback_version, LSN read_lsn = lsn; int64_t real_read_size = in_read_size; int64_t disk_out_read_size = 0; - ObTenantStatEstGuard tenant_stat_guard(tenant_id_); LogIteratorInfo *iterator_info = io_ctx.get_iterator_info(); // read process: // 1. read from kv cache diff --git a/src/logservice/palf/log_loop_thread.cpp b/src/logservice/palf/log_loop_thread.cpp index 4f5054ac8f..86c2365f3b 100644 --- a/src/logservice/palf/log_loop_thread.cpp +++ b/src/logservice/palf/log_loop_thread.cpp @@ -149,7 +149,7 @@ void LogLoopThread::log_loop_() if (sleep_ts < 0) { sleep_ts = 0; } - ob_usleep(sleep_ts); + ob_usleep(sleep_ts, true/*is_idle_sleep*/); if (REACH_TENANT_TIME_INTERVAL(5 * 1000 * 1000)) { PALF_LOG(INFO, "LogLoopThread round_cost_time(us)", K(round_cost_time)); diff --git a/src/logservice/palf/log_throttle.cpp b/src/logservice/palf/log_throttle.cpp index 85eda45eb5..fc6f30a43b 100644 --- a/src/logservice/palf/log_throttle.cpp +++ b/src/logservice/palf/log_throttle.cpp @@ -89,7 +89,7 @@ int LogWritingThrottle::throttling(const int64_t throttling_size, lock_.unlock(); while (OB_SUCC(ret) && remain_interval_us > 0) { const int64_t real_interval = MIN(remain_interval_us, DETECT_INTERVAL_US); - usleep(real_interval); + ob_usleep(real_interval); remain_interval_us -= real_interval; if (remain_interval_us <= 0) { //do nothing diff --git a/src/logservice/palf/palf_env_impl.cpp b/src/logservice/palf/palf_env_impl.cpp index 4440ec28c9..538c330456 100644 --- a/src/logservice/palf/palf_env_impl.cpp +++ b/src/logservice/palf/palf_env_impl.cpp @@ -619,7 +619,7 @@ int PalfEnvImpl::remove_directory(const char *log_dir) } if (OB_FAIL(ret) && true == result) { PALF_LOG(WARN, "remove directory failed, may be physical disk full", K(ret), KPC(this)); - usleep(100*1000); + ob_usleep(100*1000); } } while (OB_FAIL(ret)); } diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index 22343d3a69..9a3a641486 100755 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -4803,7 +4803,7 @@ int PalfHandleImpl::flashback(const int64_t mode_version, plugins_.record_flashback_event(palf_id_, mode_version, flashback_scn, curr_end_scn, curr_max_scn); break; } else { - usleep(100*1000); + ob_usleep(100*1000); PALF_LOG(INFO, "flashback not finished", K(ret), KPC(this), K(flashback_scn), K(log_engine_)); } } @@ -5068,7 +5068,7 @@ int PalfHandleImpl::read_and_append_log_group_entry_before_ts_( while (NULL == (last_log_buf = static_cast(mtl_malloc(last_log_buf_len, "PalfHandleImpl")))) { PALF_LOG_RET(ERROR, OB_ALLOCATE_MEMORY_FAILED, "alloc memory for last_log_buf in flashback failed", K(last_log_buf_len)); - usleep(1000); + ob_usleep(1000); }; }; // step2. construct new palf base info. diff --git a/src/logservice/restoreservice/ob_log_restore_service.cpp b/src/logservice/restoreservice/ob_log_restore_service.cpp index 92240c4ea7..8b35e92e56 100644 --- a/src/logservice/restoreservice/ob_log_restore_service.cpp +++ b/src/logservice/restoreservice/ob_log_restore_service.cpp @@ -22,6 +22,7 @@ #include "logservice/ob_log_service.h" // ObLogService #include "ob_log_restore_handler.h" // ObTenantRole #include "observer/ob_server_struct.h" // GCTX +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -169,6 +170,7 @@ void ObLogRestoreService::run1() int64_t end_tstamp = ObTimeUtility::fast_current_time(); int64_t wait_interval = thread_interval - (end_tstamp - begin_stamp); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; cond_.timedwait(wait_interval); } } diff --git a/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp b/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp index 20bfb621b5..b0b3fc18cd 100644 --- a/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp +++ b/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp @@ -229,6 +229,7 @@ void ObRemoteFetchWorker::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; cond_.timedwait(wait_interval); } } diff --git a/src/logservice/restoreservice/ob_remote_log_writer.cpp b/src/logservice/restoreservice/ob_remote_log_writer.cpp index b2fa9a9743..efbb984793 100644 --- a/src/logservice/restoreservice/ob_remote_log_writer.cpp +++ b/src/logservice/restoreservice/ob_remote_log_writer.cpp @@ -134,7 +134,7 @@ void ObRemoteLogWriter::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = THREAD_RUN_INTERVAL - (end_tstamp - begin_tstamp); if (wait_interval > 0) { - ob_usleep(wait_interval); + ob_usleep(wait_interval, true/*is_idle_sleep*/); } } } diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index cf44e1a78a..10a6768f76 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -116,6 +116,7 @@ ob_set_subtarget(ob_server net net/ob_shared_storage_net_throt_rpc_proccessor.cpp net/ob_shared_storage_net_throt_rpc_struct.cpp net/ob_rpc_reverse_keepalive.cpp + net/ob_net_queue_traver.cpp ) ob_set_subtarget(ob_server omt @@ -375,6 +376,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_all_virtual_sys_event.cpp virtual_table/ob_all_virtual_sys_parameter_stat.cpp virtual_table/ob_all_virtual_sys_stat.cpp + virtual_table/ob_all_virtual_res_mgr_sys_stat.cpp virtual_table/ob_all_virtual_sys_task_status.cpp virtual_table/ob_all_virtual_table_mgr.cpp virtual_table/ob_all_virtual_unit.cpp @@ -494,6 +496,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_all_virtual_ss_local_cache_info.cpp virtual_table/ob_all_virtual_vector_index_info.cpp virtual_table/ob_all_virtual_session_ps_info.cpp + virtual_table/ob_all_virtual_sql_stat.cpp virtual_table/ob_all_virtual_tmp_file.cpp virtual_table/ob_all_virtual_log_transport_dest_stat.cpp virtual_table/ob_all_virtual_kv_client_info.cpp diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp index d6c5baf640..5da12b5f67 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp @@ -181,7 +181,7 @@ int ObDBMSSchedJobMaster::scheduler() ObDBMSSchedJobKey *job_key = NULL; int tmp_ret = OB_SUCCESS; if (!IS_SPLIT_TENANT_DATA_VERSION) { - ob_usleep(MIN_SCHEDULER_INTERVAL); + ob_usleep(MIN_SCHEDULER_INTERVAL, true); } else { if (is_leader && TC_REACH_TIME_INTERVAL(CHECK_NEW_INTERVAL)) { if (OB_SUCCESS != (tmp_ret = check_tenant())) { @@ -204,16 +204,16 @@ int ObDBMSSchedJobMaster::scheduler() } if (wait_vector_.count() == 0) { - ob_usleep(MIN_SCHEDULER_INTERVAL); + ob_usleep(MIN_SCHEDULER_INTERVAL, true); } else if (OB_ISNULL(job_key = wait_vector_[0]) || !job_key->is_valid()) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("unexpected error, invalid job key found in ready queue!", K(ret), KPC(job_key)); } else { int64_t delay = job_key->get_execute_at() - ObTimeUtility::current_time(); if (delay > MIN_SCHEDULER_INTERVAL) { - ob_usleep(MIN_SCHEDULER_INTERVAL); + ob_usleep(MIN_SCHEDULER_INTERVAL, true); } else { - ob_usleep(max(0, delay)); + ob_usleep(max(0, delay), true); common::ObCurTraceId::TraceId job_trace_id; job_trace_id.init(GCONF.self_addr_); ObTraceIdGuard trace_id_guard(job_trace_id); diff --git a/src/observer/main.cpp b/src/observer/main.cpp index 11f2e16e8b..42457207ec 100644 --- a/src/observer/main.cpp +++ b/src/observer/main.cpp @@ -510,7 +510,8 @@ int inner_main(int argc, char *argv[]) int64_t pos = 0; print_args(argc, argv); - + // no diagnostic info attach to main thread. + ObDisableDiagnoseGuard disable_guard; setlocale(LC_ALL, ""); // Set character classification type to C to avoid printf large string too // slow. diff --git a/src/observer/mysql/ob_mysql_end_trans_cb.cpp b/src/observer/mysql/ob_mysql_end_trans_cb.cpp index 430c835209..bad5325c10 100644 --- a/src/observer/mysql/ob_mysql_end_trans_cb.cpp +++ b/src/observer/mysql/ob_mysql_end_trans_cb.cpp @@ -153,8 +153,10 @@ void ObSqlEndTransCb::callback(int cb_param) } } - ObActiveSessionGuard::get_stat().in_sql_execution_ = false; - ObActiveSessionGuard::setup_default_ash(); + GET_DIAGNOSTIC_INFO->get_ash_stat().in_sql_execution_ = false; + session_info->reset_cur_sql_id(); + session_info->reset_current_plan_hash(); + session_info->reset_current_plan_id(); session_info->set_session_sleep(); if (OB_SUCCESS == ret) { if (need_disconnect_) { diff --git a/src/observer/mysql/ob_mysql_request_manager.cpp b/src/observer/mysql/ob_mysql_request_manager.cpp index b1e2ba31a4..4e460c9028 100644 --- a/src/observer/mysql/ob_mysql_request_manager.cpp +++ b/src/observer/mysql/ob_mysql_request_manager.cpp @@ -251,7 +251,16 @@ int ObMySQLRequestManager::record_request(const ObAuditRecordData &audit_record, // query response time if (enable_query_response_time_stats) { - observer::ObRSTCollector::get_instance().collect_query_response_time(audit_record.tenant_id_,audit_record.get_elapsed_time()); + observer::ObTenantQueryRespTimeCollector *t_query_resp_time_collector = + MTL(observer::ObTenantQueryRespTimeCollector *); + if (OB_NOT_NULL(t_query_resp_time_collector)) { + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(t_query_resp_time_collector->collect(audit_record.stmt_type_, + audit_record.is_inner_sql_, + audit_record.get_elapsed_time()))) { + SERVER_LOG(WARN, "failed to statistic query response time histogram", K(tmp_ret)); + } + } } //push into queue diff --git a/src/observer/mysql/ob_query_response_time.cpp b/src/observer/mysql/ob_query_response_time.cpp index a062740fb5..682be40f35 100644 --- a/src/observer/mysql/ob_query_response_time.cpp +++ b/src/observer/mysql/ob_query_response_time.cpp @@ -9,8 +9,9 @@ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ - +#define USING_LOG_PREFIX SQL #include "ob_query_response_time.h" +#include "lib/oblog/ob_log.h" #include "observer/omt/ob_tenant_config_mgr.h" using namespace oceanbase; @@ -32,7 +33,7 @@ ObRSTUtility::ObRSTUtility():base_(0) ObRSTUtility::~ObRSTUtility() {} -int ObRSTUtility::setup(uint base) +int ObRSTUtility::setup(uint32_t base) { int ret = OB_SUCCESS; if (base < 2) { @@ -71,159 +72,389 @@ int ObRSTUtility::setup(uint base) return 0; } -ObRSTTimeCollector::ObRSTTimeCollector() +int QueryRespTimeInfo::collect(const int64_t pos, const uint64_t resp_time) +{ + int ret = OB_SUCCESS; + ATOMIC_INC(&count_[pos]); + ATOMIC_FAA(&total_time_[pos], resp_time); + return ret; +} + +uint64_t QueryRespTimeInfo::get_count_val(const int64_t pos) +{ + return ATOMIC_LOAD(&count_[pos]); +} + +uint64_t QueryRespTimeInfo::get_total_time_val(const int64_t pos) +{ + return ATOMIC_LOAD(&total_time_[pos]); +} + +ObRespTimeInfoCollector::ObRespTimeInfoCollector() { flush(); } -ObRSTTimeCollector::~ObRSTTimeCollector() -{} -int ObRSTTimeCollector::flush() +int ObRespTimeInfoCollector::setup(uint32_t base) { - for (int i = 0; i < OB_QRT_OVERALL_COUNT + 1; i++) { - ATOMIC_SET(&count_[i], 0); - ATOMIC_SET(&total_[i], 0); + int ret = OB_SUCCESS; + if (OB_FAIL(utility_.setup(base))) { + LOG_WARN("failed to setup utility",K(ret), K(base)); } - return 0; + return ret; } -int ObRSTTimeCollector::collect(uint64_t time) +int ObRespTimeInfoCollector::collect(const sql::stmt::StmtType sql_type, const bool is_inner_sql, const uint64_t resp_time) { - int i = 0; - for (int count = utility_.bound_count(); count > i; ++i) { - if(utility_.bound(i) > time) { - ATOMIC_INC(&count_[i]); - ATOMIC_FAA(&total_[i],time); + int ret = OB_SUCCESS; + int pos = -1; + for (int i = 0; i < utility_.bound_count(); i++) { + if(utility_.bound(i) > resp_time) { + pos = i; break; } } + if (pos < 0 || pos >= utility_.bound_count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid pos in utility", K(ret), K(pos)); + } else if (is_inner_sql) { + if (OB_FAIL(inner_sql_info_.collect(pos, resp_time))) { + LOG_WARN("inner sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + } else { + switch (sql_type) { + case sql::stmt::T_SELECT : { + if (OB_FAIL(select_sql_info_.collect(pos, resp_time))) { + LOG_WARN("select info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_INSERT : { + if (OB_FAIL(insert_sql_info_.collect(pos, resp_time))) { + LOG_WARN("insert info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_DELETE : { + if (OB_FAIL(delete_sql_info_.collect(pos, resp_time))) { + LOG_WARN("delete info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_UPDATE : { + if (OB_FAIL(update_sql_info_.collect(pos, resp_time))) { + LOG_WARN("update info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_REPLACE : { + if (OB_FAIL(replace_sql_info_.collect(pos, resp_time))) { + LOG_WARN("replace info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_XA_COMMIT : { + if (OB_FAIL(commit_sql_info_.collect(pos, resp_time))) { + LOG_WARN("commit info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_GET : + case sql::stmt::T_KV_QUERY : + case sql::stmt::T_KV_MULTI_GET : { + if (OB_FAIL(tableapi_select_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi select sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_INSERT_OR_UPDATE : + case sql::stmt::T_KV_MULTI_INSERT_OR_UPDATE : + case sql::stmt::T_KV_INSERT : + case sql::stmt::T_KV_MULTI_INSERT : + case sql::stmt::T_KV_PUT : + case sql::stmt::T_KV_MULTI_PUT : { + if (OB_FAIL(tableapi_insert_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi insert sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_DELETE : + case sql::stmt::T_KV_MULTI_DELETE : { + if (OB_FAIL(tableapi_delete_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi delete sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_UPDATE : + case sql::stmt::T_KV_APPEND : + case sql::stmt::T_KV_INCREMENT : + case sql::stmt::T_KV_MULTI_UPDATE : + case sql::stmt::T_KV_MULTI_INCREMENT : + case sql::stmt::T_KV_MULTI_APPEND : { + if (OB_FAIL(tableapi_update_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi update sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_REPLACE : + case sql::stmt::T_KV_MULTI_REPLACE : { + if (OB_FAIL(tableapi_replace_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi replace sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_QUERY_AND_MUTATE : { + if (OB_FAIL(tableapi_query_and_mutate_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi query and mutate sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_KV_OTHER : { + if (OB_FAIL(tableapi_other_sql_info_.collect(pos, resp_time))) { + LOG_WARN("tableapi other sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_SCAN : { + if (OB_FAIL(hbase_scan_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase scan sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_PUT : { + if (OB_FAIL(hbase_put_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase put sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_DELETE : { + if (OB_FAIL(hbase_delete_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase delete sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_APPEND : { + if (OB_FAIL(hbase_append_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase append sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_INCREMENT : { + if (OB_FAIL(hbase_increment_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase increment sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_CHECK_AND_PUT : { + if (OB_FAIL(hbase_check_and_put_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase check and put sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_CHECK_AND_MUTATE : { + if (OB_FAIL(hbase_check_and_mutate_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase check and mutate sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_CHECK_AND_DELETE : { + if (OB_FAIL(hbase_check_and_delete_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase check and delete sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + case sql::stmt::T_HBASE_HYBRID_BATCH : { + if (OB_FAIL(hbase_hybrid_batch_sql_info_.collect(pos, resp_time))) { + LOG_WARN("hbase bybrid batch sql info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + default: { + if (OB_FAIL(other_sql_info_.collect(pos, resp_time))) { + LOG_WARN("other info failed to collect resp time", K(ret), K(pos), K(resp_time), K(utility_.bound_count())); + } + break; + } + } + } + return ret; +} + +int ObRespTimeInfoCollector::flush(int64_t base /*=OB_INVALID_ID*/) +{ + int ret = OB_SUCCESS; + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID())); + if (!tenant_config.is_valid()) { + } else { + if (OB_FAIL(setup(base == OB_INVALID_ID ? tenant_config->query_response_time_range_base : base))) { + LOG_WARN("failed to setup utility", K(ret)); + } + } + + for (int i = 0; OB_SUCC(ret) && i < OB_QRT_OVERALL_COUNT + 1; i++) { +#define DEF_RESP_TIME_SQL_TYPE(name) \ + ATOMIC_SET(&name##_info_.count_[i], 0); \ + ATOMIC_SET(&name##_info_.total_time_[i], 0); +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE + } return 0; } -ObRSTCollector::ObRSTCollector():inited_(false) -{} - -ObRSTCollector::~ObRSTCollector() -{ - inited_ = false; - collector_map_.clear(); -} - -ObRSTCollector& ObRSTCollector::get_instance() -{ - static ObRSTCollector collector_instance_; - if (!collector_instance_.inited_){ - collector_instance_.init(); - } - return collector_instance_; -} - -int ObRSTCollector::init() +int ObRespTimeInfoCollector::get_count_val( + const RespTimeSqlType resp_time_sql_type, + const int32_t pos, + int64_t &val) { int ret = OB_SUCCESS; - if (inited_) { + if (pos < 0 || pos >= utility_.bound_count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid pos in utility", K(ret), K(pos)); + } else { + switch (resp_time_sql_type) { +#define DEF_RESP_TIME_SQL_TYPE(name) \ + case name : { \ + val = name##_info_.get_count_val(pos); \ + break; \ + } +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE + default : { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid RespTimeSqlType", K(ret), K(resp_time_sql_type)); + break; + } + } + } + return ret; +} + +int ObRespTimeInfoCollector::get_total_time_val( + const RespTimeSqlType resp_time_sql_type, + const int32_t pos, + int64_t &val) +{ + int ret = OB_SUCCESS; + if (pos < 0 || pos >= utility_.bound_count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid pos in utility", K(ret), K(pos)); + } else { + switch (resp_time_sql_type) { +#define DEF_RESP_TIME_SQL_TYPE(name) \ + case name : { \ + val = name##_info_.get_total_time_val(pos); \ + break; \ + } +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE + default : { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid RespTimeSqlType", K(ret), K(resp_time_sql_type)); + break; + } + } + } + return ret; +} + +int ObTenantQueryRespTimeCollector::init() +{ + int ret = OB_SUCCESS; + if (is_inited_) { ret = OB_INIT_TWICE; - } else if (!collector_map_.created() && OB_FAIL(collector_map_.create( - common::OB_MAX_SERVER_TENANT_CNT, ObModIds::OB_HASH_BUCKET, ObModIds::OB_HASH_NODE))) { + LOG_WARN("ObTenantQueryRespTimeCollector has been inited", K(ret)); + } else { + flush_config_version_ = 0; + multi_collector_.set_tenant_id(MTL_ID()); + multi_collector_.set_attr(ObMemAttr(MTL_ID(), "RespTimeColl")); + multi_collector_.prepare_allocate(multi_ways_count_); // Memory is allocated in advance and objects are constructed in advance. + } + + if (OB_SUCC(ret)) { + is_inited_ = true; + LOG_INFO("succ to init ObTenantQueryRespTimeCollector", K(MTL_ID())); + } + return ret; +} + +void ObTenantQueryRespTimeCollector::destroy() +{ + multi_collector_.destroy(); + flush_config_version_ = 0; + is_inited_ = false; + LOG_INFO("succ to destroy ObTenantQueryRespTimeCollector", K(MTL_ID())); +} + +int ObTenantQueryRespTimeCollector::mtl_init(ObTenantQueryRespTimeCollector *&t_resp_time_collector) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(t_resp_time_collector)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tenant query response time collector is null", K(ret)); + } else if (OB_FAIL(t_resp_time_collector->init())) { + LOG_WARN("failed to init tenant query response time collector", K(ret)); + } + return ret; +} + +void ObTenantQueryRespTimeCollector::mtl_destroy(ObTenantQueryRespTimeCollector *&t_resp_time_collector) +{ + if (nullptr != t_resp_time_collector) { + t_resp_time_collector->destroy(); + common::ob_delete(t_resp_time_collector); + t_resp_time_collector = nullptr; + } +} + +int ObTenantQueryRespTimeCollector::collect(const sql::stmt::StmtType sql_type, const bool is_inner_sql, const uint64_t resp_time) +{ + int ret = OB_SUCCESS; + const size_t pos = std::abs(GETTID()) % multi_ways_count_; + if (!is_inited_) { ret = OB_NOT_INIT; - SQL_ENG_LOG(WARN, "create time collector map failed", K(ret)); + LOG_WARN("not init", K(ret)); + } else if (OB_FAIL(multi_collector_.at(pos).collect(sql_type, is_inner_sql, resp_time))) { + LOG_WARN("failed to collect response time",K(ret), K(pos), K(sql_type), K(resp_time), K(is_inner_sql)); + } + + return ret; +} + +int ObTenantQueryRespTimeCollector::get_sum_value(ObRespTimeInfoCollector &total_collector) +{ + int ret = OB_SUCCESS; + RLockGuard rlock_guard(rwlock_); + if (OB_FAIL(total_collector.flush(multi_collector_.at(0).utility().base()))) { + LOG_WARN("failed to flush total collector", K(ret), K(MTL_ID())); } else { - inited_ = true; - } - return ret; -} - -int ObRSTCollector::collect_query_response_time(uint64_t tenant_id, uint64_t time) -{ - int ret = OB_SUCCESS; - ObRSTTimeCollector* time_collector; - if (OB_FAIL(collector_map_.get_refactored(tenant_id, time_collector))) { - SERVER_LOG(WARN, "time collector of the tenant does not exist", K(tenant_id), K(time), K(ret)); - } else { - if(OB_FAIL(time_collector->collect(time))) { - SERVER_LOG(WARN, "time collector of the tenant collect time failed", K(tenant_id), K(time), K(ret)); - } - } - return ret; -} - -int ObRSTCollector::flush_query_response_time(uint64_t tenant_id,const ObString& is_enable) -{ - int ret = OB_SUCCESS; - bool is_enable_value = false; - bool is_valid = false; - is_enable_value = ObConfigBoolParser::get(is_enable.ptr(), is_valid); - omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); - if (tenant_config.is_valid()) { - if (!is_valid) { - ret = OB_INVALID_ARGUMENT; - SERVER_LOG(WARN, "invalid bool str", K(ret), K(is_enable), K(tenant_id)); - } else if (is_enable_value) { - ObRSTTimeCollector* time_collector; - if (!tenant_config->query_response_time_stats) { - SERVER_LOG(WARN, "query_response_time_stats already turn off", K(ret), K(tenant_id)); - } else if (OB_FAIL(collector_map_.get_refactored(tenant_id, time_collector))){ - SERVER_LOG(WARN, "time collector of the tenant does not exist", K(ret), K(tenant_id)); - } else if (OB_FAIL(time_collector->setup(tenant_config->query_response_time_range_base))) { - SERVER_LOG(WARN, "time collector of the tenant set range base failed", K(ret), K(tenant_id)); - } else if (OB_FAIL(time_collector->flush())) { - SERVER_LOG(WARN, "time collector of the tenant flush failed", K(ret), K(tenant_id)); + for (int64_t i = 0; OB_SUCC(ret) && i < multi_ways_count_; i++) { + for (int64_t j = 0; OB_SUCC(ret) && j < total_collector.utility().bound_count(); j++) { +#define DEF_RESP_TIME_SQL_TYPE(name) \ + total_collector.name##_info_.count_[j] += \ + multi_collector_.at(i).name##_info_.get_count_val(j); \ + total_collector.name##_info_.total_time_[j] += \ + multi_collector_.at(i).name##_info_.get_total_time_val(j); +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE } + } } return ret; } -int ObRSTCollector::enable_query_response_time(uint64_t tenant_id) -{ - int ret = OB_SUCCESS; - omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); - if (tenant_config.is_valid()) { - ObRSTTimeCollector* time_collector; - if (OB_SUCC(collector_map_.get_refactored(tenant_id, time_collector))) { - SERVER_LOG(INFO, "time collector of the tenant is existed", K(ret), K(tenant_id)); - } else if (OB_FAIL(collector_map_.set_refactored(tenant_id, new ObRSTTimeCollector()))) { - SERVER_LOG(WARN, "create time collector of the tenant failed", K(ret), K(tenant_id)); - } - } - return ret; -} -int ObRSTCollector::free_query_response_time(uint64_t tenant_id) +int ObTenantQueryRespTimeCollector::flush() { int ret = OB_SUCCESS; - omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); - if (tenant_config.is_valid()) { - ObRSTTimeCollector* time_collector; - if (OB_FAIL(collector_map_.get_refactored(tenant_id, time_collector))) { - if(OB_HASH_NOT_EXIST == ret){ - SERVER_LOG(WARN, "time collector of the tenant does not exist", K(ret), K(tenant_id)); - ret = OB_SUCCESS; - } else { - SERVER_LOG(WARN, "query time collector of the tenant failed", K(ret), K(tenant_id)); - } - } else if (OB_FAIL(collector_map_.erase_refactored(tenant_id))) { - SERVER_LOG(WARN, "erase the time collector failed", K(tenant_id)); + WLockGuard wlock_guard(rwlock_); + for (int64_t i = 0; OB_SUCC(ret) && i < multi_ways_count_; i++) { + if (OB_FAIL(multi_collector_.at(i).flush())) { + LOG_WARN("failed to flush resp time info collector", K(ret), K(i)); } } return ret; } -int ObRSTCollector::control_query_response_time(uint64_t tenant_id, const ObString& is_enable) -{ - int ret = OB_SUCCESS; - bool is_enable_value = false; - bool is_valid = false; - is_enable_value = ObConfigBoolParser::get(is_enable.ptr(), is_valid); - if (is_enable_value) { - if (OB_FAIL(enable_query_response_time(tenant_id))) { - SERVER_LOG(WARN, "enable the query response time failed", K(ret), K(tenant_id)); - } - } else if (OB_FAIL(free_query_response_time(tenant_id))) { - SERVER_LOG(WARN, "free the query response time failed", K(ret), K(tenant_id)); - } - return ret; -} - } // namespace observer } // namespace oceanbase diff --git a/src/observer/mysql/ob_query_response_time.h b/src/observer/mysql/ob_query_response_time.h index 32173ed473..b1783e0ed1 100644 --- a/src/observer/mysql/ob_query_response_time.h +++ b/src/observer/mysql/ob_query_response_time.h @@ -10,12 +10,41 @@ * See the Mulan PubL v2 for more details. */ +#ifdef DEF_RESP_TIME_SQL_TYPE +DEF_RESP_TIME_SQL_TYPE(select_sql) +DEF_RESP_TIME_SQL_TYPE(insert_sql) +DEF_RESP_TIME_SQL_TYPE(delete_sql) +DEF_RESP_TIME_SQL_TYPE(update_sql) +DEF_RESP_TIME_SQL_TYPE(replace_sql) +DEF_RESP_TIME_SQL_TYPE(commit_sql) +DEF_RESP_TIME_SQL_TYPE(other_sql) +DEF_RESP_TIME_SQL_TYPE(inner_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_select_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_insert_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_delete_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_update_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_replace_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_query_and_mutate_sql) +DEF_RESP_TIME_SQL_TYPE(tableapi_other_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_scan_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_put_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_delete_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_append_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_increment_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_check_and_put_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_check_and_mutate_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_check_and_delete_sql) +DEF_RESP_TIME_SQL_TYPE(hbase_hybrid_batch_sql) +#endif // DEF_RESP_TIME_SQL_TYPE + #ifndef OB_QUERY_RESPONSE_TIME_ #define OB_QUERY_RESPONSE_TIME_ #include "share/ob_define.h" #include "lib/charset/ob_charset.h" #include "lib/string/ob_string.h" +#include "sql/resolver/ob_stmt_type.h" +#include "lib/lock/ob_tc_rwlock.h" namespace oceanbase { namespace share { @@ -47,7 +76,7 @@ class ObRSTUtility { public: ObRSTUtility(); virtual ~ObRSTUtility(); - int setup(uint base); + int setup(uint32_t base); uint base() const {return base_;}; uint negative_count() const { return negative_count_; }; @@ -65,42 +94,67 @@ private: uint64_t bound_[OB_QRT_OVERALL_COUNT]; }; -class ObRSTTimeCollector { -public: - - ObRSTUtility utility_; - uint32_t count_[OB_QRT_OVERALL_COUNT]; - uint64_t total_[OB_QRT_OVERALL_COUNT]; - -public: - ObRSTTimeCollector(); - ~ObRSTTimeCollector(); - int setup(uint base) {return utility_.setup(base);}; - uint32_t count(uint index) {return count_[index];}; - uint64_t total(uint index) {return total_[index];}; - uint bound_count() {return utility_.bound_count();} - uint64_t bound(uint index) {return utility_.bound(index);} - void print_time(char* buffer, std::size_t buffer_size, const char* format, uint64_t value); - int flush(); - int collect(uint64_t time); +struct QueryRespTimeInfo { + int collect(const int64_t pos, const uint64_t resp_time); + uint64_t get_count_val(const int64_t pos); + uint64_t get_total_time_val(const int64_t pos); + uint64_t count_[OB_QRT_OVERALL_COUNT]; + uint64_t total_time_[OB_QRT_OVERALL_COUNT]; }; -class ObRSTCollector{ +enum RespTimeSqlType { +#define DEF_RESP_TIME_SQL_TYPE(name) name, +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE + END, +}; + +class ObRespTimeInfoCollector { public: - static ObRSTCollector& get_instance(); - common::hash::ObHashMap collector_map_; + ObRespTimeInfoCollector(); + ~ObRespTimeInfoCollector() = default; + int setup(uint32_t base); + int collect(const sql::stmt::StmtType sql_type, const bool is_inner_sql, const uint64_t resp_time); + int flush(int64_t base = OB_INVALID_ID); + const ObRSTUtility &utility() const {return utility_;} + int get_count_val(const RespTimeSqlType resp_time_sql_type, const int32_t pos, int64_t &val); + int get_total_time_val(const RespTimeSqlType resp_time_sql_type, const int32_t pos, int64_t &val); + TO_STRING_KV(K(utility_.base())); +public: +#define DEF_RESP_TIME_SQL_TYPE(name) \ + QueryRespTimeInfo name##_info_; +#include "observer/mysql/ob_query_response_time.h" +#undef DEF_RESP_TIME_SQL_TYPE +private: + ObRSTUtility utility_; +}; + +class ObTenantQueryRespTimeCollector { +public: + ObTenantQueryRespTimeCollector(): multi_collector_(),rwlock_(),flush_config_version_(0),multi_ways_count_(64), is_inited_(false) {}; + ~ObTenantQueryRespTimeCollector() {}; int init(); - int control_query_response_time(uint64_t tenant_id, const ObString& is_enable); - int flush_query_response_time(uint64_t tenant_id, const ObString& is_enable); - int collect_query_response_time(uint64_t tenant_id_, uint64_t time); + void destroy(); + static int mtl_init(ObTenantQueryRespTimeCollector *&t_resp_time_collector); + static void mtl_destroy(ObTenantQueryRespTimeCollector *&t_resp_time_collector); + + int collect(const sql::stmt::StmtType sql_type, const bool is_inner_sql, const uint64_t resp_time); + int get_sum_value(ObRespTimeInfoCollector &total_collector); + int resize(); + int flush(); + int64_t get_flush_config_version() const { return flush_config_version_; }; + void set_flush_config_version(int64_t version) { ATOMIC_SET(&flush_config_version_, version); }; private: - ObRSTCollector(); - ~ObRSTCollector(); - bool inited_; - int free_query_response_time(uint64_t tenant_id); - int enable_query_response_time(uint64_t tenant_id); -}; + typedef common::RWLock::RLockGuard RLockGuard; + typedef common::RWLock::WLockGuard WLockGuard; + ObArray multi_collector_; + common::RWLock rwlock_; //for leader revoke/takeover submit log + int64_t flush_config_version_; + const int64_t multi_ways_count_; + bool is_inited_; + DISALLOW_COPY_AND_ASSIGN(ObTenantQueryRespTimeCollector); +}; // end of class ObTenantQueryRespTimeCollector } // namespace observer } // namespace oceanbase diff --git a/src/observer/mysql/ob_query_retry_ctrl.cpp b/src/observer/mysql/ob_query_retry_ctrl.cpp index d7e4e98abf..8abb7e15b3 100644 --- a/src/observer/mysql/ob_query_retry_ctrl.cpp +++ b/src/observer/mysql/ob_query_retry_ctrl.cpp @@ -727,6 +727,9 @@ void ObQueryRetryCtrl::px_thread_not_enough_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObPxThreadNotEnoughRetryPolicy thread_not_enough; retry_obj.test(thread_not_enough); + if (can_start_retry_wait_event(v.retry_type_)) { + start_px_worker_insufficient_retry_wait_event(v.session_ ,v.ctx_); + } } void ObQueryRetryCtrl::trx_set_violation_proc(ObRetryParam &v) @@ -749,6 +752,9 @@ void ObQueryRetryCtrl::try_lock_row_conflict_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObLockRowConflictRetryPolicy lock_conflict; retry_obj.test(lock_conflict); + if (can_start_retry_wait_event(v.retry_type_)) { + start_rowlock_retry_wait_event(v.session_); + } } @@ -766,6 +772,9 @@ void ObQueryRetryCtrl::location_error_proc(ObRetryParam &v) ObRefreshLocationCacheNonblockPolicy nonblock_refresh; retry_obj.test(nonblock_refresh); } + if (can_start_retry_wait_event(v.retry_type_)) { + start_location_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::nonblock_location_error_proc(ObRetryParam &v) @@ -785,6 +794,9 @@ void ObQueryRetryCtrl::location_error_nothing_readable_proc(ObRetryParam &v) // 但是还是要保持inited的状态以便通过防御性检查,所以不能调reset,而是要调clear),然后再重试。 v.session_.get_retry_info_for_update().clear(); location_error_proc(v); + if (can_start_retry_wait_event(v.retry_type_)) { + start_location_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::peer_server_status_uncertain_proc(ObRetryParam &v) @@ -802,6 +814,9 @@ void ObQueryRetryCtrl::schema_error_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObCheckSchemaUpdatePolicy schema_update_policy; retry_obj.test(schema_update_policy); + if (can_start_retry_wait_event(v.retry_type_)) { + start_schema_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::autoinc_cache_not_equal_retry_proc(ObRetryParam &v) @@ -810,6 +825,9 @@ void ObQueryRetryCtrl::autoinc_cache_not_equal_retry_proc(ObRetryParam &v) ObAutoincCacheNotEqualRetryPolicy autoinc_retry_policy; ObCommonRetryLinearShortWaitPolicy retry_short_wait; retry_obj.test(autoinc_retry_policy).test(retry_short_wait); + if (can_start_retry_wait_event(v.retry_type_)) { + start_schema_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::snapshot_discard_proc(ObRetryParam &v) @@ -838,6 +856,11 @@ void ObQueryRetryCtrl::long_wait_retry_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObCommonRetryIndexLongWaitPolicy long_wait_retry; retry_obj.test(long_wait_retry); + if ( OB_REPLICA_NOT_READABLE == v.err_) { + if (can_start_retry_wait_event(v.retry_type_)) { + start_replica_not_readable_retry_wait_event(v.session_); + } + } } void ObQueryRetryCtrl::short_wait_retry_proc(ObRetryParam &v) @@ -845,6 +868,15 @@ void ObQueryRetryCtrl::short_wait_retry_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObCommonRetryLinearShortWaitPolicy short_wait_retry; retry_obj.test(short_wait_retry); + if (can_start_retry_wait_event(v.retry_type_)) { + if (OB_ERR_INSUFFICIENT_PX_WORKER == v.err_) { + start_px_worker_insufficient_retry_wait_event(v.session_ ,v.ctx_); + } else if (OB_GTS_NOT_READY == v.err_ || OB_GTI_NOT_READY == v.err_) { + start_gts_not_ready_retry_wait_event(v.session_ ,v.err_); + } else if ( OB_REPLICA_NOT_READABLE == v.err_) { + start_replica_not_readable_retry_wait_event(v.session_); + } + } } void ObQueryRetryCtrl::force_local_retry_proc(ObRetryParam &v) @@ -897,6 +929,9 @@ void ObQueryRetryCtrl::inner_try_lock_row_conflict_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObInnerLockRowConflictRetryPolicy lock_conflict; retry_obj.test(lock_conflict); + if (can_start_retry_wait_event(v.retry_type_)) { + start_rowlock_retry_wait_event(v.session_); + } } void ObQueryRetryCtrl::inner_table_location_error_proc(ObRetryParam &v) @@ -906,6 +941,9 @@ void ObQueryRetryCtrl::inner_table_location_error_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObCommonRetryIndexLongWaitPolicy retry_long_wait; retry_obj.test(retry_long_wait); + if (can_start_retry_wait_event(v.retry_type_)) { + start_location_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::inner_location_error_proc(ObRetryParam &v) @@ -931,6 +969,9 @@ void ObQueryRetryCtrl::inner_location_error_proc(ObRetryParam &v) // case 4: do nothing for other inner sql empty_proc(v); } + if (can_start_retry_wait_event(v.retry_type_)) { + start_location_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::inner_location_error_nothing_readable_proc(ObRetryParam &v) @@ -941,6 +982,9 @@ void ObQueryRetryCtrl::inner_location_error_nothing_readable_proc(ObRetryParam & // 但是还是要保持inited的状态以便通过防御性检查,所以不能调reset,而是要调clear),然后再重试。 v.session_.get_retry_info_for_update().clear(); inner_location_error_proc(v); + if (can_start_retry_wait_event(v.retry_type_)) { + start_location_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::inner_common_schema_error_proc(ObRetryParam &v) @@ -948,6 +992,9 @@ void ObQueryRetryCtrl::inner_common_schema_error_proc(ObRetryParam &v) ObRetryObject retry_obj(v); ObInnerCommonCheckSchemaPolicy common_schema_policy; retry_obj.test(common_schema_policy); + if (can_start_retry_wait_event(v.retry_type_)) { + start_schema_error_retry_wait_event(v.session_ ,v.err_); + } } @@ -957,6 +1004,9 @@ void ObQueryRetryCtrl::inner_schema_error_proc(ObRetryParam &v) ObInnerCommonCheckSchemaPolicy common_schema_policy; ObInnerCheckSchemaPolicy schema_policy; retry_obj.test(common_schema_policy).test(schema_policy); + if (can_start_retry_wait_event(v.retry_type_)) { + start_schema_error_retry_wait_event(v.session_ ,v.err_); + } } void ObQueryRetryCtrl::inner_peer_server_status_uncertain_proc(ObRetryParam &v) @@ -988,6 +1038,10 @@ void ObQueryRetryCtrl::empty_proc(ObRetryParam &v) void ObQueryRetryCtrl::before_func(ObRetryParam &v) { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().record_last_query_exec_use_time_us(); + } if (OB_UNLIKELY(v.is_inner_sql_)) { ObRetryObject retry_obj(v); ObInnerBeforeRetryCheckPolicy before_retry; @@ -1014,6 +1068,12 @@ void ObQueryRetryCtrl::after_func(ObRetryParam &v) if (RETRY_TYPE_NONE != v.retry_type_) { v.session_.get_retry_info_for_update().set_last_query_retry_err(v.err_); v.session_.get_retry_info_for_update().inc_retry_cnt(); + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di) && di->get_ash_stat().retry_wait_event_no_ == 0) { + if (can_start_retry_wait_event(v.retry_type_)) { + start_other_retry_wait_event(v.session_ ,v.err_); + } + } if (OB_UNLIKELY(v.err_ != v.client_ret_)) { LOG_ERROR_RET(OB_ERR_UNEXPECTED, "when need retry, v.client_ret_ must be equal to err", K(v)); } @@ -1303,5 +1363,74 @@ void ObQueryRetryCtrl::on_close_resultset_fail_(const int err, int &client_ret) } } } + +bool ObQueryRetryCtrl::can_start_retry_wait_event(const ObQueryRetryType &retry_type) +{ + return retry_type != RETRY_TYPE_NONE; +} +void ObQueryRetryCtrl::start_schema_error_retry_wait_event(ObSQLSessionInfo &session, const int error_code) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::SCHEMA_RETRY_WAIT, + error_code, + session.get_retry_info_for_update().get_retry_ash_diag_info().table_id_, + session.get_retry_info_for_update().get_retry_ash_diag_info().table_schema_version_); +} + +void ObQueryRetryCtrl::start_location_error_retry_wait_event(ObSQLSessionInfo &session, const int error_code) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::LOCATION_RETRY_WAIT, + error_code, + session.get_retry_info_for_update().get_retry_ash_diag_info().ls_id_, + 0); +} + +void ObQueryRetryCtrl::start_rowlock_retry_wait_event(ObSQLSessionInfo &session) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::ROW_LOCK_WAIT, + session.get_retry_info_for_update().get_retry_ash_diag_info().holder_tx_id_, + session.get_retry_info_for_update().get_retry_ash_diag_info().holder_data_seq_num_, + session.get_retry_info_for_update().get_retry_ash_diag_info().holder_lock_timestamp_); +} + +void ObQueryRetryCtrl::start_px_worker_insufficient_retry_wait_event( + ObSQLSessionInfo &session, const ObSqlCtx &sql_ctx) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::INSUFFICIENT_PX_WORKER_RETRY_WAIT, + session.get_retry_info_for_update().get_retry_ash_diag_info().dop_, + session.get_retry_info_for_update().get_retry_ash_diag_info().required_px_workers_number_, + session.get_retry_info_for_update().get_retry_ash_diag_info().admitted_px_workers_number_); +} + +void ObQueryRetryCtrl::start_gts_not_ready_retry_wait_event(ObSQLSessionInfo &session, const int error_code) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::GTS_NOT_READEY_RETRY_WAIT, + error_code, + session.get_retry_info_for_update().get_retry_ash_diag_info().sys_ls_leader_addr_, + 0); +} + +void ObQueryRetryCtrl::start_replica_not_readable_retry_wait_event(ObSQLSessionInfo &session) +{ + common::ObDiagnosticInfo *di = common::ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().begin_retry_wait_event(ObWaitEventIds::REPLICA_NOT_READABLE_RETRY_WAIT, + session.get_retry_info_for_update().get_retry_ash_diag_info().ls_id_, + di->get_ash_stat().tablet_id_, 0); + } +} + +void ObQueryRetryCtrl::start_other_retry_wait_event(ObSQLSessionInfo &session, const int error_code) +{ + GET_DIAGNOSTIC_INFO->get_ash_stat().begin_retry_wait_event( + ObWaitEventIds::OTHER_RETRY_WAIT, + error_code, + 0, + 0); +} }/* ns observer*/ }/* ns oceanbase */ diff --git a/src/observer/mysql/ob_query_retry_ctrl.h b/src/observer/mysql/ob_query_retry_ctrl.h index 5116d5ef60..e8133627b2 100644 --- a/src/observer/mysql/ob_query_retry_ctrl.h +++ b/src/observer/mysql/ob_query_retry_ctrl.h @@ -261,6 +261,16 @@ public: || isolation == transaction::ObTxIsolationLevel::SERIAL); } static int get_das_retry_func(int err, sql::ObDASRetryCtrl::retry_func &retry_func); + + // processors for ASH and wait event + static bool can_start_retry_wait_event(const ObQueryRetryType& retry_type); + static void start_schema_error_retry_wait_event(sql::ObSQLSessionInfo &session, const int error_code); + static void start_location_error_retry_wait_event(sql::ObSQLSessionInfo &session, const int error_code); + static void start_rowlock_retry_wait_event(sql::ObSQLSessionInfo &session); + static void start_px_worker_insufficient_retry_wait_event(sql::ObSQLSessionInfo &session, const sql::ObSqlCtx& sql_ctx); + static void start_gts_not_ready_retry_wait_event(sql::ObSQLSessionInfo &session, const int error_code); + static void start_replica_not_readable_retry_wait_event(sql::ObSQLSessionInfo &session); + static void start_other_retry_wait_event(sql::ObSQLSessionInfo &session, const int error_code); public: // schema类型的错误最多在本线程重试5次。 // 5是拍脑袋决定的,之后还要看统计数据的反馈再修改。TODO qianfu.zpf @@ -274,19 +284,20 @@ public: // 1ms,重试write dml等待时间 static const uint32_t WAIT_RETRY_WRITE_DML_US = 1 * 1000; -private: +public: /* functions */ typedef void (*retry_func)(ObRetryParam &); // find err code processor in map_ - int get_func(int err, bool is_inner, retry_func &func); + static int get_func(int err, bool is_inner, retry_func &func); + static void empty_proc(ObRetryParam &v); +private: // default processor hook static void before_func(ObRetryParam &v); static void after_func(ObRetryParam &v); // various processors for error codes - static void empty_proc(ObRetryParam &v); static void px_thread_not_enough_proc(ObRetryParam &v); static void trx_set_violation_proc(ObRetryParam &v); static void trx_can_not_serialize_proc(ObRetryParam &v); diff --git a/src/observer/mysql/obmp_base.cpp b/src/observer/mysql/obmp_base.cpp index 9cb528441b..9ef595263e 100644 --- a/src/observer/mysql/obmp_base.cpp +++ b/src/observer/mysql/obmp_base.cpp @@ -168,7 +168,6 @@ int ObMPBase::after_process(int error_code) void ObMPBase::cleanup() { - ObActiveSessionGuard::setup_default_ash(); } void ObMPBase::disconnect() @@ -400,8 +399,13 @@ int ObMPBase::do_after_process(sql::ObSQLSessionInfo &session, // 注意,此处req_has_wokenup_可能为true,不能再访问req对象 // @todo 重构wb逻辑 if (!async_resp_used) { // 异步回包不重置warning buffer,重置操作在callback中做 + session.reset_cur_sql_id(); + session.reset_current_plan_hash(); + session.reset_current_plan_id(); session.reset_warnings_buf(); - session.set_session_sleep(); + if (!session.get_is_in_retry()) { + session.set_session_sleep(); + } } // clear tsi warning buffer ob_setup_tsi_warning_buffer(NULL); diff --git a/src/observer/mysql/obmp_connect.cpp b/src/observer/mysql/obmp_connect.cpp index 9420169d92..a75a45aa04 100644 --- a/src/observer/mysql/obmp_connect.cpp +++ b/src/observer/mysql/obmp_connect.cpp @@ -214,7 +214,6 @@ int ObMPConnect::init_process_single_stmt(const ObMultiStmtItem &multi_stmt_item int ret = OB_SUCCESS; const ObString &sql = multi_stmt_item.get_sql(); ObVirtualTableIteratorFactory vt_iter_factory(*gctx_.vt_iter_creator_); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); ObSchemaGetterGuard schema_guard; // init_connect可以执行query和dml语句,必须加上req_timeinfo_guard observer::ObReqTimeGuard req_timeinfo_guard; @@ -335,10 +334,11 @@ int ObMPConnect::process() } else if (OB_ISNULL(GCTX.session_mgr_)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("session mgr is NULL", K(ret)); + } else if (OB_FAIL(conn->ret_)) { + LOG_WARN("connection fail at obsm_handle process", K(conn->ret_)); } else { - if (OB_FAIL(conn->ret_)) { - LOG_WARN("connection fail at obsm_handle process", K(conn->ret_)); - } else if (OB_FAIL(get_user_tenant(*conn))) { + ObDiagnosticInfoSwitchGuard di_guard(conn->di_); + if (OB_FAIL(get_user_tenant(*conn))) { LOG_WARN("get user name and tenant name failed", K(ret)); } else if ((SS_INIT == GCTX.status_ || SS_STARTING == GCTX.status_) && !tenant_name_.empty() @@ -502,7 +502,6 @@ int ObMPConnect::process() //Action!!:must revert it after no use it revert_session(session); } - common::ObTenantStatEstGuard guard(tenant_id); if (OB_SUCCESS != proc_ret) { if (NULL != session) { free_session(); @@ -2027,9 +2026,12 @@ int ObMPConnect::check_common_property(ObSMConnection &conn, ObMySQLCapabilityFl conn.client_addr_port_ = client_addr_port; conn.client_create_time_ = client_create_time; conn.sess_create_time_ = sess_create_time; + if (conn.di_!= nullptr) { + conn.di_->get_ash_stat().proxy_sid_ = proxy_sessid; + } int64_t code = 0; - LOG_DEBUG("construct session id", K(conn.client_sessid_), K(conn.sessid_), - K(conn.client_addr_port_), K(conn.client_create_time_) ,K(conn.proxy_sessid_)); + LOG_INFO("construct session id", K(conn.client_sessid_), K(conn.sessid_), + K(conn.client_addr_port_), K(conn.client_create_time_) ,K(conn.proxy_sessid_), KPC(ObLocalDiagnosticInfo::get())); if (conn.proxy_cap_flags_.is_ob_protocol_v2_support()) { // when used 2.0 protocol, do not use mysql compress client_cap.cap_flags_.OB_CLIENT_COMPRESS = 0; @@ -2247,7 +2249,6 @@ int ObMPConnect::verify_identify(ObSMConnection &conn, ObSQLSessionInfo &session { int ret = OB_SUCCESS; //at this point, tenant_id and sessid are valid - ObSessionStatEstGuard guard(tenant_id, conn.sessid_); ObSQLSessionInfo::LockGuard lock_guard(session.get_query_lock()); if (OB_ISNULL(req_)) { ret = OB_ERR_UNEXPECTED; diff --git a/src/observer/mysql/obmp_disconnect.cpp b/src/observer/mysql/obmp_disconnect.cpp index 5cac0dada1..4a0d080bae 100644 --- a/src/observer/mysql/obmp_disconnect.cpp +++ b/src/observer/mysql/obmp_disconnect.cpp @@ -23,6 +23,8 @@ using namespace oceanbase::observer; using namespace oceanbase::common; +void __attribute__((weak)) request_finish_callback(); + ObMPDisconnect::ObMPDisconnect(const sql::ObFreeSessionCtx &ctx) : ctx_(ctx) { @@ -77,7 +79,6 @@ int ObMPDisconnect::run() if (OB_FAIL(GCTX.session_mgr_->free_session(ctx_))) { LOG_WARN("free session fail", K(ctx_)); } else { - common::ObTenantStatEstGuard guard(ctx_.tenant_id_); EVENT_INC(SQL_USER_LOGOUTS_CUMULATIVE); LOG_INFO("free session successfully", "sessid", ctx_.sessid_); if (OB_UNLIKELY(OB_FAIL(sql::ObSQLSessionMgr::is_need_clear_sessid(&conn, is_need_clear)))) { @@ -92,5 +93,6 @@ int ObMPDisconnect::run() } } } + request_finish_callback(); return ret; } diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index d81ee27010..84399d3319 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -67,6 +67,7 @@ using namespace oceanbase::share; using namespace oceanbase::share::schema; using namespace oceanbase::trace; using namespace oceanbase::sql; +void __attribute__((weak)) request_finish_callback(); ObMPQuery::ObMPQuery(const ObGlobalContext &gctx) : ObMPBase(gctx), single_process_timestamp_(0), @@ -366,6 +367,13 @@ int ObMPQuery::process() session.check_and_reset_retry_info(*cur_trace_id, THIS_WORKER.need_retry()); session.set_last_trace_id(ObCurTraceId::get_trace_id()); IGNORE_RETURN record_flt_trace(session); + // clear thread-local variables used for queue waiting + // to prevent async callbacks from finishing before + // request_finish_callback, which may free the request. + // this operation should be protected by the session lock. + if (async_resp_used) { + request_finish_callback(); + } } if (is_conn_valid()) { @@ -488,7 +496,6 @@ int ObMPQuery::process_single_stmt(const ObMultiStmtItem &multi_stmt_item, session.set_curr_trans_last_stmt_end_time(0); //============================ 注意这些变量的生命周期 ================================ - ObSessionStatEstGuard stat_est_guard(conn->tenant_->id(), session.get_sessid()); if (OB_FAIL(init_process_var(ctx_, multi_stmt_item, session))) { LOG_WARN("init process var failed.", K(ret), K(multi_stmt_item)); } else { @@ -674,6 +681,7 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, { int ret = OB_SUCCESS; ObAuditRecordData &audit_record = session.get_raw_audit_record(); + ObExecutingSqlStatRecord sqlstat_record; audit_record.try_cnt_++; bool is_diagnostics_stmt = false; bool need_response_error = true; @@ -681,6 +689,7 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); /* !!! * 注意req_timeinfo_guard一定要放在result前面 @@ -723,15 +732,16 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, } ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = NULL; if (OB_SUCC(ret)) { + ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - di = ObDiagnoseSessionInfo::get_local_diagnose_info(); + audit_record.exec_record_.record_start(); } - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); - if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } result.set_has_more_result(has_more_result); ObTaskExecutorCtx &task_ctx = result.get_exec_context().get_task_exec_ctx(); @@ -838,12 +848,23 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); - record_stat(result.get_stmt_type(), exec_end_timestamp_); + audit_record.exec_record_.record_end(); + record_stat(result.get_stmt_type(), exec_end_timestamp_, result.get_session(), ret); + audit_record.stmt_type_ = result.get_stmt_type(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_rows_processed(result.get_affected_rows() + result.get_return_rows()); + sqlstat_record.set_partition_cnt(result.get_exec_context().get_das_ctx().get_related_tablet_cnt()); + sqlstat_record.set_is_route_miss(result.get_session().partition_hit().get_bool()? 0 : 1); + sqlstat_record.set_is_plan_cache_hit(ctx_.plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(result.get_session(), + ctx_.cur_sql_, + result.get_physical_plan()); + } if (enable_perf_event && !THIS_THWORKER.need_retry() && OB_NOT_NULL(result.get_physical_plan())) { @@ -1327,11 +1348,19 @@ OB_INLINE int ObMPQuery::response_result(ObMySQLResultSet &result, return ret; } -inline void ObMPQuery::record_stat(const stmt::StmtType type, const int64_t end_time) const +inline void ObMPQuery::record_stat(const stmt::StmtType type, + const int64_t end_time, + const sql::ObSQLSessionInfo& session, + const int64_t ret) const { #define ADD_STMT_STAT(type) \ case stmt::T_##type: \ - EVENT_INC(SQL_##type##_COUNT); \ + if (!session.get_is_in_retry()) { \ + EVENT_INC(SQL_##type##_COUNT); \ + if (OB_SUCCESS != ret) { \ + EVENT_INC(SQL_FAIL_COUNT); \ + } \ + } \ EVENT_ADD(SQL_##type##_TIME, time_cost); \ break const int64_t time_cost = end_time - get_receive_timestamp(); @@ -1346,8 +1375,13 @@ inline void ObMPQuery::record_stat(const stmt::StmtType type, const int64_t end_ ADD_STMT_STAT(DELETE); default: { - EVENT_INC(SQL_OTHER_COUNT); EVENT_ADD(SQL_OTHER_TIME, time_cost); + if (!session.get_is_in_retry()) { + EVENT_INC(SQL_OTHER_COUNT); + if (OB_SUCCESS != ret) { + EVENT_INC(SQL_FAIL_COUNT); + } + } } } } diff --git a/src/observer/mysql/obmp_query.h b/src/observer/mysql/obmp_query.h index fabb42a9cb..e2219df7b8 100644 --- a/src/observer/mysql/obmp_query.h +++ b/src/observer/mysql/obmp_query.h @@ -88,7 +88,9 @@ private: bool &need_disconnect); - void record_stat(const sql::stmt::StmtType type, const int64_t end_time) const; + void record_stat(const sql::stmt::StmtType type, const int64_t end_time, + const sql::ObSQLSessionInfo& session, + const int64_t ret) const; void update_audit_info(const ObWaitEventStat &total_wait_desc, ObAuditRecordData &record); int fill_feedback_session_info(ObMySQLResultSet &result, diff --git a/src/observer/mysql/obmp_reset_connection.cpp b/src/observer/mysql/obmp_reset_connection.cpp index 73678ed396..9aef82465c 100644 --- a/src/observer/mysql/obmp_reset_connection.cpp +++ b/src/observer/mysql/obmp_reset_connection.cpp @@ -65,9 +65,8 @@ int ObMPResetConnection::process() int64_t execution_id = 0; int64_t query_timeout = 0; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); - ObMaxWaitGuard max_wait_guard(NULL, di); - ObTotalWaitGuard total_wait_guard(NULL, di); + ObMaxWaitGuard max_wait_guard(nullptr); + ObTotalWaitGuard total_wait_guard(nullptr); const ObMySQLRawPacket &pkt = reinterpret_cast(req_->get_packet()); session->update_last_active_time(); session->set_query_start_time(ObTimeUtility::current_time()); diff --git a/src/observer/mysql/obmp_stmt_close.cpp b/src/observer/mysql/obmp_stmt_close.cpp index babe62eb14..1c557a3c50 100644 --- a/src/observer/mysql/obmp_stmt_close.cpp +++ b/src/observer/mysql/obmp_stmt_close.cpp @@ -71,7 +71,6 @@ int ObMPStmtClose::process() } else { const ObMySQLRawPacket &pkt = reinterpret_cast(req_->get_packet()); ObSQLSessionInfo::LockGuard lock_guard(session->get_query_lock()); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session->get_sessid()); session->init_use_rich_format(); LOG_TRACE("close ps stmt or cursor", K_(stmt_id), K(session->get_sessid())); if (OB_FAIL(sql::ObFLTUtils::init_flt_info(pkt.get_extra_info(), *session, diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index fd46040a5a..96a51fa554 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -1285,6 +1285,7 @@ int ObMPStmtExecute::do_process(ObSQLSessionInfo &session, { int ret = OB_SUCCESS; ObAuditRecordData &audit_record = session.get_raw_audit_record(); + ObExecutingSqlStatRecord sqlstat_record; audit_record.try_cnt_++; bool is_diagnostics_stmt = false; ObPsStmtId inner_stmt_id = OB_INVALID_ID; @@ -1292,6 +1293,7 @@ int ObMPStmtExecute::do_process(ObSQLSessionInfo &session, const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); @@ -1304,14 +1306,18 @@ int ObMPStmtExecute::do_process(ObSQLSessionInfo &session, ObWaitEventStat total_wait_desc; int64_t execution_id = 0; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); + } result.set_has_more_result(has_more_result); result.set_ps_protocol(); ObTaskExecutorCtx *task_ctx = result.get_exec_context().get_task_executor_ctx(); @@ -1382,12 +1388,24 @@ int ObMPStmtExecute::do_process(ObSQLSessionInfo &session, audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); - record_stat(result.get_stmt_type(), exec_end_timestamp_); + audit_record.exec_record_.record_end(); + record_stat(result.get_stmt_type(), exec_end_timestamp_, session, ret); + audit_record.stmt_type_ = result.get_stmt_type(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_rows_processed(result.get_affected_rows() + result.get_return_rows()); + sqlstat_record.set_partition_cnt(result.get_exec_context().get_das_ctx().get_related_tablet_cnt()); + sqlstat_record.set_is_route_miss(result.get_session().partition_hit().get_bool()? 0 : 1); + sqlstat_record.set_is_plan_cache_hit(ctx_.plan_cache_hit_); + ObString sql_id = ObString::make_string(ctx_.sql_id_); + sqlstat_record.move_to_sqlstat_cache(result.get_session(), + ctx_.cur_sql_, + result.get_physical_plan()); + } if (enable_perf_event && !THIS_THWORKER.need_retry() && OB_NOT_NULL(result.get_physical_plan())) { @@ -1779,7 +1797,6 @@ int ObMPStmtExecute::process_execute_stmt(const ObMultiStmtItem &multi_stmt_item setup_wb(session); //============================ 注意这些变量的生命周期 ================================ ObSMConnection *conn = get_conn(); - ObSessionStatEstGuard stat_est_guard(conn->tenant_->id(), session.get_sessid()); if (OB_FAIL(init_process_var(ctx_, multi_stmt_item, session))) { LOG_WARN("init process var failed.", K(ret), K(multi_stmt_item)); } else { @@ -3199,11 +3216,18 @@ int ObMPStmtExecute::parse_oracle_interval_ym_value(const char *&data, ObObj &pa return ret; } -void ObMPStmtExecute::record_stat(const stmt::StmtType type, const int64_t end_time) const +void ObMPStmtExecute::record_stat(const stmt::StmtType type, const int64_t end_time, + const sql::ObSQLSessionInfo& session, + const int64_t ret) const { #define ADD_STMT_STAT(type) \ case stmt::T_##type: \ - EVENT_INC(SQL_##type##_COUNT); \ + if (!session.get_is_in_retry()) { \ + EVENT_INC(SQL_##type##_COUNT); \ + if (OB_SUCCESS != ret) { \ + EVENT_INC(SQL_FAIL_COUNT); \ + } \ + } \ EVENT_ADD(SQL_##type##_TIME, time_cost); \ break if (lib::is_diagnose_info_enabled()) { @@ -3217,8 +3241,13 @@ void ObMPStmtExecute::record_stat(const stmt::StmtType type, const int64_t end_t ADD_STMT_STAT(UPDATE); ADD_STMT_STAT(DELETE); default: { - EVENT_INC(SQL_OTHER_COUNT); EVENT_ADD(SQL_OTHER_TIME, time_cost); + if (!session.get_is_in_retry()) { + EVENT_INC(SQL_OTHER_COUNT); + if (OB_SUCCESS != ret) { + EVENT_INC(SQL_FAIL_COUNT); + } + } } } } diff --git a/src/observer/mysql/obmp_stmt_execute.h b/src/observer/mysql/obmp_stmt_execute.h index 51b0592a6d..458d1b193d 100644 --- a/src/observer/mysql/obmp_stmt_execute.h +++ b/src/observer/mysql/obmp_stmt_execute.h @@ -215,7 +215,8 @@ protected: inline void set_param(ParamStore *params) { params_ = params; } sql::ObSqlCtx &get_ctx() { return ctx_; } ObQueryRetryCtrl &get_retry_ctrl() { return retry_ctrl_; } - void record_stat(const sql::stmt::StmtType type, const int64_t end_time) const; + void record_stat(const sql::stmt::StmtType type, const int64_t end_time, + const sql::ObSQLSessionInfo& session, const int64_t ret) const; int request_params(sql::ObSQLSessionInfo *session, const char* &pos, uint32_t ps_stmt_checksum, diff --git a/src/observer/mysql/obmp_stmt_fetch.cpp b/src/observer/mysql/obmp_stmt_fetch.cpp index fb47b9bda1..9172b67ab6 100644 --- a/src/observer/mysql/obmp_stmt_fetch.cpp +++ b/src/observer/mysql/obmp_stmt_fetch.cpp @@ -160,10 +160,12 @@ int ObMPStmtFetch::do_process(ObSQLSessionInfo &session, { int ret = OB_SUCCESS; ObAuditRecordData &audit_record = session.get_raw_audit_record(); + ObExecutingSqlStatRecord sqlstat_record; audit_record.try_cnt_++; const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); ObPLCursorInfo *cursor = session.get_cursor(cursor_id_); if (OB_ISNULL(cursor)) { @@ -174,14 +176,19 @@ int ObMPStmtFetch::do_process(ObSQLSessionInfo &session, } else { ObWaitEventStat total_wait_desc; int64_t execution_id = 0; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); ObMaxWaitGuard max_wait_guard(enable_perf_event - ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); int64_t fetch_limit = OB_INVALID_COUNT == fetch_rows_ ? INT64_MAX : fetch_rows_; int64_t true_row_num = 0; if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); + } + if (enable_sqlstat && OB_NOT_NULL(session.get_cur_exec_ctx()) && + OB_NOT_NULL(session.get_cur_exec_ctx()->get_sql_ctx())) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } if (OB_ISNULL(gctx_.sql_engine_)) { ret = OB_ERR_UNEXPECTED; @@ -225,13 +232,35 @@ int ObMPStmtFetch::do_process(ObSQLSessionInfo &session, audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); + audit_record.exec_record_.record_end(); record_stat(stmt::T_EXECUTE, exec_end_timestamp_); + audit_record.stmt_type_ = stmt::T_EXECUTE; audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); } + if (enable_sqlstat && OB_NOT_NULL(session.get_cur_exec_ctx()) && + OB_NOT_NULL(session.get_cur_exec_ctx()->get_sql_ctx())) { + ObSqlCtx *sql_ctx = session.get_cur_exec_ctx()->get_sql_ctx(); + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.inc_fetch_cnt(); + ObString sql = ObString::make_empty_string(); + if (OB_NOT_NULL(cursor) + && cursor->is_ps_cursor()) { + ObPsStmtInfoGuard guard; + ObPsStmtInfo *ps_info = NULL; + ObPsStmtId inner_stmt_id = OB_INVALID_ID; + if (OB_SUCC(session.get_inner_ps_stmt_id(cursor_id_, inner_stmt_id)) + && OB_SUCC(session.get_ps_cache()->get_stmt_info_guard(inner_stmt_id, guard)) + && OB_NOT_NULL(ps_info = guard.get_stmt_info())) { + sql = ps_info->get_ps_sql(); + } else { + LOG_WARN("get sql fail in fetch", K(ret), K(cursor_id_), K(cursor->get_id())); + } + } + sqlstat_record.move_to_sqlstat_cache(session, sql); + } if (enable_sql_audit) { audit_record.affected_rows_ = fetch_limit; audit_record.return_rows_ = true_row_num; @@ -616,7 +645,6 @@ int ObMPStmtFetch::process_fetch_stmt(ObSQLSessionInfo &session, int ret = OB_SUCCESS; // 执行setup_wb后,所有WARNING都会写入到当前session的WARNING BUFFER中 setup_wb(session); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); //set session log_level.Must use ObThreadLogLevelUtils::clear() in pair ObThreadLogLevelUtils::init(session.get_log_id_level_map()); // obproxy may use 'SET @@last_schema_version = xxxx' to set newest schema, diff --git a/src/observer/mysql/obmp_stmt_get_piece_data.cpp b/src/observer/mysql/obmp_stmt_get_piece_data.cpp index f8de3f94b3..6f548871fb 100644 --- a/src/observer/mysql/obmp_stmt_get_piece_data.cpp +++ b/src/observer/mysql/obmp_stmt_get_piece_data.cpp @@ -186,7 +186,6 @@ int ObMPStmtGetPieceData::process_get_piece_data_stmt(ObSQLSessionInfo &session) setup_wb(session); ObVirtualTableIteratorFactory vt_iter_factory(*gctx_.vt_iter_creator_); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); ObThreadLogLevelUtils::init(session.get_log_id_level_map()); ret = do_process(session); ObThreadLogLevelUtils::clear(); @@ -203,22 +202,28 @@ int ObMPStmtGetPieceData::do_process(ObSQLSessionInfo &session) { int ret = OB_SUCCESS; ObAuditRecordData &audit_record = session.get_raw_audit_record(); + ObExecutingSqlStatRecord sqlstat_record; audit_record.try_cnt_++; const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); bool is_diagnostics_stmt = false; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ - : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); + } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } int64_t execution_id = 0; ObString sql = "get piece info"; @@ -243,7 +248,7 @@ int ObMPStmtGetPieceData::do_process(ObSQLSessionInfo &session) audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); + audit_record.exec_record_.record_end(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); @@ -251,6 +256,12 @@ int ObMPStmtGetPieceData::do_process(ObSQLSessionInfo &session) EVENT_INC(SQL_PS_PREPARE_COUNT); EVENT_ADD(SQL_PS_PREPARE_TIME, time_cost); } + + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.move_to_sqlstat_cache(session, sql); + } + } } // diagnose end diff --git a/src/observer/mysql/obmp_stmt_prepare.cpp b/src/observer/mysql/obmp_stmt_prepare.cpp index 5854074191..481cb0ca91 100644 --- a/src/observer/mysql/obmp_stmt_prepare.cpp +++ b/src/observer/mysql/obmp_stmt_prepare.cpp @@ -294,7 +294,6 @@ int ObMPStmtPrepare::process_prepare_stmt(const ObMultiStmtItem &multi_stmt_item int64_t sys_version = 0; setup_wb(session); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); if (OB_FAIL(init_process_var(ctx_, multi_stmt_item, session))) { LOG_WARN("init process var faield.", K(ret), K(multi_stmt_item)); } else { @@ -398,10 +397,12 @@ int ObMPStmtPrepare::do_process(ObSQLSessionInfo &session, { int ret = OB_SUCCESS; ObAuditRecordData &audit_record = session.get_raw_audit_record(); + ObExecutingSqlStatRecord sqlstat_record; audit_record.try_cnt_++; const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); bool is_diagnostics_stmt = false; bool need_response_error = true; @@ -415,12 +416,16 @@ int ObMPStmtPrepare::do_process(ObSQLSessionInfo &session, ObReqTimeGuard req_timeinfo_guard; SMART_VAR(ObMySQLResultSet, result, session, THIS_WORKER.get_allocator()) { ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ObMaxWaitGuard max_wait_guard(enable_perf_event ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); + } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } result.set_has_more_result(has_more_result); ObTaskExecutorCtx *task_ctx = result.get_exec_context().get_task_executor_ctx(); @@ -490,7 +495,7 @@ int ObMPStmtPrepare::do_process(ObSQLSessionInfo &session, audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); + audit_record.exec_record_.record_end(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); @@ -500,6 +505,16 @@ int ObMPStmtPrepare::do_process(ObSQLSessionInfo &session, EVENT_ADD(SQL_PS_PREPARE_TIME, time_cost); } } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_rows_processed(result.get_affected_rows() + result.get_return_rows()); + sqlstat_record.set_partition_cnt(result.get_exec_context().get_das_ctx().get_related_tablet_cnt()); + sqlstat_record.set_is_route_miss(result.get_session().partition_hit().get_bool()? 0 : 1); + sqlstat_record.set_is_plan_cache_hit(ctx_.plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(result.get_session(), + ctx_.cur_sql_, + result.get_physical_plan()); + } } } } // diagnose end diff --git a/src/observer/mysql/obmp_stmt_send_long_data.cpp b/src/observer/mysql/obmp_stmt_send_long_data.cpp index 6c978702d6..17f31fbec3 100644 --- a/src/observer/mysql/obmp_stmt_send_long_data.cpp +++ b/src/observer/mysql/obmp_stmt_send_long_data.cpp @@ -221,7 +221,6 @@ int ObMPStmtSendLongData::process_send_long_data_stmt(ObSQLSessionInfo &session) setup_wb(session); ObVirtualTableIteratorFactory vt_iter_factory(*gctx_.vt_iter_creator_); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); ObThreadLogLevelUtils::init(session.get_log_id_level_map()); ret = do_process(session); ObThreadLogLevelUtils::clear(); @@ -237,22 +236,28 @@ int ObMPStmtSendLongData::process_send_long_data_stmt(ObSQLSessionInfo &session) int ObMPStmtSendLongData::do_process(ObSQLSessionInfo &session) { int ret = OB_SUCCESS; + ObExecutingSqlStatRecord sqlstat_record; ObAuditRecordData &audit_record = session.get_raw_audit_record(); audit_record.try_cnt_++; const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); bool is_diagnostics_stmt = false; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { ObMaxWaitGuard max_wait_guard(enable_perf_event - ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); + } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } int64_t execution_id = 0; ObString sql = "send long data"; @@ -278,7 +283,7 @@ int ObMPStmtSendLongData::do_process(ObSQLSessionInfo &session) audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); + audit_record.exec_record_.record_end(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); @@ -286,6 +291,10 @@ int ObMPStmtSendLongData::do_process(ObSQLSessionInfo &session) EVENT_INC(SQL_PS_PREPARE_COUNT); EVENT_ADD(SQL_PS_PREPARE_TIME, time_cost); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + + } } } // diagnose end diff --git a/src/observer/mysql/obmp_stmt_send_piece_data.cpp b/src/observer/mysql/obmp_stmt_send_piece_data.cpp index 59cc87feaf..ca433d22ec 100644 --- a/src/observer/mysql/obmp_stmt_send_piece_data.cpp +++ b/src/observer/mysql/obmp_stmt_send_piece_data.cpp @@ -213,7 +213,6 @@ int ObMPStmtSendPieceData::process_send_long_data_stmt(ObSQLSessionInfo &session setup_wb(session); ObVirtualTableIteratorFactory vt_iter_factory(*gctx_.vt_iter_creator_); - ObSessionStatEstGuard stat_est_guard(get_conn()->tenant_->id(), session.get_sessid()); ObThreadLogLevelUtils::init(session.get_log_id_level_map()); ret = do_process(session); ObThreadLogLevelUtils::clear(); @@ -229,22 +228,28 @@ int ObMPStmtSendPieceData::process_send_long_data_stmt(ObSQLSessionInfo &session int ObMPStmtSendPieceData::do_process(ObSQLSessionInfo &session) { int ret = OB_SUCCESS; + ObExecutingSqlStatRecord sqlstat_record; ObAuditRecordData &audit_record = session.get_raw_audit_record(); audit_record.try_cnt_++; const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session.is_sqlstat_enabled(); single_process_timestamp_ = ObTimeUtility::current_time(); bool is_diagnostics_stmt = false; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { ObMaxWaitGuard max_wait_guard(enable_perf_event - ? &audit_record.exec_record_.max_wait_event_ : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ? &audit_record.exec_record_.max_wait_event_ : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - audit_record.exec_record_.record_start(di); + audit_record.exec_record_.record_start(); + } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session.get_is_in_retry()); + session.sql_sess_record_sql_stat_start_value(sqlstat_record); } int64_t execution_id = 0; ObString sql = "send long data"; @@ -269,7 +274,7 @@ int ObMPStmtSendPieceData::do_process(ObSQLSessionInfo &session) audit_record.exec_timestamp_.update_stage_time(); if (enable_perf_event) { - audit_record.exec_record_.record_end(di); + audit_record.exec_record_.record_end(); audit_record.exec_record_.wait_time_end_ = total_wait_desc.time_waited_; audit_record.exec_record_.wait_count_end_ = total_wait_desc.total_waits_; audit_record.update_event_stage_state(); @@ -277,6 +282,10 @@ int ObMPStmtSendPieceData::do_process(ObSQLSessionInfo &session) EVENT_INC(SQL_PS_PREPARE_COUNT); EVENT_ADD(SQL_PS_PREPARE_TIME, time_cost); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + + } } } // diagnose end diff --git a/src/observer/mysql/obsm_conn_callback.cpp b/src/observer/mysql/obsm_conn_callback.cpp index 5821aceafd..0abb5bab16 100644 --- a/src/observer/mysql/obsm_conn_callback.cpp +++ b/src/observer/mysql/obsm_conn_callback.cpp @@ -22,6 +22,7 @@ #include "sql/session/ob_sql_session_mgr.h" #include "observer/omt/ob_tenant.h" #include "observer/ob_srv_task.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { @@ -224,6 +225,11 @@ void ObSMConnectionCallback::destroy(ObSMConnection& conn) } } } + if (OB_NOT_NULL(conn.di_)) { + common::ObLocalDiagnosticInfo::dec_ref(conn.di_); + common::ObLocalDiagnosticInfo::return_diagnostic_info(conn.di_); + conn.di_ = nullptr; + } sm_conn_unlock_tenant(conn); share::ObTaskController::get().allow_next_syslog(); diff --git a/src/observer/mysql/obsm_handler.cpp b/src/observer/mysql/obsm_handler.cpp index 43e044e933..bc3da89683 100644 --- a/src/observer/mysql/obsm_handler.cpp +++ b/src/observer/mysql/obsm_handler.cpp @@ -251,6 +251,11 @@ int ObSMHandler::on_close(easy_connection_t *c) } else {/*do nothing*/} } + if (OB_NOT_NULL(conn) && OB_NOT_NULL(conn->di_)) { + common::ObLocalDiagnosticInfo::dec_ref(conn->di_); + common::ObLocalDiagnosticInfo::return_diagnostic_info(conn->di_); + conn->di_ = nullptr; + } //unlock tenant if (OB_LIKELY(NULL != conn->tenant_ && conn->is_tenant_locked_)) { conn->tenant_->unlock(*conn->handle_); diff --git a/src/observer/net/ob_net_queue_traver.cpp b/src/observer/net/ob_net_queue_traver.cpp new file mode 100644 index 0000000000..2d1bde6665 --- /dev/null +++ b/src/observer/net/ob_net_queue_traver.cpp @@ -0,0 +1,236 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ +#include "ob_net_queue_traver.h" +#define USING_LOG_PREFIX RS +namespace oceanbase +{ +namespace rpc +{ +int ObNetQueueTraver::traverse(ObINetTraverProcess &process) +{ + int ret = OB_SUCCESS; + oceanbase::omt::TenantIdList tenant_list; + GCTX.omt_->get_tenant_ids(tenant_list); + oceanbase::omt::ObTenant *tenant_ptr = nullptr; + common::ObLDHandle handle; + for (int i = 0; OB_SUCC(ret) && i < tenant_list.size(); i++) { + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(GCTX.omt_->get_tenant_with_tenant_lock(tenant_list[i], handle, tenant_ptr))) { + LOG_WARN("get tenant failed", K(tmp_ret), K(ret), K(tenant_list[i])); + } else if (OB_TMP_FAIL(traverse_one_tenant(tenant_ptr, process))) { + LOG_WARN("traverse one tenant failed", K(tmp_ret), K(ret), K(tenant_list[i])); + } + + if (OB_NOT_NULL(tenant_ptr)) { + tenant_ptr->unlock(handle); + tenant_ptr = nullptr; + } + } + return ret; +} +int ObNetQueueTraver::traverse_one_tenant(oceanbase::omt::ObTenant *tenant_ptr, ObINetTraverProcess &process) +{ + int ret = OB_SUCCESS; + // traverse all tenant queue, types are as follow: + // 1、tenant req queue, multi_level_queue + // 2、group req queue, multi_level_queue + oceanbase::omt::ObResourceGroupNode *iter = nullptr; + oceanbase::omt::ObResourceGroup *group = nullptr; + int32_t group_id = 0; // default group id for mysql request without resource_mgr is 0. + if (OB_ISNULL(tenant_ptr)) { + ret = OB_INVALID_ARGUMENT; + LOG_ERROR("tenant_ptr is nullptr", K(ret)); + } else if (OB_FAIL(traverse_one_tenant_queue(tenant_ptr->get_req_queue(), tenant_ptr->get_multi_level_queue(), group_id, process))) { // 1、tenant req queue + LOG_ERROR("traverse tenant's req queue failed", K(ret)); + } else { + oceanbase::omt::GroupMap& group_map = tenant_ptr->get_group_map(); + // 2、group req queue + while (OB_NOT_NULL(iter = group_map.quick_next(iter))) { + group = static_cast(iter); + group_id = group->get_group_id(); + if (OB_FAIL(traverse_one_tenant_group_queue(group->get_req_queue(), group->get_multi_level_queue(), group_id, process))) { + LOG_ERROR("traverse tenant's group queue failed", K(ret)); + } + } // group_map + } + return ret; +} +int ObNetQueueTraver::traverse_one_tenant_queue(oceanbase::omt::ReqQueue &tenant_req_queue, oceanbase::omt::ObMultiLevelQueue *tenant_multi_level_queue, int32_t group_id, ObINetTraverProcess &process) +{ + int ret = OB_SUCCESS; + // normal queue + int64_t prio_cnt = tenant_req_queue.get_prio_cnt(); + for (int64_t i = 0; OB_SUCC(ret) && i < prio_cnt; i++) { + ObLinkQueue *link_queue = tenant_req_queue.get_queue(i); + if (OB_ISNULL(link_queue)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("link_queue is nullptr", K(ret)); + } else if (OB_FAIL(traverse_one_tenant_one_link_queue(link_queue, group_id, process))) { + LOG_ERROR("traverse one tenant one queue failed", K(ret)); + } + } + // multi level queue + if (OB_ISNULL(tenant_multi_level_queue)) { + ret = OB_INVALID_ARGUMENT; + LOG_ERROR("tenant_req_queue is nullptr", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < MULTI_LEVEL_QUEUE_SIZE; i++) { + common::ObPriorityQueue<1>* pq = tenant_multi_level_queue->get_pq_queue(i); + if (OB_ISNULL(pq)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("pq is nullptr", K(ret)); + } else { + int64_t multi_prio_cnt = pq->get_prio_cnt(); + for (int64_t j = 0; OB_SUCC(ret) && j < multi_prio_cnt; j++) { + ObLinkQueue *link_queue = pq->get_queue(j); + if (OB_ISNULL(link_queue)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("link_queue is nullptr", K(ret)); + } else if (OB_FAIL(traverse_one_tenant_one_link_queue(link_queue, group_id, process))) { + LOG_ERROR("traverse one tenant one queue failed", K(ret)); + } + } + } + } + } + return ret; +} +int ObNetQueueTraver::traverse_one_tenant_group_queue(TenantReqQueue &tenant_group_queue, oceanbase::omt::ObMultiLevelQueue *tenant_multi_level_queue, int32_t group_id, ObINetTraverProcess &process) +{ + int ret = OB_SUCCESS; + // normal queue + int64_t prio_cnt = tenant_group_queue.get_prio_cnt(); + for (int64_t i = 0; OB_SUCC(ret) && i < prio_cnt; i++) { + ObLinkQueue *link_queue = tenant_group_queue.get_queue(i); + if (OB_ISNULL(link_queue)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("link_queue is nullptr", K(ret)); + } else if (OB_FAIL(traverse_one_tenant_one_link_queue(link_queue, group_id, process))) { + LOG_ERROR("traverse one tenant one queue failed", K(ret)); + } + } + // multi level queue + if (OB_ISNULL(tenant_multi_level_queue)) { + ret = OB_INVALID_ARGUMENT; + LOG_ERROR("tenant_req_queue is nullptr", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < MULTI_LEVEL_QUEUE_SIZE; i++) { + common::ObPriorityQueue<1>* pq = tenant_multi_level_queue->get_pq_queue(i); + if (OB_ISNULL(pq)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("pq is nullptr", K(ret)); + } else { + int64_t multi_prio_cnt = pq->get_prio_cnt(); + for (int64_t j = 0; OB_SUCC(ret) && j < multi_prio_cnt; j++) { + ObLinkQueue *link_queue = pq->get_queue(j); + if (OB_ISNULL(link_queue)) { + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("link_queue is nullptr", K(ret)); + } else if (OB_FAIL(traverse_one_tenant_one_link_queue(link_queue, group_id, process))) { + LOG_ERROR("traverse one tenant one queue failed", K(ret)); + } + } + } + } + } + return ret; +} + +int ObNetQueueTraver::traverse_one_tenant_one_link_queue(ObLinkQueue *link_queue, int32_t group_id, ObINetTraverProcess &process) +{ + int ret = OB_SUCCESS; + const int64_t current_time = ObTimeUtility::current_time(); + ObLink *cur = nullptr; + ObRequest *req_cur = nullptr; + bool is_end = false; + if (OB_ISNULL(link_queue)) { + ret = OB_INVALID_ARGUMENT; + LOG_ERROR("link_queue is nullptr", K(ret)); + } else { + int64_t size = link_queue->size(); + for (int64_t i = 0; OB_SUCC(ret) && (i < size) && (!is_end); i++) { + if (OB_FAIL(link_queue->pop(cur))) { + ret = OB_SUCCESS; + is_end = true; + } else { + if (OB_ISNULL(cur)){ + ret = OB_NULL_CHECK_ERROR; + LOG_ERROR("cur is nullptr", K(ret)); + } else if (OB_ISNULL(req_cur = static_cast(cur))) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("req_cur is nullptr", K(ret)); + } else if (req_cur->get_traverse_index() >= current_time) { + is_end = true; + } else if (OB_FAIL(req_cur->set_traverse_index(current_time))) { + LOG_ERROR("req_cur set_traverse_index failed", K(ret)); + } else if (OB_FAIL(process.process_request(req_cur, group_id))) { + LOG_ERROR("process request failed", K(ret)); + } + // push req + if (OB_NOT_NULL(cur) && OB_FAIL(link_queue->push(cur))) { + LOG_ERROR("link_queue push req failed", K(ret)); + } + } + } // for end + } + return ret; +} + +int ObNetTraverProcessAutoDiag::process_request(ObRequest *req_cur, int32_t group_id) +{ + int ret = OB_SUCCESS; + ObNetQueueTraRes tmp_info; + if (OB_FAIL(get_trav_req_info(req_cur, tmp_info, group_id))) { + LOG_ERROR("get_trav_req_info failed", K(ret)); + } else { + net_recorder_(tmp_info); + } + return ret; +} +int ObNetTraverProcessAutoDiag::get_trav_req_info(ObRequest *cur, ObNetQueueTraRes &tmp_info, int32_t group_id) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(cur)) { + ret = OB_INVALID_ARGUMENT; + LOG_ERROR("cur is nullptr", K(ret)); + } else { + tmp_info.type_ = cur->get_type(); + tmp_info.enqueue_timestamp_ = cur->get_enqueue_timestamp(); + tmp_info.trace_id_ = cur->get_trace_id(); + tmp_info.retry_times_ = cur->get_retry_times(); + tmp_info.group_id_ = group_id; + if (ObRequest::OB_RPC == cur->get_type()) { + const obrpc::ObRpcPacket &pkt = static_cast(cur->get_packet()); + tmp_info.tenant_id_ = pkt.get_tenant_id(); + tmp_info.pcode_ = static_cast(pkt.get_pcode()); + tmp_info.req_level_ = min(pkt.get_request_level(), omt::MAX_REQUEST_LEVEL - 1); + tmp_info.priority_ = pkt.get_priority(); + } else if (ObRequest::OB_MYSQL == cur->get_type()) { + void *sess = SQL_REQ_OP.get_sql_session(cur); + oceanbase::observer::ObSMConnection *conn = nullptr; + const obmysql::ObMySQLRawPacket &pkt = + reinterpret_cast(cur->get_packet()); + if (OB_ISNULL(sess)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("sess is nullptr", K(ret)); + } else { + conn = static_cast(sess); + tmp_info.tenant_id_ = static_cast(conn->tenant_id_); + tmp_info.sql_session_id_ = static_cast(conn->sessid_); + tmp_info.mysql_cmd_ = pkt.get_cmd(); + } + } + } + return ret; +} +} // namespace rpc +} // namespace oceanbase \ No newline at end of file diff --git a/src/observer/net/ob_net_queue_traver.h b/src/observer/net/ob_net_queue_traver.h new file mode 100644 index 0000000000..60b5190ce0 --- /dev/null +++ b/src/observer/net/ob_net_queue_traver.h @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ +#ifndef OCEANBASE_RPC_OB_NET_QUEUE_TRAVER_H +#define OCEANBASE_RPC_OB_NET_QUEUE_TRAVER_H + +#include "deps/oblib/src/lib/queue/ob_link_queue.h" +#include "deps/oblib/src/lib/queue/ob_priority_queue.h" +#include "deps/oblib/src/rpc/frame/ob_req_queue_thread.h" +#include "deps/oblib/src/rpc/obmysql/ob_mysql_packet.h" +#include "deps/oblib/src/rpc/obmysql/obsm_struct.h" +#include "share/ob_define.h" +#include "src/observer/ob_server_struct.h" +#include "src/observer/omt/ob_multi_tenant.h" +#include "src/observer/omt/ob_tenant.h" +#include "src/observer/omt/ob_multi_level_queue.h" +namespace oceanbase +{ +namespace rpc +{ +class ObINetTraverProcess +{ +public: + ObINetTraverProcess(){}; + virtual ~ObINetTraverProcess(){}; + virtual int process_request(ObRequest *req_cur, int32_t group_id) = 0; + DISALLOW_COPY_AND_ASSIGN(ObINetTraverProcess); +}; +class ObNetTraverProcessAutoDiag : public ObINetTraverProcess +{ +public: + struct ObNetQueueTraRes; + explicit ObNetTraverProcessAutoDiag( + const std::function &net_recorder) + : ObINetTraverProcess(), net_recorder_(net_recorder) + {} + ~ObNetTraverProcessAutoDiag() = default; + int process_request(ObRequest *req_cur, int32_t group_id) override; + struct ObNetQueueTraRes + { + ObNetQueueTraRes() + : enqueue_timestamp_(0), + retry_times_(0), + tenant_id_(-1), + sql_session_id_(0), + pcode_(-1), + group_id_(-1), + mysql_cmd_(obmysql::COM_MAX_NUM), + req_level_(-1), + priority_(0) + {} + ObRequest::Type type_; + int64_t enqueue_timestamp_; + rpc::TraceId trace_id_; // not init + int32_t retry_times_; + int64_t tenant_id_; + uint32_t sql_session_id_; + int32_t pcode_; + int32_t group_id_; + obmysql::ObMySQLCmd mysql_cmd_; + int32_t req_level_; + uint8_t priority_; + TO_STRING_KV( + K(type_), K(enqueue_timestamp_), K_(trace_id), K(retry_times_), K(tenant_id_), K(sql_session_id_), K(pcode_), K(group_id_), K(mysql_cmd_), K(req_level_), K(priority_)); + }; + static int get_trav_req_info(ObRequest *cur, ObNetQueueTraRes &tmp_info, int32_t group_id); + std::function net_recorder_; + DISALLOW_COPY_AND_ASSIGN(ObNetTraverProcessAutoDiag); +}; +class ObNetQueueTraver +{ +public: + ObNetQueueTraver(){}; + ~ObNetQueueTraver() = default; + int traverse(ObINetTraverProcess &process); + int traverse_one_tenant(oceanbase::omt::ObTenant *tenant_ptr, ObINetTraverProcess &process); +private: + typedef oceanbase::common::ObPriorityQueue2<0, 1> TenantReqQueue; + int traverse_one_tenant_queue(oceanbase::omt::ReqQueue &tenant_req_queue, oceanbase::omt::ObMultiLevelQueue *tenant_multi_level_queue, int32_t group_id, ObINetTraverProcess &process); + int traverse_one_tenant_group_queue(TenantReqQueue &tenant_group_queue,oceanbase::omt::ObMultiLevelQueue *tenant_multi_level_queue, int32_t group_id, ObINetTraverProcess &process); + int traverse_one_tenant_one_link_queue(ObLinkQueue *link_queue, int32_t group_id, ObINetTraverProcess &process); + DISALLOW_COPY_AND_ASSIGN(ObNetQueueTraver); +}; + +} // namespace rpc +} // namespace oceanbase + +#endif diff --git a/src/observer/ob_inner_sql_connection.cpp b/src/observer/ob_inner_sql_connection.cpp index 54aefd8823..3d9d4b8d03 100644 --- a/src/observer/ob_inner_sql_connection.cpp +++ b/src/observer/ob_inner_sql_connection.cpp @@ -51,6 +51,8 @@ #endif #include "sql/plan_cache/ob_ps_cache.h" #include "observer/mysql/obmp_stmt_execute.h" +#include "lib/stat/ob_diagnose_info.h" +#include "lib/stat/ob_diagnostic_info_container.h" namespace oceanbase { @@ -136,7 +138,7 @@ ObInnerSQLConnection::TimeoutGuard::~TimeoutGuard() } ObInnerSQLConnection::ObInnerSQLConnection() - : inited_(false), inner_session_(), extern_session_(NULL), + : inited_(false), extern_session_(NULL), inner_session_(NULL), is_spi_conn_(false), ref_cnt_(0), pool_(NULL), schema_service_(NULL), ob_sql_(NULL), vt_iter_creator_(NULL), ref_ctx_(NULL), @@ -159,8 +161,11 @@ ObInnerSQLConnection::ObInnerSQLConnection() force_no_reuse_(false), use_external_session_(false), group_id_(0), - user_timeout_(0) + user_timeout_(0), + diagnostic_info_(nullptr) + { + free_session_ctx_.sessid_ = ObSQLSessionInfo::INVALID_SESSID; } ObInnerSQLConnection::~ObInnerSQLConnection() @@ -168,17 +173,22 @@ ObInnerSQLConnection::~ObInnerSQLConnection() if (0 < ref_cnt_) { LOG_ERROR_RET(OB_ERROR, "connection be referenced while destruct", K_(ref_cnt)); } - if (OB_NOT_NULL(inner_session_.get_tx_desc())) { + if (OB_NOT_NULL(inner_session_) && OB_NOT_NULL(inner_session_->get_tx_desc())) { int ret = OB_SUCCESS; MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); - if (OB_SUCC(guard.switch_to(inner_session_.get_tx_desc()->get_tenant_id(), false))) { - MTL(transaction::ObTransService*)->release_tx(*inner_session_.get_tx_desc()); + if (OB_SUCC(guard.switch_to(inner_session_->get_tx_desc()->get_tenant_id(), false))) { + MTL(transaction::ObTransService*)->release_tx(*inner_session_->get_tx_desc()); } { - ObSQLSessionInfo::LockGuard guard(inner_session_.get_thread_data_lock()); - inner_session_.get_tx_desc() = NULL; + ObSQLSessionInfo::LockGuard guard(inner_session_->get_thread_data_lock()); + inner_session_->get_tx_desc() = NULL; } } + if (OB_NOT_NULL(diagnostic_info_)) { + ObLocalDiagnosticInfo::revert_diagnostic_info(diagnostic_info_); + ObLocalDiagnosticInfo::return_diagnostic_info(diagnostic_info_); + diagnostic_info_ = nullptr; + } } int ObInnerSQLConnection::init(ObInnerSQLConnectionPool *pool, @@ -191,7 +201,8 @@ int ObInnerSQLConnection::init(ObInnerSQLConnectionPool *pool, ObRestoreSQLModifier *sql_modifier /* = NULL */, const bool use_static_engine /* = false */, const bool is_oracle_mode /* = false */, - const int32_t group_id /* = 0*/) + const int32_t group_id /* = 0*/, + const bool is_resource_conn /* =false*/) { int ret = OB_SUCCESS; if (inited_) { @@ -210,6 +221,7 @@ int ObInnerSQLConnection::init(ObInnerSQLConnectionPool *pool, sql_modifier_ = sql_modifier; init_timestamp_ = ObTimeUtility::current_time(); tid_ = GETTID(); + is_resource_conn_ = is_resource_conn; if (NULL == extern_session || 0 != EVENT_CALL(EventTable::EN_INNER_SQL_CONN_LEAK_CHECK)) { // Only backtrace internal used connection to avoid performance problems. bt_size_ = ob_backtrace(bt_addrs_, MAX_BT_SIZE); @@ -225,6 +237,10 @@ int ObInnerSQLConnection::init(ObInnerSQLConnectionPool *pool, } if (OB_FAIL(init_session(extern_session, use_static_engine))) { LOG_WARN("init session failed", K(ret)); + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = destroy_inner_session())) { + LOG_WARN("Failed to destroy inner session when the session initialization failed, which may result in a session leak.", K(tmp_ret), K(ret)); + } } else { group_id_ = group_id; inited_ = true; @@ -248,12 +264,19 @@ int ObInnerSQLConnection::destroy() ref_cnt_ = 0; pool_ = NULL; schema_service_ = NULL; - inner_session_.destroy(); + if (OB_SUCC(ret) && OB_FAIL(destroy_inner_session())) { + LOG_WARN("failed to destroy inner session when inner sql connection destroy", K(ret)); + } extern_session_ = NULL; config_ = NULL; associated_client_ = NULL; ref_ctx_ = NULL; user_timeout_ = 0; + if (OB_NOT_NULL(diagnostic_info_)) { + ObLocalDiagnosticInfo::revert_diagnostic_info(diagnostic_info_); + ObLocalDiagnosticInfo::return_diagnostic_info(diagnostic_info_); + diagnostic_info_ = nullptr; + } } return ret; } @@ -370,6 +393,8 @@ int ObInnerSQLConnection::init_session_info( } else { session->set_user_priv_set(OB_PRIV_ALL | OB_PRIV_GRANT); session->set_database_id(OB_SYS_DATABASE_ID); + session->set_shadow(true); // inner session will not be show + session->set_real_inner_session(true); } } if (OB_SUCC(ret)) { @@ -412,13 +437,36 @@ int ObInnerSQLConnection::init_session(sql::ObSQLSessionInfo* extern_session, co { int ret = OB_SUCCESS; if (NULL == extern_session) { - sql::ObSQLSessionInfo * inner_session = &inner_session_; - ObArenaAllocator *allocator = NULL; const bool is_extern_session = false; - if (OB_FAIL(inner_session->init(INNER_SQL_SESS_ID, INNER_SQL_PROXY_SESS_ID, allocator))) { - LOG_WARN("init session failed", K(ret)); - } else if (OB_FAIL(init_session_info(inner_session, is_extern_session, oracle_mode_, is_ddl))) { - LOG_WARN("fail to init session info", K(ret), KPC(inner_session)); + // The inner sql remote execution case does not create an inner session through the session mgr. + bool is_create_session_mgr = (!is_resource_conn()) && OB_NOT_NULL(GCTX.session_mgr_) && OB_NOT_NULL(GCTX.omt_); + if (OB_NOT_NULL(GCTX.omt_)) { + ObTenantSQLSessionMgr *t_session_mgr = nullptr; + t_session_mgr = MTL(ObTenantSQLSessionMgr*); + is_create_session_mgr = is_create_session_mgr && (nullptr != t_session_mgr); + } + if (is_create_session_mgr && is_inner_session_mgr_enable()) { + if (OB_FAIL(create_session_by_mgr())) { + LOG_WARN("failed to create inner session by GCTX.session_mgr, will create default session", K(ret)); + } + + if (OB_FAIL(ret)) { + if (OB_FAIL(create_default_session())) { + LOG_WARN("failed to create default session", K(ret)); + } else { + ret = OB_SUCCESS; + } + } + } else { + if (OB_FAIL(create_default_session())) { + LOG_WARN("failed to create default session", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(init_session_info(inner_session_, is_extern_session, oracle_mode_, is_ddl))) { + LOG_WARN("fail to init session info", K(ret), KPC(inner_session_)); + } } } else { extern_session_ = extern_session; @@ -526,6 +574,8 @@ int ObInnerSQLConnection::process_record(sql::ObResultSet &result_set, ObString *pl_exec_params) { int ret = OB_SUCCESS; + ObPhysicalPlan *plan = result_set.get_physical_plan(); + const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session.get_local_ob_enable_sql_audit(); ObAuditRecordData &audit_record = session.get_raw_audit_record(); @@ -545,7 +595,8 @@ int ObInnerSQLConnection::process_record(sql::ObResultSet &result_set, session.update_pure_sql_exec_time(audit_record.exec_timestamp_.elapsed_t_); if (enable_perf_event) { - record_stat(session, result_set.get_stmt_type(), is_from_pl); + record_stat(session, result_set.get_stmt_type(), last_ret, is_from_pl); + audit_record.stmt_type_ = result_set.get_stmt_type(); exec_record.max_wait_event_ = max_wait_desc; exec_record.wait_time_end_ = total_wait_desc.time_waited_; exec_record.wait_count_end_ = total_wait_desc.total_waits_; @@ -725,6 +776,7 @@ int ObInnerSQLConnection::query(sqlclient::ObIExecutor &executor, lib::CompatModeGuard g(get_compat_mode()); ObExecRecord exec_record; ObExecTimestamp exec_timestamp; + ObExecutingSqlStatRecord sqlstat_record; exec_timestamp.exec_type_ = sql::InnerSql; const ObGlobalContext &gctx = ObServer::get_instance().get_gctx(); @@ -781,7 +833,7 @@ int ObInnerSQLConnection::query(sqlclient::ObIExecutor &executor, if (retry_cnt > 0) { // reset result set bool is_user_sql = res.result_set().is_user_sql(); res.~ObInnerSQLResult(); - new (&res) ObInnerSQLResult(get_session()); + new (&res) ObInnerSQLResult(get_session(), is_inner_session()); if (OB_FAIL(res.init())) { LOG_WARN("fail to init result set", K(ret)); } else { @@ -801,6 +853,7 @@ int ObInnerSQLConnection::query(sqlclient::ObIExecutor &executor, const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && get_session().get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = get_session().is_sqlstat_enabled(); { ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : NULL); ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL); @@ -809,6 +862,14 @@ int ObInnerSQLConnection::query(sqlclient::ObIExecutor &executor, exec_record.record_start(); } + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(retry_cnt > 0); + if (is_inner_session()) { + get_session().sql_sess_record_sql_stat_start_value(sqlstat_record); + } + } + const uint64_t tenant_id = get_session().get_effective_tenant_id(); if (OB_FAIL(ret)){ @@ -881,6 +942,17 @@ int ObInnerSQLConnection::query(sqlclient::ObIExecutor &executor, if (OB_SUCCESS != record_ret) { LOG_WARN("failed to process record", K(executor), K(record_ret), K(ret)); } + + if (enable_sqlstat) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_rows_processed(res.result_set().get_affected_rows() + res.result_set().get_return_rows()); + sqlstat_record.set_partition_cnt(res.result_set().get_exec_context().get_das_ctx().get_related_tablet_cnt()); + sqlstat_record.set_is_route_miss(get_session().partition_hit().get_bool()? 0 : 1); + sqlstat_record.set_is_plan_cache_hit(res.sql_ctx().plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(get_session(), + res.sql_ctx().cur_sql_, + res.result_set().get_physical_plan()); + } } if (res.is_inited()) { @@ -944,6 +1016,7 @@ int ObInnerSQLConnection::retry_while_no_tenant_resource(const int64_t cluster_i if (OB_FAIL(set_timeout(abs_timeout_us))) { LOG_WARN("set timeout failed", K(ret)); } else { + ObInnerSqlWaitGuard guard(is_inner_session(), diagnostic_info_); do { int64_t now = ObTimeUtility::current_time(); if (now >= abs_timeout_us) { @@ -1001,7 +1074,7 @@ int ObInnerSQLConnection::start_transaction_inner( sql = ObString::make_string("START TRANSACTION"); } ObSqlQueryExecutor executor(sql); - SMART_VAR(ObInnerSQLResult, res, get_session()) { + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("connection not inited", K(ret)); @@ -1104,7 +1177,7 @@ int ObInnerSQLConnection::register_multi_data_source(const uint64_t &tenant_id, const bool local_execute = is_local_execute(GCONF.cluster_id, tenant_id); transaction::ObTxDesc *tx_desc = nullptr; - SMART_VAR(ObInnerSQLResult, res, get_session()) + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (!inited_) { ret = OB_NOT_INIT; @@ -1218,7 +1291,7 @@ int ObInnerSQLConnection::forward_request_(const uint64_t tenant_id, const int32_t group_id) { int ret = OB_SUCCESS; - + ObInnerSqlWaitGuard guard(is_inner_session(), diagnostic_info_); TimeoutGuard timeout_guard(*this); // backup && restore worker/session timeout common::ObAddr resource_server_addr; // MYADDR share::ObLSID ls_id(share::ObLSID::SYS_LS_ID); @@ -1282,13 +1355,14 @@ int ObInnerSQLConnection::rollback() { int ret = OB_SUCCESS; FLTSpanGuard(inner_rollback); + ObInnerSqlWaitGuard guard(is_inner_session(), diagnostic_info_); ObSqlQueryExecutor executor("ROLLBACK"); bool has_tenant_resource = is_resource_conn() || OB_INVALID_ID == get_resource_conn_id(); if (!is_in_trans()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("inner conn is not in trans", K(ret)); } else { - SMART_VAR(ObInnerSQLResult, res, get_session()) { + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("connection not inited", K(ret)); @@ -1354,6 +1428,7 @@ int ObInnerSQLConnection::commit() { int ret = OB_SUCCESS; FLTSpanGuard(inner_commit); + ObInnerSqlWaitGuard guard(is_inner_session(), diagnostic_info_); DEBUG_SYNC(BEFORE_INNER_SQL_COMMIT); ObSqlQueryExecutor executor("COMMIT"); bool has_tenant_resource = is_resource_conn() || OB_INVALID_ID == get_resource_conn_id(); @@ -1361,7 +1436,7 @@ int ObInnerSQLConnection::commit() ret = OB_ERR_UNEXPECTED; LOG_WARN("inner conn is not in trans", K(ret)); } else { - SMART_VAR(ObInnerSQLResult, res, get_session()) { + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("connection not inited", K(ret)); @@ -1454,7 +1529,7 @@ int ObInnerSQLConnection::execute_write_inner(const uint64_t tenant_id, const Ob FLTSpanGuard(inner_execute_write); ObSqlQueryExecutor executor(sql); const bool local_execute = is_local_execute(GCONF.cluster_id, tenant_id); - SMART_VAR(ObInnerSQLResult, res, get_session()) { + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("connection not inited", K(ret)); @@ -1842,7 +1917,7 @@ int ObInnerSQLConnection::execute( int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; FLTSpanGuard(inner_execute); - SMART_VAR(ObInnerSQLResult, res, get_session()) { + SMART_VAR(ObInnerSQLResult, res, get_session(), is_inner_session()) { if (OB_FAIL(res.init())) { LOG_WARN("init result set", K(ret)); } else if (!inited_) { @@ -1999,14 +2074,22 @@ void ObInnerSQLConnection::dump_conn_bt_info() void ObInnerSQLConnection::record_stat(sql::ObSQLSessionInfo& session, const stmt::StmtType type, + const int64_t ret, bool is_from_pl) { #define ADD_STMT_STAT(type) \ if (is_from_pl) { \ - EVENT_INC(SQL_##type##_COUNT); \ + if (!session.get_is_in_retry()) { \ + EVENT_INC(SQL_##type##_COUNT); \ + if (OB_SUCCESS != ret) { \ + EVENT_INC(SQL_FAIL_COUNT); \ + } \ + } \ EVENT_ADD(SQL_##type##_TIME, time_cost); \ } else { \ - EVENT_INC(SQL_INNER_##type##_COUNT); \ + if (!session.get_is_in_retry()) { \ + EVENT_INC(SQL_INNER_##type##_COUNT); \ + } \ EVENT_ADD(SQL_INNER_##type##_TIME, time_cost); \ } @@ -2140,5 +2223,180 @@ int ObInnerSQLConnection::end_nested_session(ObSQLSessionInfo::StmtSavedValue &s } return ret; } + +int ObInnerSQLConnection::create_session_by_mgr() +{ + int ret = OB_SUCCESS; + uint32_t sid = sql::ObSQLSessionInfo::INVALID_SESSID; + uint64_t proxy_sid = 0; + uint64_t tenant_id = MTL_ID(); + if (OB_ISNULL(GCTX.session_mgr_) || OB_ISNULL(GCTX.omt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session_mgr_ or omt_ is NULL", K(ret)); + } else if (OB_FAIL(GCTX.session_mgr_->create_sessid(sid))) { + LOG_WARN("alloc session id failed", K(ret)); + } else if (OB_FAIL(GCTX.session_mgr_->create_session(tenant_id, sid, proxy_sid, + ObTimeUtility::current_time(), + inner_session_))) { + GCTX.session_mgr_->mark_sessid_unused(sid); + inner_session_ = NULL; + LOG_WARN("create session failed", K(ret), K(sid)); + } else { + free_session_ctx_.sessid_ = sid; + free_session_ctx_.proxy_sessid_ = proxy_sid; + free_session_ctx_.tenant_id_ = tenant_id; + EVENT_INC(ACTIVE_SESSIONS); + free_session_ctx_.has_inc_active_num_ = true; + ObDiagnosticInfo *di = nullptr; + if (oceanbase::lib::is_diagnose_info_enabled()) { + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(MTL(common::ObDiagnosticInfoContainer *) + ->acquire_diagnostic_info(tenant_id, THIS_WORKER.get_group_id(), sid, di))) { + OB_ASSERT(di == nullptr); + LOG_WARN("failed to acquire diagnostic info", K(tmp_ret), K(tenant_id), + K(THIS_WORKER.get_group_id()), K(sid)); + } else { + OB_ASSERT(di != nullptr); + inner_session_->set_ash_stat_value(di->get_ash_stat()); + di->get_ash_stat().tenant_id_ = tenant_id; + di->get_ash_stat().session_type_ = ObActiveSessionStatItem::SessionType::BACKGROUND; + ObDiagnosticInfo *cur_di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(cur_di)) { + MEMCPY(di->get_ash_stat().program_, cur_di->get_ash_stat().program_, ASH_PROGRAM_STR_LEN); + } + STRNCPY(di->get_ash_stat().module_, "LOCAL INNER SQL EXEC", ASH_MODULE_STR_LEN); + STRNCPY(di->get_ash_stat().action_, inner_sql_action_name(di->get_ash_stat().inner_sql_wait_type_id_), ASH_ACTION_STR_LEN); + diagnostic_info_ = di; + } + } + } + return ret; +} + +int ObInnerSQLConnection::create_default_session() +{ + int ret = OB_SUCCESS; + ObArenaAllocator *allocator = NULL; + void *buf = ob_malloc(sizeof(ObSQLSessionInfo), ObModIds::OB_SQL_SESSION_SBLOCK); + if (OB_ISNULL(buf)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("default session buf allocated failed", K(ret)); + } else if (FALSE_IT(inner_session_ = new(buf) ObSQLSessionInfo())) { + } else if (FALSE_IT(free_session_ctx_.sessid_ = INNER_SQL_SESS_ID)) { + } else if (FALSE_IT(free_session_ctx_.proxy_sessid_ = INNER_SQL_PROXY_SESS_ID)) { + } else if (OB_FAIL(inner_session_->init(INNER_SQL_SESS_ID, INNER_SQL_PROXY_SESS_ID, allocator))) { + LOG_WARN("init session failed", K(ret)); + } + return ret; +} + +bool ObInnerSQLConnection::is_inner_session_mgr_enable() +{ + bool bret = false; + int64_t tenant_id = MTL_ID(); + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + bret = tenant_config->_enable_inner_session_mgr; + } + return bret; +} + +int ObInnerSQLConnection::destroy_inner_session() +{ + int ret = OB_SUCCESS; + LOG_DEBUG("begin destroying inner session", K(ret), KP(inner_session_), K(free_session_ctx_), K(lbt())); + if (NULL != inner_session_) { + if (INNER_SQL_SESS_ID == free_session_ctx_.sessid_) { + inner_session_->~ObSQLSessionInfo(); + ob_free(inner_session_); + } else { + bool is_create_session_mgr = (!is_resource_conn()) && OB_NOT_NULL(GCTX.session_mgr_) && OB_NOT_NULL(GCTX.omt_); + if (OB_NOT_NULL(GCTX.omt_)) { + ObTenantSQLSessionMgr *t_session_mgr = nullptr; + t_session_mgr = MTL(ObTenantSQLSessionMgr*); + is_create_session_mgr = is_create_session_mgr && (nullptr != t_session_mgr); + } + + if(is_create_session_mgr) { + inner_session_->set_session_sleep(); + if (OB_ISNULL(GCTX.session_mgr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("session mgr is null", K(ret)); + } else { + GCTX.session_mgr_->revert_session(inner_session_); + GCTX.session_mgr_->free_session(free_session_ctx_); + GCTX.session_mgr_->mark_sessid_unused(free_session_ctx_.sessid_); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("failed to free session by session mgr", K(ret), K(is_create_session_mgr)); + } + } + inner_session_ = NULL; + } + free_session_ctx_.sessid_ = ObSQLSessionInfo::INVALID_SESSID; + free_session_ctx_.tenant_id_ = common::OB_INVALID_ID; + free_session_ctx_.proxy_sessid_ = ObSQLSessionInfo::INVALID_SESSID; + EVENT_DEC(ACTIVE_SESSIONS); + LOG_DEBUG("end destroying inner session", K(ret), K(inner_session_), K(free_session_ctx_)); + return ret; +} + +ObInnerSqlWaitGuard::ObInnerSqlWaitGuard(const bool is_inner_session, common::ObDiagnosticInfo *di) + : is_inner_session_(is_inner_session), + inner_session_id_(common::OB_INVALID_ID), + inner_sql_di_(nullptr), + prev_di_(nullptr), + need_record_(true), + has_finish_switch_di_(false), + prev_block_sessid_(0) +{ + if (is_inner_session_ && OB_NOT_NULL(di) && /*when remote sql or bootstraping, do not record */ + OB_NOT_NULL(GCTX.omt_) && 0 != di->get_session_id()) { + inner_session_id_ = di->get_session_id(); + // 1. start inner sql wait event wait event + prev_di_ = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(prev_di_)) { + WAIT_BEGIN(ObWaitEventIds::INNER_SQL_EXEC_WAIT, 0 /*timeout_ms*/, + prev_di_->get_ash_stat().inner_sql_wait_type_id_ /*p1*/, inner_session_id_ /*p2*/, + 0 /*p3*/, false /* is_atomic*/); + prev_block_sessid_ = prev_di_->get_ash_stat().block_sessid_; + prev_di_->get_ash_stat().block_sessid_ = inner_session_id_; + } + + // 2. switch the ptr of the thread-local ASH stat to the inner session ASH stat. + if (OB_NOT_NULL(di)) { + inner_sql_di_ = di; + has_finish_switch_di_ = true; + di->get_ash_stat().set_sess_active(); + ObLocalDiagnosticInfo::setup_diagnostic_info(di); + } + } +} + +ObInnerSqlWaitGuard::~ObInnerSqlWaitGuard() +{ + if (is_inner_session_ && OB_NOT_NULL(inner_sql_di_) && /*when remote sql or bootstraping, do not record */ + OB_NOT_NULL(GCTX.omt_) && 0 != inner_sql_di_->get_session_id()) { + if (has_finish_switch_di_) { + OB_ASSERT(inner_sql_di_ == ObLocalDiagnosticInfo::get()); + inner_sql_di_->get_ash_stat().set_sess_inactive(); + + // 2. switch the ptr of di session buffer to prev session buffer + if (OB_NOT_NULL(prev_di_)) { + ObLocalDiagnosticInfo::setup_diagnostic_info(prev_di_); + } else { + ObLocalDiagnosticInfo::reset_diagnostic_info(); + LOG_WARN_RET(OB_ERR_UNEXPECTED, "prev di ptr is nullptr", K(prev_di_)); + } + } + + // 4. wait event end + if (OB_NOT_NULL(prev_di_)) { + prev_di_->get_ash_stat().block_sessid_ = prev_block_sessid_; + } + WAIT_END(ObWaitEventIds::INNER_SQL_EXEC_WAIT); + } +} } // end of namespace observer } // end of namespace oceanbase diff --git a/src/observer/ob_inner_sql_connection.h b/src/observer/ob_inner_sql_connection.h index ad6306c504..89786e5f7a 100644 --- a/src/observer/ob_inner_sql_connection.h +++ b/src/observer/ob_inner_sql_connection.h @@ -25,6 +25,7 @@ #include "lib/mysqlclient/ob_isql_client.h" #include "share/location_cache/ob_location_service.h" #include "storage/tablelock/ob_table_lock_common.h" //ObTableLockMode +#include "sql/session/ob_sql_session_mgr.h" namespace oceanbase { @@ -147,7 +148,8 @@ public: ObRestoreSQLModifier *sql_modifer = NULL, const bool use_static_engine = false, const bool is_oracle_mode = false, - const int32_t group_id = 0); + const int32_t group_id = 0, + const bool is_resource_conn = false); int destroy(void); inline void reset() { destroy(); } virtual int execute_read(const uint64_t tenant_id, const ObString &sql, @@ -172,8 +174,8 @@ public: virtual sqlclient::ObCommonServerConnectionPool *get_common_server_pool() override; virtual int rollback() override; virtual int commit() override; - sql::ObSQLSessionInfo &get_session() { return NULL == extern_session_ ? inner_session_ : *extern_session_; } - const sql::ObSQLSessionInfo &get_session() const { return NULL == extern_session_ ? inner_session_ : *extern_session_; } + sql::ObSQLSessionInfo &get_session() { return NULL == extern_session_ ? *inner_session_ : *extern_session_; } + const sql::ObSQLSessionInfo &get_session() const { return NULL == extern_session_ ? *inner_session_ : *extern_session_; } const sql::ObSQLSessionInfo *get_extern_session() const { return extern_session_; } // session environment virtual int get_session_variable(const ObString &name, int64_t &val) override; @@ -229,7 +231,6 @@ public: bool is_in_trans() const { return is_in_trans_; } void set_is_in_trans(const bool is_in_trans) { is_in_trans_ = is_in_trans; } bool is_resource_conn() const { return is_resource_conn_; } - void set_is_resource_conn(const bool is_resource_conn) { is_resource_conn_ = is_resource_conn; } void set_resource_conn_id(uint64_t resource_conn_id) { resource_conn_id_ = resource_conn_id; } uint64_t get_resource_conn_id() const { return resource_conn_id_; } const common::ObAddr &get_resource_svr() const { return resource_svr_; } @@ -304,6 +305,7 @@ public: bool is_from_pl = false); static void record_stat(sql::ObSQLSessionInfo &session, const sql::stmt::StmtType type, + const int64_t ret, bool is_from_pl = false); static int init_session_info(sql::ObSQLSessionInfo *session, @@ -374,11 +376,15 @@ private: ObInnerSQLResult &res, const int32_t group_id = 0); int get_session_timeout_for_rpc(int64_t &query_timeout, int64_t &trx_timeout); + int create_session_by_mgr(); + int create_default_session(); + bool is_inner_session_mgr_enable(); + int destroy_inner_session(); private: bool inited_; observer::ObQueryRetryCtrl retry_ctrl_; - sql::ObSQLSessionInfo inner_session_; sql::ObSQLSessionInfo *extern_session_; // nested sql and spi both use it, rename to extern. + sql::ObSQLSessionInfo *inner_session_; bool is_spi_conn_; int64_t ref_cnt_; ObInnerSQLConnectionPool *pool_; @@ -426,9 +432,25 @@ private: int32_t group_id_; //support set user timeout of stream rpc but not depend on internal_sql_execute_timeout int64_t user_timeout_; + sql::ObFreeSessionCtx free_session_ctx_; + ObDiagnosticInfo *diagnostic_info_; DISABLE_COPY_ASSIGN(ObInnerSQLConnection); }; +class ObInnerSqlWaitGuard +{ +public: + explicit ObInnerSqlWaitGuard(const bool is_inner_session, common::ObDiagnosticInfo *di); + ~ObInnerSqlWaitGuard(); +private: + bool is_inner_session_; + int64_t inner_session_id_; + ObDiagnosticInfo *inner_sql_di_; + ObDiagnosticInfo *prev_di_; + bool need_record_; + bool has_finish_switch_di_; + int64_t prev_block_sessid_; +}; } // end of namespace observer } // end of namespace oceanbase diff --git a/src/observer/ob_inner_sql_connection_pool.cpp b/src/observer/ob_inner_sql_connection_pool.cpp index 1dce1ffe4f..ef842ddbb2 100644 --- a/src/observer/ob_inner_sql_connection_pool.cpp +++ b/src/observer/ob_inner_sql_connection_pool.cpp @@ -34,7 +34,8 @@ ObInnerSQLConnectionPool::ObInnerSQLConnectionPool() schema_service_(NULL), ob_sql_(NULL), vt_iter_creator_(NULL), - config_(NULL) + config_(NULL), + is_resource_conn_pool_(false) { } @@ -66,7 +67,8 @@ int ObInnerSQLConnectionPool::init(ObMultiVersionSchemaService *schema_service, ObSql *ob_sql, ObVTIterCreator *vt_iter_creator, common::ObServerConfig *config, - const bool is_ddl) + const bool is_ddl, + const bool is_resource_conn_pool/* =false */) { int ret = OB_SUCCESS; if (inited_) { @@ -86,6 +88,7 @@ int ObInnerSQLConnectionPool::init(ObMultiVersionSchemaService *schema_service, vt_iter_creator_ = vt_iter_creator; config_ = config; is_ddl_ = is_ddl; + is_resource_conn_pool_ = is_resource_conn_pool; inited_ = true; } return ret; @@ -103,7 +106,7 @@ int ObInnerSQLConnectionPool::acquire(const uint64_t tenant_id, common::sqlclien LOG_WARN("alloc connection from pool failed", K(ret)); } else if (OB_FAIL(inner_sql_conn->init(this, schema_service_, ob_sql_, vt_iter_creator_, config_, nullptr /* session_info */, client_addr, nullptr/*sql modifer*/, is_ddl_, - false /*is_oracle_mode*/, group_id))) { + false /*is_oracle_mode*/, group_id, is_resource_conn_pool_))) { LOG_WARN("init connection failed", K(ret)); } else if (OB_FAIL(add_to_used_conn_list(inner_sql_conn))) { LOG_WARN("add_to_used_conn_list failed", K(ret)); @@ -177,7 +180,7 @@ int ObInnerSQLConnectionPool::acquire( } else if (OB_FAIL(alloc_conn(inner_sql_conn))) { LOG_WARN("alloc connection from pool failed", K(ret)); } else if (OB_FAIL(inner_sql_conn->init(this, schema_service_, ob_sql_, vt_iter_creator_, config_, - session_info, NULL, NULL, false, is_oracle_mode))) { + session_info, NULL, NULL, false, is_oracle_mode, 0/*group_id*/ , is_resource_conn_pool_))) { LOG_WARN("init connection failed", K(ret)); } else if (OB_FAIL(add_to_used_conn_list(inner_sql_conn))) { LOG_WARN("add_to_used_conn_list failed", K(ret)); diff --git a/src/observer/ob_inner_sql_connection_pool.h b/src/observer/ob_inner_sql_connection_pool.h index 0b75597101..1f63be2309 100644 --- a/src/observer/ob_inner_sql_connection_pool.h +++ b/src/observer/ob_inner_sql_connection_pool.h @@ -63,7 +63,8 @@ public: sql::ObSql *ob_sql, ObVTIterCreator *vt_iter_creator_, common::ObServerConfig *config = NULL, - const bool is_ddl = false); + const bool is_ddl = false, + const bool is_resource_conn_pool = false); virtual void stop() { stop_ = true; } // wait all connection been released @@ -133,6 +134,7 @@ private: ObVTIterCreator *vt_iter_creator_; common::ObServerConfig *config_; bool is_ddl_; + bool is_resource_conn_pool_; DISALLOW_COPY_AND_ASSIGN(ObInnerSQLConnectionPool); }; diff --git a/src/observer/ob_inner_sql_read_context.cpp b/src/observer/ob_inner_sql_read_context.cpp index 07e025ee12..661ae0e300 100644 --- a/src/observer/ob_inner_sql_read_context.cpp +++ b/src/observer/ob_inner_sql_read_context.cpp @@ -19,7 +19,7 @@ namespace observer { ObInnerSQLReadContext::ObInnerSQLReadContext(ObInnerSQLConnection &conn) - : conn_ref_(conn), vt_iter_factory_(*conn.get_vt_iter_creator()), result_(conn.get_session()) + : conn_ref_(conn), vt_iter_factory_(*conn.get_vt_iter_creator()), result_(conn.get_session(), conn.is_inner_session()) { } diff --git a/src/observer/ob_inner_sql_result.cpp b/src/observer/ob_inner_sql_result.cpp index a9d70e61b8..b25702e362 100644 --- a/src/observer/ob_inner_sql_result.cpp +++ b/src/observer/ob_inner_sql_result.cpp @@ -21,6 +21,7 @@ #include "share/rc/ob_tenant_base.h" #include "observer/ob_req_time_service.h" #include "omt/ob_tenant.h" +#include "observer/ob_inner_sql_connection.h" namespace oceanbase { @@ -45,7 +46,7 @@ inline int ObInnerSQLResult::check_extend_value(const common::ObObj &obj) return ret; } -ObInnerSQLResult::ObInnerSQLResult(ObSQLSessionInfo &session) +ObInnerSQLResult::ObInnerSQLResult(ObSQLSessionInfo &session, bool is_inner_session) : column_map_created_(false), column_indexed_(false), column_map_(), mem_context_(nullptr), mem_context_destroy_guard_(mem_context_), @@ -59,7 +60,8 @@ ObInnerSQLResult::ObInnerSQLResult(ObSQLSessionInfo &session) iter_end_(false), is_read_(true), has_tenant_resource_(true), - tenant_(nullptr) + tenant_(nullptr), + is_inner_session_(is_inner_session) { sql_ctx_.exec_type_ = InnerSql; diff --git a/src/observer/ob_inner_sql_result.h b/src/observer/ob_inner_sql_result.h index ad76413e54..fb3b5359e0 100644 --- a/src/observer/ob_inner_sql_result.h +++ b/src/observer/ob_inner_sql_result.h @@ -39,7 +39,7 @@ class ObInnerSQLResult : public common::sqlclient::ObMySQLResult { friend class ObInnerSQLConnection; public: - explicit ObInnerSQLResult(sql::ObSQLSessionInfo &session); + explicit ObInnerSQLResult(sql::ObSQLSessionInfo &session, bool is_inner_session); virtual ~ObInnerSQLResult(); int init(); int init(bool has_tenant_resource); @@ -144,6 +144,9 @@ public: void set_compat_mode(lib::Worker::CompatMode mode); bool is_inited() const { return is_inited_; } void set_is_read(const bool is_read) { is_read_ = is_read; } + bool is_inner_session() const { return is_inner_session_; } + void set_is_inner_session(bool is_inner_session) + { is_inner_session_ = is_inner_session; } private: virtual int inner_get_number(const int64_t col_idx, common::number::ObNumber &nmb_val, IAllocator &allocator) const; @@ -222,6 +225,7 @@ private: bool has_tenant_resource_; omt::ObTenant *tenant_; ObLDHandle handle_; + bool is_inner_session_; DISALLOW_COPY_AND_ASSIGN(ObInnerSQLResult); }; diff --git a/src/observer/ob_inner_sql_rpc_processor.cpp b/src/observer/ob_inner_sql_rpc_processor.cpp index 1cb8775da7..b3f04c77e8 100644 --- a/src/observer/ob_inner_sql_rpc_processor.cpp +++ b/src/observer/ob_inner_sql_rpc_processor.cpp @@ -264,7 +264,6 @@ void ObInnerSqlRpcP::cleanup_tmp_session( tmp_session = NULL; GCTX.session_mgr_->mark_sessid_unused(free_session_ctx.sessid_); } - ObActiveSessionGuard::setup_default_ash(); // enforce cleanup for future RPC cases } int ObInnerSqlRpcP::process() @@ -345,6 +344,7 @@ int ObInnerSqlRpcP::process() tmp_session->set_current_trace_id(ObCurTraceId::get_trace_id()); tmp_session->init_use_rich_format(); tmp_session->switch_tenant_with_name(transmit_arg.get_tenant_id(), tenant_schema->get_tenant_name_str()); + tmp_session->set_thread_id(GETTID()); ObString sql_stmt(sql_str.ptr()); if (OB_FAIL(tmp_session->set_session_active( sql_stmt, diff --git a/src/observer/ob_resource_inner_sql_connection_pool.cpp b/src/observer/ob_resource_inner_sql_connection_pool.cpp index 3007b8d297..67319c6cbe 100644 --- a/src/observer/ob_resource_inner_sql_connection_pool.cpp +++ b/src/observer/ob_resource_inner_sql_connection_pool.cpp @@ -54,7 +54,8 @@ int ObResourceInnerSQLConnectionPool::init(ObMultiVersionSchemaService *schema_s ob_sql, vt_iter_creator, config, - false))) { + false, + true /* is_resource_conn_pool */))) { LOG_ERROR("init inner sql connection pool failed", K(ret)); } else { is_inited_ = true; @@ -105,7 +106,6 @@ int ObResourceInnerSQLConnectionPool::acquire( if (OB_FAIL(fetch_max_conn_id(conn_id))) { LOG_WARN("failed to fetch max_conn_id", K(ret)); } else { - inner_conn->set_is_resource_conn(true); inner_conn->set_is_idle(false); inner_conn->set_resource_svr(MYADDR); inner_conn->set_resource_conn_id(conn_id); diff --git a/src/observer/ob_root_service_monitor.cpp b/src/observer/ob_root_service_monitor.cpp index 4e9d3d6089..5e6a648b3f 100644 --- a/src/observer/ob_root_service_monitor.cpp +++ b/src/observer/ob_root_service_monitor.cpp @@ -76,7 +76,7 @@ void ObRootServiceMonitor::run1() FLOG_WARN("monitor root service failed", KR(ret)); } if (!has_set_stop()) { - ob_usleep(MONITOR_ROOT_SERVICE_INTERVAL_US); + ob_usleep(MONITOR_ROOT_SERVICE_INTERVAL_US, true/*is_idle_sleep*/); } } FLOG_INFO("root service monitor thread exit"); diff --git a/src/observer/ob_server.cpp b/src/observer/ob_server.cpp index 6fb83953d7..b5a55f4d6b 100644 --- a/src/observer/ob_server.cpp +++ b/src/observer/ob_server.cpp @@ -145,6 +145,7 @@ #include "sql/audit/ob_audit_log_mgr.h" #endif #include "storage/backup/ob_backup_meta_cache.h" +#include "lib/stat/ob_diagnostic_info_container.h" using namespace oceanbase::lib; using namespace oceanbase::common; @@ -160,6 +161,14 @@ extern "C" void ussl_wait(); namespace oceanbase { +namespace common +{ +uint64_t __attribute__((used)) lib_get_cpu_khz() +{ + return OBSERVER.get_cpu_frequency_khz(); +} +} // namespace common + namespace obrpc { void keepalive_init_data(ObNetKeepAliveData &ka_data) @@ -933,6 +942,8 @@ void ObServer::destroy() wr_service_.destroy(); FLOG_INFO("WR service destroyed"); + common::ObDiagnosticInfoContainer::clear_global_di_container(); + FLOG_INFO("begin to destroy cgroup service"); cgroup_ctrl_.destroy(); FLOG_INFO("cgroup service destroyed"); @@ -1773,6 +1784,7 @@ int ObServer::wait() FLOG_INFO("begin to wait observer setted to stop"); while (!stop_) { + common::ObBKGDSessInActiveGuard inactive_guard; SLEEP(3); } @@ -3415,7 +3427,7 @@ void ObServer::check_user_tenant_schema_refreshed(const ObIArray &tena // ignore } else if (!tenant_schema_refreshed) { // check wait and retry - usleep(1000 * 1000); + ob_usleep(1000 * 1000); if (REACH_TIME_INTERVAL(10 * 1000 * 1000)) { FLOG_INFO("[OBSERVER_NOTICE] Refreshing user tenant schema, need to wait ", K(tenant_id)); } @@ -3452,7 +3464,7 @@ void ObServer::check_log_replay_over(const ObIArray &tenant_ids, const weak_read_service_.check_tenant_can_start_service(tenant_id, can_start_service, min_version); // check wait and retry if (!can_start_service) { - usleep(1000 * 1000); + ob_usleep(1000 * 1000); // check success } else if (i == tenant_ids.count() -1) { FLOG_INFO("[OBSERVER_NOTICE] all tenant replay log finished, start to service ", K(tenant_ids)); diff --git a/src/observer/ob_server_reload_config.cpp b/src/observer/ob_server_reload_config.cpp index f33ae968ab..5016827e22 100644 --- a/src/observer/ob_server_reload_config.cpp +++ b/src/observer/ob_server_reload_config.cpp @@ -33,6 +33,7 @@ #include "storage/compaction/ob_tenant_tablet_scheduler.h" #include "storage/meta_store/ob_server_storage_meta_service.h" #include "share/ob_ddl_sim_point.h" +#include "share/ash/ob_active_sess_hist_list.h" #ifdef OB_BUILD_SHARED_STORAGE #include "storage/compaction/ob_tenant_ls_merge_scheduler.h" #include "share/compaction/ob_shared_storage_compaction_util.h" @@ -133,6 +134,9 @@ int ObServerReloadConfig::operator()() if (OB_TMP_FAIL(ObSrvNetworkFrame::reload_rpc_auth_method())) { LOG_WARN("reload config for rpc auth method fail", K(tmp_ret)); } + if (OB_TMP_FAIL(ObActiveSessHistList::get_instance().resize_ash_size())) { + LOG_WARN("failed to change ash size", K(tmp_ret)); + } } { #ifdef OB_BUILD_SHARED_STORAGE diff --git a/src/observer/ob_server_schema_updater.cpp b/src/observer/ob_server_schema_updater.cpp index cdf50e573a..2a5131149f 100644 --- a/src/observer/ob_server_schema_updater.cpp +++ b/src/observer/ob_server_schema_updater.cpp @@ -255,6 +255,7 @@ int ObServerSchemaUpdater::batch_process_tasks( int ObServerSchemaUpdater::process_refresh_task(const ObServerSchemaTask &task) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::REFRESH_SCHEMA); int ret = OB_SUCCESS; const ObRefreshSchemaInfo &schema_info = task.schema_info_; ObTaskController::get().switch_task(share::ObTaskType::SCHEMA); @@ -357,6 +358,7 @@ int ObServerSchemaUpdater::process_release_task() int ObServerSchemaUpdater::process_async_refresh_tasks( const ObIArray &tasks) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::ASYNC_REFRESH_SCHEMA); int ret = OB_SUCCESS; ObTaskController::get().switch_task(share::ObTaskType::SCHEMA); THIS_WORKER.set_timeout_ts(INT64_MAX); diff --git a/src/observer/ob_signal_handle.cpp b/src/observer/ob_signal_handle.cpp index bb20378382..7d39407edf 100644 --- a/src/observer/ob_signal_handle.cpp +++ b/src/observer/ob_signal_handle.cpp @@ -29,6 +29,7 @@ #include "sql/ob_sql_init.h" #include "lib/allocator/ob_pcounter.h" #include "storage/tx_storage/ob_tenant_memory_printer.h" +#include "lib/ash/ob_active_session_guard.h" extern void switch_check_io_hang_errsim(); @@ -56,6 +57,7 @@ void ObSignalHandle::run1() while (!has_set_stop()) {//need not to check ret { oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT); + common::ObBKGDSessInActiveGuard inactive_guard; signum = sigtimedwait(&waitset, NULL, &timeout); } if (-1 == signum) { diff --git a/src/observer/ob_srv_deliver.cpp b/src/observer/ob_srv_deliver.cpp index 07b9459b36..16fcd1c8f8 100644 --- a/src/observer/ob_srv_deliver.cpp +++ b/src/observer/ob_srv_deliver.cpp @@ -33,6 +33,7 @@ #include "rpc/obmysql/ob_mysql_packet.h" #include "rootserver/ob_rs_rpc_processor.h" #include "common/ob_clock_generator.h" +#include "lib/stat/ob_diagnostic_info_container.h" using namespace oceanbase::common; @@ -498,6 +499,33 @@ int ObSrvDeliver::init_queue_threads() return ret; } +int ObSrvDeliver::acquire_diagnostic_info_object( + int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfo *&di) +{ + int ret = OB_SUCCESS; + if (oceanbase::lib::is_diagnose_info_enabled()) { + if (OB_INVALID_TENANT_ID == tenant_id || OB_DTL_TENANT_ID == tenant_id) { + ret = OB_ERROR; + } else { + MTL_SWITCH(tenant_id) { + if (OB_FAIL( + MTL(common::ObDiagnosticInfoContainer *) + ->acquire_diagnostic_info(tenant_id, group_id, session_id, di))) { + OB_ASSERT(di == nullptr); + LOG_WARN("failed to acquire diagnostic info", K(ret), K(tenant_id), K(group_id), + K(session_id)); + } else { + OB_ASSERT(di != nullptr); + common::ObLocalDiagnosticInfo::inc_ref(di); + } + } + } + } else { + ret = OB_ERROR; + } + return ret; +} + int ObSrvDeliver::deliver_rpc_request(ObRequest &req) { int ret = OB_SUCCESS; @@ -517,19 +545,11 @@ int ObSrvDeliver::deliver_rpc_request(ObRequest &req) const int64_t now = ObTimeUtility::current_time(); - const bool need_update_stat = !req.is_retry_on_lock(); + const bool need_update_stat = + !req.is_retry_on_lock() && oceanbase::lib::is_diagnose_info_enabled(); const bool is_stream = pkt.is_stream(); - - ObTenantStatEstGuard guard(pkt.get_tenant_id()); - if (need_update_stat) { - EVENT_INC(RPC_PACKET_IN); - EVENT_ADD(RPC_PACKET_IN_BYTES, - pkt.get_encoded_size() + OB_NET_HEADER_LENGTH); - EVENT_ADD(RPC_NET_DELAY, - req.get_receive_timestamp() - req.get_send_timestamp()); - EVENT_ADD(RPC_NET_FRAME_DELAY, - now - req.get_receive_timestamp()); - } + const uint64_t tenant_id = pkt.get_tenant_id(); + const uint64_t group_id = pkt.get_group_id(); if (stop_ || SS_STOPPING == GCTX.status_ @@ -559,7 +579,6 @@ int ObSrvDeliver::deliver_rpc_request(ObRequest &req) queue = &ddl_queue_->queue_; } } else { - const uint64_t tenant_id = pkt.get_tenant_id(); const uint64_t priv_tenant_id = pkt.get_priv_tenant_id(); if (NULL != gctx_.omt_) { tenant = NULL; @@ -578,10 +597,56 @@ int ObSrvDeliver::deliver_rpc_request(ObRequest &req) } else if (NULL != queue) { SERVER_LOG(DEBUG, "deliver packet", K(queue)); + if (need_update_stat) { + ObTenantDiagnosticInfoSummaryGuard guard(tenant_id, group_id); + EVENT_INC(RPC_PACKET_IN); + EVENT_ADD(RPC_PACKET_IN_BYTES, + pkt.get_encoded_size() + OB_NET_HEADER_LENGTH); + EVENT_ADD(RPC_NET_DELAY, + req.get_receive_timestamp() - req.get_send_timestamp()); + EVENT_ADD(RPC_NET_FRAME_DELAY, + now - req.get_receive_timestamp()); + } + // TODO(roland.qk): pass ObDiagnosticInfo to each queue. if (!queue->push(&req, MAX_QUEUE_LEN)) { ret = OB_QUEUE_OVERFLOW; } } else if (NULL != tenant) { + ObDiagnosticInfo *di = nullptr; + if (OB_UNLIKELY(req.get_diagnostic_info())) { + // possible repost + req.get_diagnostic_info()->inner_begin_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, 0, pkt.get_pcode(), req.get_sql_request_level(), 0); + } else if (need_update_stat) { // simplest way to check is_diagnose_info_enabled + const int64_t allocated_sess_id = + ObBackgroundSessionIdGenerator::get_instance().get_next_sess_id(); + if (OB_SUCCESS != acquire_diagnostic_info_object( + tenant_id, group_id, allocated_sess_id, di)) { + // ignore diagnostic info error + } else { + di->get_ash_stat().pcode_ = pkt.get_pcode(); + di->get_ash_stat().session_type_ = ObActiveSessionStatItem::SessionType::BACKGROUND; + snprintf(di->get_ash_stat().program_, ASH_PROGRAM_STR_LEN, "T%ld_RPC_PROCESS", tenant_id); + snprintf(di->get_ash_stat().module_, ASH_MODULE_STR_LEN, "%s", + obrpc::ObRpcPacketSet::instance().name_of_pcode(pkt.get_pcode())); + if (OB_NOT_NULL(req.get_diagnostic_info())) { + LOG_ERROR("reuse diagnostic info wrongly.", K(&req), K(req.get_diagnostic_info()), K(di)); + } + req.set_diagnostic_info(di); + di->get_ash_stat().trace_id_ = req.generate_trace_id(GCTX.self_addr()); + di->inner_begin_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, 0, pkt.get_pcode(), req.get_sql_request_level(), 0); + } + } + ObTenantDiagnosticInfoSummaryGuard g(nullptr == di ? nullptr : di->get_summary_slot()); + if (need_update_stat) { + EVENT_INC(RPC_PACKET_IN); + EVENT_ADD(RPC_PACKET_IN_BYTES, + pkt.get_encoded_size() + OB_NET_HEADER_LENGTH); + EVENT_ADD(RPC_NET_DELAY, + req.get_receive_timestamp() - req.get_send_timestamp()); + EVENT_ADD(RPC_NET_FRAME_DELAY, + now - req.get_receive_timestamp()); + } + SERVER_LOG(DEBUG, "deliver tenant packet", K(queue), K(tenant->id())); RpcStatPiece piece; piece.is_server_ = true; @@ -662,12 +727,13 @@ int ObSrvDeliver::deliver_mysql_request(ObRequest &req) } if (OB_SUCC(ret)) { - const bool need_update_stat = (ObRequest::OB_MYSQL == req.get_type()) && !req.is_retry_on_lock(); + const bool need_update_stat = (ObRequest::OB_MYSQL == req.get_type()) && + !req.is_retry_on_lock() && + oceanbase::lib::is_diagnose_info_enabled(); // auth request if (NULL == tenant) { const obmysql::ObMySQLRawPacket &pkt = reinterpret_cast(req.get_packet()); - ObTenantStatEstGuard guard(OB_SERVER_TENANT_ID); if (need_update_stat) { EVENT_INC(MYSQL_PACKET_IN); EVENT_ADD(MYSQL_PACKET_IN_BYTES, pkt.get_clen() + OB_MYSQL_HEADER_LENGTH); @@ -685,6 +751,7 @@ int ObSrvDeliver::deliver_mysql_request(ObRequest &req) char user_name_buf[OB_MAX_USER_NAME_BUF_LENGTH] = ""; char tenant_name_buf[OB_MAX_TENANT_NAME_LENGTH + 1] = ""; uint64_t tenant_id = OB_INVALID_TENANT_ID; + ObDiagnosticInfo *di = nullptr; if (OB_FAIL(get_user_tenant(req, user_name_buf, tenant_name_buf))) { LOG_WARN("fail to get username and tenant name", K(ret), K(req)); } else if (0 != STRLEN(user_name_buf)) { @@ -706,9 +773,16 @@ int ObSrvDeliver::deliver_mysql_request(ObRequest &req) conn->tenant_id_ = tenant_id; conn->mysql_pkt_context_.set_tenant_id(tenant_id); conn->proto20_pkt_context_.set_tenant_id(tenant_id); + if (OB_SUCCESS != acquire_diagnostic_info_object(tenant_id, conn->group_id_, conn->sessid_, di)) { + // ignore error. + } else { + di->get_ash_stat().session_type_ = ObActiveSessionStatItem::SessionType::FOREGROUND; + snprintf(di->get_ash_stat().program_, ASH_PROGRAM_STR_LEN, "T%ld_SQL_CMD", tenant_id); + conn->di_ = di; + } } } - + ObTenantDiagnosticInfoSummaryGuard g(di == nullptr ? nullptr : di->get_summary_slot()); if (GCONF._enable_new_sql_nio && GCONF._enable_tenant_sql_net_thread && OB_SUCC(ret) && is_valid_tenant_id(tenant_id)) { if (OB_FAIL(dispatch_req(tenant_id, req, mysql_queue_))) { @@ -729,7 +803,8 @@ int ObSrvDeliver::deliver_mysql_request(ObRequest &req) } else { const obmysql::ObMySQLRawPacket &pkt = reinterpret_cast(req.get_packet()); - ObTenantStatEstGuard guard(tenant->id()); + ObTenantDiagnosticInfoSummaryGuard g(conn->di_ == nullptr ? nullptr : conn->di_->get_summary_slot()); + if (need_update_stat) { EVENT_INC(MYSQL_PACKET_IN); EVENT_ADD(MYSQL_PACKET_IN_BYTES, pkt.get_clen() + OB_MYSQL_HEADER_LENGTH); @@ -747,13 +822,23 @@ int ObSrvDeliver::deliver_mysql_request(ObRequest &req) K(tenant_id), K(ret)); }*/ + if (OB_NOT_NULL(conn->di_)) { + conn->di_->get_ash_stat().trace_id_ = req.generate_trace_id(GCTX.self_addr()); + conn->di_->inner_begin_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, 0, 0, 0, 0); + } if (OB_FAIL(ret)) { // do nothing } else if (tenant->has_stopped()) { ret = OB_TENANT_NOT_IN_SERVER; LOG_WARN("tenant is stopped", K(ret), K(tenant->id())); + if (OB_NOT_NULL(conn->di_)) { + conn->di_->end_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, false); + } } else if (OB_FAIL(tenant->recv_request(req))) { EVENT_INC(MYSQL_DELIVER_FAIL); + if (OB_NOT_NULL(conn->di_)) { + conn->di_->end_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, false); + } LOG_ERROR("deliver request fail", K(req), K(ret), K(*tenant)); if (OB_SIZE_OVERFLOW == ret) { LOG_DBA_ERROR_V2(OB_TENANT_REQUEST_QUEUE_FULL, ret, diff --git a/src/observer/ob_srv_deliver.h b/src/observer/ob_srv_deliver.h index 674c6020ec..67cac0fd51 100644 --- a/src/observer/ob_srv_deliver.h +++ b/src/observer/ob_srv_deliver.h @@ -116,6 +116,7 @@ private: int deliver_rpc_request(rpc::ObRequest &req); int deliver_mysql_request(rpc::ObRequest &req); + int acquire_diagnostic_info_object(int64_t tenant_id, int64_t group_id, int64_t session_id, ObDiagnosticInfo *&di); private: bool is_inited_; diff --git a/src/observer/ob_srv_task.h b/src/observer/ob_srv_task.h index 97bcc362d0..7e39aea8fc 100644 --- a/src/observer/ob_srv_task.h +++ b/src/observer/ob_srv_task.h @@ -18,6 +18,12 @@ namespace oceanbase { + +namespace common +{ +class ObDiagnosticInfo; +} + namespace sql { class ObFreeSessionCtx; diff --git a/src/observer/ob_uniq_task_queue.h b/src/observer/ob_uniq_task_queue.h index df796440ca..56b0742303 100644 --- a/src/observer/ob_uniq_task_queue.h +++ b/src/observer/ob_uniq_task_queue.h @@ -458,9 +458,11 @@ void ObUniqTaskQueue::run1() } } } else { + common::ObBKGDSessInActiveGuard inactive_guard; cond_.wait(QUEUE_WAIT_INTERVAL_MS); } } else {//end cond_ + ObBKGDSessInActiveGuard guard; ob_usleep(QUEUE_WAIT_INTERVAL_MS * 1000); } if (common::OB_SUCCESS == ret && tasks.count() > 0) { diff --git a/src/observer/omt/ob_multi_level_queue.h b/src/observer/omt/ob_multi_level_queue.h index ddb63bacbe..e26bd2adf9 100644 --- a/src/observer/omt/ob_multi_level_queue.h +++ b/src/observer/omt/ob_multi_level_queue.h @@ -34,6 +34,7 @@ public: int try_pop(common::ObLink *&task, const int32_t level); int64_t get_size(const int32_t level) const; int64_t get_total_size() const; + common::ObPriorityQueue<1>* get_pq_queue(const int32_t level) { return &queue_[level]; } int64_t to_string(char *buf, const int64_t buf_len) const { int64_t pos = 0; diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index 17a1b92d25..9af2ff6c05 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -186,6 +186,8 @@ #include "sql/audit/ob_audit_logger.h" #include "sql/audit/ob_audit_log_mgr.h" #endif +#include "observer/mysql/ob_query_response_time.h" //ObTenantQueryRespTimeCollector +#include "lib/stat/ob_diagnostic_info_container.h" #include "observer/table/group/ob_table_tenant_group.h" #include "observer/table/ob_table_client_info_mgr.h" #include "observer/table/ob_table_query_async_processor.h" @@ -470,6 +472,7 @@ int ObMultiTenant::init(ObAddr myaddr, } if (OB_SUCC(ret) && mtl_bind_flag) { + MTL_BIND2(ObDiagnosticInfoContainer::mtl_new, ObDiagnosticInfoContainer::mtl_init, nullptr, nullptr, ObDiagnosticInfoContainer::mtl_wait, ObDiagnosticInfoContainer::mtl_destroy); MTL_BIND2(ObTenantIOManager::mtl_new, ObTenantIOManager::mtl_init, mtl_start_default, mtl_stop_default, nullptr, ObTenantIOManager::mtl_destroy); MTL_BIND2(mtl_new_default, tmp_file::ObTenantTmpFileManager::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); @@ -637,6 +640,8 @@ int ObMultiTenant::init(ObAddr myaddr, MTL_BIND2(mtl_new_default, ObAuditLogger::mtl_init, ObAuditLogger::mtl_start, ObAuditLogger::mtl_stop, ObAuditLogger::mtl_wait, mtl_destroy_default); MTL_BIND2(mtl_new_default, ObAuditLogUpdater::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); #endif + MTL_BIND2(mtl_new_default, ObWorkloadRepositoryContext::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); + MTL_BIND2(mtl_new_default, observer::ObTenantQueryRespTimeCollector::mtl_init, nullptr, nullptr, nullptr, observer::ObTenantQueryRespTimeCollector::mtl_destroy); MTL_BIND2(mtl_new_default, table::ObTableGroupCommitMgr::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); MTL_BIND2(mtl_new_default, table::ObHTableRowkeyMgr::mtl_init, nullptr, nullptr, nullptr, mtl_destroy_default); MTL_BIND2(mtl_new_default, table::ObTableClientInfoMgr::mtl_init, mtl_start_default, mtl_stop_default, mtl_wait_default, mtl_destroy_default); @@ -982,6 +987,10 @@ int ObMultiTenant::convert_hidden_to_real_sys_tenant(const ObUnitInfoGetter::ObT return ret; } +#ifdef ENABLE_DEBUG_LOG +ERRSIM_POINT_DEF(ERRSIM_CREATE_TENANT_FAILURE) +#endif + int ObMultiTenant::create_tenant(const ObTenantMeta &meta, bool write_slog, const int64_t abs_timeout_us) { int ret = OB_SUCCESS; @@ -1162,6 +1171,10 @@ int ObMultiTenant::create_tenant(const ObTenantMeta &meta, bool write_slog, cons LOG_WARN("update tenant config fail", K(tenant_id), K(tmp_ret)); } +#ifdef ENABLE_DEBUG_LOG + ret = ERRSIM_CREATE_TENANT_FAILURE ? ERRSIM_CREATE_TENANT_FAILURE : ret; +#endif + if (OB_FAIL(ret)) { do { tmp_ret = OB_SUCCESS; @@ -1234,6 +1247,7 @@ int ObMultiTenant::create_tenant(const ObTenantMeta &meta, bool write_slog, cons if (OB_TMP_FAIL(cache_washer.sync_flush_tenant(tenant_id))) { LOG_WARN("Fail to sync flush tenant cache", K(tmp_ret)); } + common::ObDiagnosticInfoContainer::get_global_di_container()->purge_tenant_summary(tenant_id); malloc_allocator->recycle_tenant_allocator(tenant_id); } if (lock_succ) { @@ -1528,6 +1542,9 @@ int ObMultiTenant::update_tenant_config(uint64_t tenant_id) if (OB_TMP_FAIL(update_tenant_audit_log_config())) { LOG_WARN("failed to update tenant audit log config", K(tmp_ret), K(tenant_id)); } + if (OB_TMP_FAIL(update_tenant_query_response_time_flush_config())) { + LOG_WARN("failed to update tenant query response time flush config", K(tmp_ret), K(tenant_id)); + } if (tenant_config->kv_group_commit_batch_size > 1 && OB_TMP_FAIL(start_kv_group_commit_timer())) { LOG_WARN("failed to start kv group commit timer", K(tmp_ret), K(tenant_id)); } @@ -1627,6 +1644,61 @@ int ObMultiTenant::update_throttle_config_(const uint64_t tenant_id) return ret; } +int ObMultiTenant::update_tenant_query_response_time_flush_config() +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_NOT_INIT; + LOG_WARN("sql proxy is null", K(ret)); + } else { + int64_t flush_version = 0; + SMART_VAR(ObMySQLProxy::MySQLResult, result) { + uint64_t tenant_id = MTL_ID(); + ObSqlString sql; + if (OB_FAIL(sql.assign_fmt("select max(config_version) from %s where tenant_id = '%lu' and name = 'query_response_time_flush' ", + OB_ALL_VIRTUAL_TENANT_PARAMETER_TNAME, tenant_id))) { + LOG_WARN("fail to generate sql", KR(ret), K(tenant_id)); + } else if (OB_FAIL(GCTX.sql_proxy_->read(result, OB_SYS_TENANT_ID, sql.ptr()))) { + LOG_WARN("read config from all_virtual_tenant_parameter_tname failed", + KR(ret), K(tenant_id), K(OB_SYS_TENANT_ID), K(sql)); + } else if (NULL == result.get_result()) { + LOG_DEBUG("config result is null", K(tenant_id), K(ret)); + } else if (OB_FAIL(result.get_result()->next())) { + LOG_WARN("get result next failed", K(tenant_id), K(ret)); + } else if (OB_FAIL(result.get_result()->get_int(0L, flush_version))) { + if (OB_ERR_NULL_VALUE != ret) { + LOG_WARN("get config_version failed", K(tenant_id), K(ret)); + } else { + LOG_INFO("tenant has no config", K(tenant_id)); + ret = OB_SUCCESS; + } + } + } + if (OB_SUCC(ret)) { + observer::ObTenantQueryRespTimeCollector *t_query_resp_time_collector = MTL(observer::ObTenantQueryRespTimeCollector *); + if (OB_FAIL(ret)) { + // do nothing + } else if (OB_ISNULL(t_query_resp_time_collector)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("t_query_resp_time_collector should not be null", K(ret)); + } else if (flush_version > t_query_resp_time_collector->get_flush_config_version()) { + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID())); + if (!tenant_config.is_valid()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tenant config is invalid",K(ret), K(MTL_ID())); + } else if (tenant_config->query_response_time_flush) { + if (OB_FAIL(t_query_resp_time_collector->flush())) { + LOG_WARN("failed to refresh tenant query response time", K(ret)); + } else { + t_query_resp_time_collector->set_flush_config_version(flush_version); + } + } + } + } + } + return ret; +} + int ObMultiTenant::update_tenant_freezer_mem_limit(const uint64_t tenant_id, const int64_t tenant_min_mem, const int64_t tenant_max_mem) @@ -2141,6 +2213,7 @@ int ObMultiTenant::del_tenant(const uint64_t tenant_id) } while (OB_FAIL(ret)); if (OB_SUCC(ret)) { + common::ObDiagnosticInfoContainer::get_global_di_container()->purge_tenant_summary(tenant_id); lib::ObMallocAllocator::get_instance()->recycle_tenant_allocator(tenant_id); // add a event when finish gc unit SERVER_EVENT_ADD("unit", "finish unit gc", "tenant_id", tenant_id, @@ -2558,7 +2631,8 @@ void ObMultiTenant::run1() } } } - ob_usleep(TIME_SLICE_PERIOD); + ob_usleep(TIME_SLICE_PERIOD, true/*is_idle_sleep*/); + if (REACH_TIME_INTERVAL(10000000L)) { // every 10s SpinRLockGuard guard(lock_); diff --git a/src/observer/omt/ob_multi_tenant.h b/src/observer/omt/ob_multi_tenant.h index 97019428a9..8dd7c099ba 100644 --- a/src/observer/omt/ob_multi_tenant.h +++ b/src/observer/omt/ob_multi_tenant.h @@ -125,6 +125,7 @@ public: int update_tenant_ddl_config(); int update_checkpoint_diagnose_config(); int update_tenant_audit_log_config(); + int update_tenant_query_response_time_flush_config(); int start_kv_group_commit_timer(); int get_tenant(const uint64_t tenant_id, ObTenant *&tenant) const; int get_tenant_with_tenant_lock(const uint64_t tenant_id, common::ObLDHandle &handle, ObTenant *&tenant) const; diff --git a/src/observer/omt/ob_tenant.cpp b/src/observer/omt/ob_tenant.cpp index 9c66069a50..0e8b0615c8 100644 --- a/src/observer/omt/ob_tenant.cpp +++ b/src/observer/omt/ob_tenant.cpp @@ -55,6 +55,7 @@ #include "share/resource_manager/ob_cgroup_ctrl.h" #include "sql/engine/px/ob_px_worker.h" #include "lib/thread/protected_stack_allocator.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase::lib; using namespace oceanbase::common; @@ -290,6 +291,8 @@ void ObPxPool::run1() int ret = OB_SUCCESS; set_px_thread_name(); ObTLTaGuard ta_guard(tenant_id_); + common::ObBackGroundSessionGuard backgroud_session_guard(tenant_id_, group_id_); + ObLocalDiagnosticInfo::set_thread_name(ob_get_tenant_id(), "PxWorker"); auto *pm = common::ObPageManager::thread_local_instance(); if (OB_LIKELY(nullptr != pm)) { pm->set_tenant_ctx(tenant_id_, common::ObCtxIds::DEFAULT_CTX_ID); @@ -1314,7 +1317,6 @@ int ObTenant::get_new_request( } if (OB_SUCC(ret)) { - EVENT_INC(REQUEST_DEQUEUE_COUNT); if (nullptr == req && nullptr != task) { req = static_cast(task); } @@ -1534,7 +1536,6 @@ int ObTenant::recv_request(ObRequest &req) } if (OB_SUCC(ret)) { - ObTenantStatEstGuard guard(id_); EVENT_INC(REQUEST_ENQUEUE_COUNT); } @@ -1561,7 +1562,6 @@ int ObTenant::recv_large_request(rpc::ObRequest &req) } else if (OB_FAIL(recv_group_request(req, OBCG_LQ))){ LOG_ERROR("recv large request failed", "tenant_id", id_); } else { - ObTenantStatEstGuard guard(id_); EVENT_INC(REQUEST_ENQUEUE_COUNT); } return ret; diff --git a/src/observer/omt/ob_tenant.h b/src/observer/omt/ob_tenant.h index 7a65add6d5..e83dab092a 100644 --- a/src/observer/omt/ob_tenant.h +++ b/src/observer/omt/ob_tenant.h @@ -49,7 +49,7 @@ class ObAllVirtualDumpTenantInfo; } namespace omt { - +typedef common::ObPriorityQueue2<1, QQ_MAX_PRIO - 1, RQ_MAX_PRIO - QQ_MAX_PRIO> ReqQueue; class ObPxPool : public share::ObThreadPool { @@ -69,7 +69,11 @@ public: {} virtual void stop(); void set_tenant_id(uint64_t tenant_id) { tenant_id_ = tenant_id; } - void set_group_id(uint64_t group_id) { group_id_ = group_id; } + void set_group_id(uint64_t group_id) + { + GET_DIAGNOSTIC_INFO->get_ash_stat().group_id_ = THIS_WORKER.get_group_id(); + group_id_ = group_id; + } int64_t get_pool_size() const { return get_thread_count(); } int submit(const RunFuncT &func); void set_px_thread_name(); @@ -290,6 +294,8 @@ public: void check_worker_count(ObThWorker &w); int clear_worker(); int get_throttled_time(int64_t &throttled_time); + common::ObPriorityQueue2<0, 1> &get_req_queue() { return req_queue_; } + ObMultiLevelQueue* get_multi_level_queue() { return &multi_level_queue_; } TO_STRING_KV("group_id", group_id_, "queue_size", req_queue_.size(), "recv_req_cnt", recv_req_cnt_, @@ -509,6 +515,8 @@ public: return 0; } GroupMap& get_group_map() { return group_map_;} + ReqQueue& get_req_queue() { return req_queue_; } + ObMultiLevelQueue* get_multi_level_queue() { return multi_level_queue_; } // OB_INLINE bool has_normal_request() const { return req_queue_.size() != 0; } // OB_INLINE bool has_level_request() const { return OB_NOT_NULL(multi_level_queue_) && multi_level_queue_->get_total_size() != 0; } private: diff --git a/src/observer/omt/ob_tenant_node_balancer.cpp b/src/observer/omt/ob_tenant_node_balancer.cpp index ad53fc6683..1fa157737b 100644 --- a/src/observer/omt/ob_tenant_node_balancer.cpp +++ b/src/observer/omt/ob_tenant_node_balancer.cpp @@ -39,6 +39,7 @@ #endif #include "storage/meta_store/ob_server_storage_meta_service.h" #include "observer/ob_server_event_history_table_operator.h" +#include "lib/ash/ob_active_session_guard.h" #ifdef OB_BUILD_TDE_SECURITY #include "share/ob_master_key_getter.h" #endif @@ -134,8 +135,10 @@ void ObTenantNodeBalancer::run1() FLOG_INFO("refresh tenant config", K(tenants), K(ret)); - - USLEEP(refresh_interval_); // sleep 10s + { + common::ObBKGDSessInActiveGuard inactive_guard; + USLEEP(refresh_interval_); // sleep 10s + } } } diff --git a/src/observer/omt/ob_tenant_srs.cpp b/src/observer/omt/ob_tenant_srs.cpp index 2d4e87c740..bf5335ea8a 100644 --- a/src/observer/omt/ob_tenant_srs.cpp +++ b/src/observer/omt/ob_tenant_srs.cpp @@ -451,6 +451,7 @@ int ObTenantSrs::fetch_all_srs(ObSrsCacheSnapShot *&srs_snapshot, bool is_sys_sr ObSqlString sql; ObSQLClientRetryWeak sql_client_retry_weak(sql_proxy_, tenant_id, OB_ALL_SPATIAL_REFERENCE_SYSTEMS_TID); SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::OMT_FETCH_ALL_SRS); ObMySQLResult *result = NULL; if (is_sys_srs) { ret = sql.append_fmt("SELECT * FROM %s WHERE (SRS_ID < %d AND SRS_ID != 0) OR SRS_ID > %d", diff --git a/src/observer/omt/ob_th_worker.cpp b/src/observer/omt/ob_th_worker.cpp index 3de51c3706..76e7cb3cae 100644 --- a/src/observer/omt/ob_th_worker.cpp +++ b/src/observer/omt/ob_th_worker.cpp @@ -31,6 +31,8 @@ #include "storage/memtable/ob_lock_wait_mgr.h" #include "sql/session/ob_sql_session_info.h" #include "sql/executor/ob_memory_tracker.h" +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase; using namespace oceanbase::lib; @@ -150,7 +152,7 @@ void ObThWorker::resume() } -RLOCAL(uint64_t, serving_tenant_id); +thread_local uint64_t ObThWorker::serving_tenant_id_; // Check only before user request starts ObThWorker::Status ObThWorker::check_qtime_throttle() @@ -256,6 +258,10 @@ inline void ObThWorker::process_request(rpc::ObRequest &req) } // need_retry_ can be set in procor_.process() via THIS_WORKER.set_need_retry() if (OB_UNLIKELY(need_retry_)) { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->begin_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, 0, 0, 0, 0); + } int32_t retry_times = req.get_retry_times(); req.set_retry_times(retry_times + 1); if (need_wait_lock) { @@ -290,6 +296,9 @@ inline void ObThWorker::process_request(rpc::ObRequest &req) } if (OB_FAIL(ret)) { + if (OB_NOT_NULL(di)) { + di->end_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, false); + } can_retry_ = false; need_retry_ = false; if (OB_FAIL(procor_.process(req))) { @@ -305,8 +314,8 @@ inline void ObThWorker::process_request(rpc::ObRequest &req) void ObThWorker::set_th_worker_thread_name() { char buf[32]; - if (serving_tenant_id != tenant_->id()) { - serving_tenant_id = tenant_->id(); + if (serving_tenant_id_ != tenant_->id()) { + serving_tenant_id_ = tenant_->id(); snprintf(buf, sizeof(buf), "L%d_G%ld", get_worker_level(), get_group_id()); lib::set_thread_name(buf); } @@ -320,6 +329,7 @@ void ObThWorker::worker(int64_t &tenant_id, int64_t &req_recv_timestamp, int32_t int64_t wait_end_time = 0; procor_.th_created(); blocking_ts_ = &Thread::blocking_ts_; + ObDisableDiagnoseGuard disable_guard; ObTLTaGuard ta_guard(tenant_->id()); ObMemVersionNodeGuard mem_version_node_guard; @@ -371,19 +381,33 @@ void ObThWorker::worker(int64_t &tenant_id, int64_t &req_recv_timestamp, int32_t ObIAllocator **allocator_; } allocator_guard(&allocator_); WITH_ENTITY(&tenant_->ctx()) { - ObTenantStatEstGuard guard(tenant_->id()); - set_compatibility_mode(tenant_->get_compat_mode()); - // get request from queue and process it rpc::ObRequest *req = NULL; - wait_start_time = ObTimeUtility::current_time(); - /// get request from tenant { - ObWaitEventGuard wait_guard(ObWaitEventIds::OMT_IDLE, 0, wait_start_time, 0, 0); + set_compatibility_mode(tenant_->get_compat_mode()); + // get request from queue and process it + wait_start_time = ObTimeUtility::current_time(); + /// get request from tenant ret = tenant_->get_new_request(*this, is_level_worker() ? NESTING_REQUEST_WAIT_TIME : REQUEST_WAIT_TIME, req); wait_end_time = ObTimeUtility::current_time(); } if (OB_SUCC(ret)) { if (OB_NOT_NULL(req)) { + ObEnableDiagnoseGuard enable_guard; + ObDiagnosticInfo *di = req->get_type() == ObRequest::OB_MYSQL + ? reinterpret_cast(SQL_REQ_OP.get_sql_session(req))->di_ + : req->get_diagnostic_info(); + ObDiagnosticInfoSwitchGuard guard(di); + if (di) { + di->end_wait_event(ObWaitEventIds::NETWORK_QUEUE_WAIT, false); + } +#ifdef ENABLE_DEBUG_LOG + if (OB_ISNULL(di)) { + if (REACH_TIME_INTERVAL(60 * 1000 * 1000)) { + LOG_INFO("empty diagnostic info, disable it", KPC(req)); + } + } +#endif + EVENT_INC(REQUEST_DEQUEUE_COUNT); req_recv_timestamp = req->get_receive_timestamp(); EVENT_ADD(REQUEST_QUEUE_TIME, wait_end_time - req->get_enqueue_timestamp()); req->set_push_pop_diff(wait_end_time); diff --git a/src/observer/omt/ob_th_worker.h b/src/observer/omt/ob_th_worker.h index a7a066d608..638366ed3a 100644 --- a/src/observer/omt/ob_th_worker.h +++ b/src/observer/omt/ob_th_worker.h @@ -102,6 +102,7 @@ public: OB_INLINE void set_last_wakeup_ts(int64_t last_wakeup_ts) { last_wakeup_ts_ = last_wakeup_ts; } OB_INLINE int64_t blocking_ts() const { return OB_NOT_NULL(blocking_ts_) ? (*blocking_ts_) : 0; } + static thread_local uint64_t serving_tenant_id_; private: void set_th_worker_thread_name(); void update_ru_cputime(); diff --git a/src/observer/report/ob_ls_table_updater.cpp b/src/observer/report/ob_ls_table_updater.cpp index 4c5eaa716f..5c8c033714 100644 --- a/src/observer/report/ob_ls_table_updater.cpp +++ b/src/observer/report/ob_ls_table_updater.cpp @@ -414,7 +414,7 @@ void ObLSTableUpdater::throttle( } const static int64_t sleep_step_us = 20 * 1000; // 20ms for (; !stopped && sleep_us > 0; sleep_us -= sleep_step_us) { - ob_usleep(static_cast(std::min(sleep_step_us, sleep_us))); + ob_usleep(static_cast(std::min(sleep_step_us, sleep_us)), true /*is_idle_sleep*/); } } diff --git a/src/observer/report/ob_tablet_table_updater.cpp b/src/observer/report/ob_tablet_table_updater.cpp index ba8d6d97d5..69c0db4925 100644 --- a/src/observer/report/ob_tablet_table_updater.cpp +++ b/src/observer/report/ob_tablet_table_updater.cpp @@ -937,7 +937,7 @@ int ObTabletTableUpdater::throttle_( const static int64_t sleep_step_us = 20 * 1000; // 20ms for (; !is_stop_ && sleep_us > 0; sleep_us -= sleep_step_us) { - ob_usleep(static_cast(std::min(sleep_step_us, sleep_us))); + ob_usleep(static_cast(std::min(sleep_step_us, sleep_us)), true /*is_idle_sleep*/); } return ret; } diff --git a/src/observer/table/ob_table_audit.h b/src/observer/table/ob_table_audit.h index e9c5776adc..6b4adef74c 100644 --- a/src/observer/table/ob_table_audit.h +++ b/src/observer/table/ob_table_audit.h @@ -409,7 +409,6 @@ The following macro definition is used to record sql audit, how to use: table::ObTableAudit audit(op, table_name, sess_guard, audit_ctx); \ common::ObMaxWaitGuard max_wait_guard(&audit.record_.exec_record_.max_wait_event_); \ common::ObTotalWaitGuard total_wait_guard(&audit.total_wait_desc_); \ - common::ObTenantStatEstGuard stat_guard((credential).tenant_id_); \ observer::ObProcessMallocCallback pmcb(0, audit.record_.request_memory_used_); \ lib::ObMallocCallbackGuard malloc_guard_(pmcb); \ if (audit.need_audit_ && OB_NOT_NULL(audit_ctx)) { \ diff --git a/src/observer/table/ob_table_query_and_mutate_processor.cpp b/src/observer/table/ob_table_query_and_mutate_processor.cpp index 32c14a3e79..7b188577c9 100644 --- a/src/observer/table/ob_table_query_and_mutate_processor.cpp +++ b/src/observer/table/ob_table_query_and_mutate_processor.cpp @@ -161,6 +161,7 @@ int ObTableQueryAndMutateP::try_process() const ObTableQuery &query = arg_.query_and_mutate_.get_query(); int64_t affected_rows = 0; const bool is_hkv = (ObTableEntityType::ET_HKV == arg_.entity_type_); + stat_event_type_ = get_process_type(is_hkv, arg_.query_and_mutate_.get_mutations().at(0).type()); ObHTableLockHandle *lock_handle = nullptr; ObLSID ls_id; bool exist_global_index = false; diff --git a/src/observer/table/ob_table_rpc_processor.cpp b/src/observer/table/ob_table_rpc_processor.cpp index b07fa51f55..92cc20b9e4 100644 --- a/src/observer/table/ob_table_rpc_processor.cpp +++ b/src/observer/table/ob_table_rpc_processor.cpp @@ -107,7 +107,6 @@ int ObTableLoginP::process() ObRpcProcessor::require_rerouting_ = true; LOG_WARN("[TABLE] login require rerouting", K(ret), "require_rerouting", ObRpcProcessor::require_rerouting_); } - ObTenantStatEstGuard stat_guard(result_.tenant_id_); #ifndef NDEBUG LOG_INFO("[TABLE] login", K(ret), K_(arg), K_(result), "timeout", rpc_pkt_->get_timeout()); #else @@ -253,12 +252,12 @@ ObTableApiProcessorBase::ObTableApiProcessorBase(const ObGlobalContext &gctx) req_timeinfo_guard_(), schema_cache_guard_(), stat_event_type_(-1), + enable_query_response_time_stats_(true), stat_row_count_(0), need_retry_in_queue_(false), is_tablegroup_req_(false), retry_count_(0), user_client_addr_(), - sess_stat_guard_(MTL_ID(), ObActiveSessionGuard::get_stat().session_id_), audit_ctx_(retry_count_, user_client_addr_) { } @@ -393,6 +392,7 @@ int ObTableApiProcessorBase::check_user_access(const ObString &credential_str) } else if (OB_FAIL(check_mode(sess_guard_.get_sess_info()))) { LOG_WARN("fail to check mode", K(ret)); } else { + enable_query_response_time_stats_ = sess_guard_.get_sess_info().enable_query_response_time_stats(); LOG_DEBUG("user can access", K_(credential)); } return ret; @@ -716,7 +716,7 @@ template int ObTableRpcProcessor::before_response(int error_code) { const int64_t elapsed_us = ObTimeUtility::fast_current_time() - RpcProcessor::get_receive_timestamp(); - ObTableRpcProcessorUtil::record_stat(stat_event_type_, elapsed_us, stat_row_count_); + ObTableRpcProcessorUtil::record_stat(stat_event_type_, elapsed_us, stat_row_count_, enable_query_response_time_stats_); return RpcProcessor::before_response(error_code); } diff --git a/src/observer/table/ob_table_rpc_processor.h b/src/observer/table/ob_table_rpc_processor.h index 388ace1ef4..3c9e4eabd5 100644 --- a/src/observer/table/ob_table_rpc_processor.h +++ b/src/observer/table/ob_table_rpc_processor.h @@ -180,7 +180,6 @@ protected: table::ObTableTransParam trans_param_; transaction::ObTxReadSnapshot tx_snapshot_; ObAddr user_client_addr_; - ObSessionStatEstGuard sess_stat_guard_; table::ObTableAuditCtx audit_ctx_; }; diff --git a/src/observer/table/ob_table_rpc_processor_util.h b/src/observer/table/ob_table_rpc_processor_util.h index 44518ab7d7..833599039d 100644 --- a/src/observer/table/ob_table_rpc_processor_util.h +++ b/src/observer/table/ob_table_rpc_processor_util.h @@ -88,6 +88,30 @@ enum ObTableProccessType TABLE_API_PROCESS_TYPE_MAX }; +#define SET_AUDIT_SQL_STRING(op_type) \ +static const char op_type##_name[] = "table api: " #op_type; \ +audit_record.sql_ = const_cast(op_type##_name); \ +audit_record.sql_len_ = sizeof(op_type##_name) + + +#define COLLECT_RESPONSE_TIME_false(stmt_type, elapsed_us) +#define COLLECT_RESPONSE_TIME_true(stmt_type, elapsed_us) \ +do { \ + observer::ObTenantQueryRespTimeCollector *collector = MTL(observer::ObTenantQueryRespTimeCollector *); \ + if (OB_NOT_NULL(collector)) { \ + collector->collect(stmt_type, false/*is_inner_sql*/, elapsed_us); \ + } \ +} while (0); + +#define COLLECT_RESPONSE_TIME(enable, stmt_type, elapsed_us) \ +do { \ + if (enable) { \ + COLLECT_RESPONSE_TIME_true(stmt_type, elapsed_us); \ + } else { \ + COLLECT_RESPONSE_TIME_false(stmt_type, elapsed_us); \ + } \ +} while (0); + class ObTableRpcProcessorUtil { public: @@ -117,45 +141,55 @@ public: OB_INLINE static void record_stat( const int32_t process_type, int64_t elapsed_us, - int64_t rows) + int64_t rows, + bool enable_response_time_stats) { switch (process_type) { // table single mutate case ObTableProccessType::TABLE_API_SINGLE_INSERT: EVENT_INC(TABLEAPI_INSERT_COUNT); EVENT_ADD(TABLEAPI_INSERT_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_INSERT, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_GET: EVENT_INC(TABLEAPI_RETRIEVE_COUNT); EVENT_ADD(TABLEAPI_RETRIEVE_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_GET, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_DELETE: EVENT_INC(TABLEAPI_DELETE_COUNT); EVENT_ADD(TABLEAPI_DELETE_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_DELETE, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_UPDATE: EVENT_INC(TABLEAPI_UPDATE_COUNT); EVENT_ADD(TABLEAPI_UPDATE_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_UPDATE, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_INSERT_OR_UPDATE: EVENT_INC(TABLEAPI_INSERT_OR_UPDATE_COUNT); EVENT_ADD(TABLEAPI_INSERT_OR_UPDATE_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_INSERT_OR_UPDATE, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_PUT: EVENT_INC(TABLEAPI_PUT_COUNT); EVENT_ADD(TABLEAPI_PUT_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_PUT, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_REPLACE: EVENT_INC(TABLEAPI_REPLACE_COUNT); EVENT_ADD(TABLEAPI_REPLACE_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_REPLACE, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_INCREMENT: EVENT_INC(TABLEAPI_INCREMENT_COUNT); EVENT_ADD(TABLEAPI_INCREMENT_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_INCREMENT, elapsed_us); break; case ObTableProccessType::TABLE_API_SINGLE_APPEND: EVENT_INC(TABLEAPI_APPEND_COUNT); EVENT_ADD(TABLEAPI_APPEND_TIME, elapsed_us); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_APPEND, elapsed_us); break; // table batch mutate @@ -163,56 +197,67 @@ public: EVENT_INC(TABLEAPI_MULTI_INSERT_COUNT); EVENT_ADD(TABLEAPI_MULTI_INSERT_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_INSERT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_INSERT, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_GET: EVENT_INC(TABLEAPI_MULTI_RETRIEVE_COUNT); EVENT_ADD(TABLEAPI_MULTI_RETRIEVE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_RETRIEVE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_GET, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_DELETE: EVENT_INC(TABLEAPI_MULTI_DELETE_COUNT); EVENT_ADD(TABLEAPI_MULTI_DELETE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_DELETE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_DELETE, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_UPDATE: EVENT_INC(TABLEAPI_MULTI_UPDATE_COUNT); EVENT_ADD(TABLEAPI_MULTI_UPDATE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_UPDATE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_UPDATE, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_INSERT_OR_UPDATE: EVENT_INC(TABLEAPI_MULTI_INSERT_OR_UPDATE_COUNT); EVENT_ADD(TABLEAPI_MULTI_INSERT_OR_UPDATE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_INSERT_OR_UPDATE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_INSERT_OR_UPDATE, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_PUT: EVENT_INC(TABLEAPI_MULTI_PUT_COUNT); EVENT_ADD(TABLEAPI_MULTI_PUT_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_PUT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_PUT, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_REPLACE: EVENT_INC(TABLEAPI_MULTI_REPLACE_COUNT); EVENT_ADD(TABLEAPI_MULTI_REPLACE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_REPLACE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_REPLACE, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_INCREMENT: EVENT_INC(TABLEAPI_MULTI_INCREMENT_COUNT); EVENT_ADD(TABLEAPI_MULTI_INCREMENT_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_INCREMENT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_INCREMENT, elapsed_us); break; case ObTableProccessType::TABLE_API_MULTI_APPEND: EVENT_INC(TABLEAPI_MULTI_APPEND_COUNT); EVENT_ADD(TABLEAPI_MULTI_APPEND_TIME, elapsed_us); EVENT_ADD(TABLEAPI_MULTI_APPEND_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_APPEND, elapsed_us); break; case ObTableProccessType::TABLE_API_BATCH_RETRIVE: EVENT_INC(TABLEAPI_BATCH_RETRIEVE_COUNT); EVENT_ADD(TABLEAPI_BATCH_RETRIEVE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_BATCH_RETRIEVE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_MULTI_GET, elapsed_us); break; case ObTableProccessType::TABLE_API_BATCH_HYBRID: EVENT_INC(TABLEAPI_BATCH_HYBRID_COUNT); EVENT_ADD(TABLEAPI_BATCH_HYBRID_TIME, elapsed_us); EVENT_ADD(TABLEAPI_BATCH_HYBRID_INSERT_OR_UPDATE_ROW, rows); // @todo row count for each type + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_OTHER, elapsed_us); break; // hbase mutate @@ -220,41 +265,49 @@ public: EVENT_INC(HBASEAPI_DELETE_COUNT); EVENT_ADD(HBASEAPI_DELETE_TIME, elapsed_us); EVENT_ADD(HBASEAPI_DELETE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_DELETE, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_PUT: EVENT_INC(HBASEAPI_PUT_COUNT); EVENT_ADD(HBASEAPI_PUT_TIME, elapsed_us); EVENT_ADD(HBASEAPI_PUT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_PUT, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_CHECK_AND_DELETE: EVENT_INC(HBASEAPI_CHECK_DELETE_COUNT); EVENT_ADD(HBASEAPI_CHECK_DELETE_TIME, elapsed_us); EVENT_ADD(HBASEAPI_CHECK_DELETE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_CHECK_AND_DELETE, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_CHECK_AND_PUT: EVENT_INC(HBASEAPI_CHECK_PUT_COUNT); EVENT_ADD(HBASEAPI_CHECK_PUT_TIME, elapsed_us); EVENT_ADD(HBASEAPI_CHECK_PUT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_CHECK_AND_PUT, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_CHECK_AND_MUTATE: EVENT_INC(HBASEAPI_CHECK_MUTATE_COUNT); EVENT_ADD(HBASEAPI_CHECK_MUTATE_TIME, elapsed_us); EVENT_ADD(HBASEAPI_CHECK_MUTATE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_CHECK_AND_MUTATE, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_INCREMENT: EVENT_INC(HBASEAPI_INCREMENT_COUNT); EVENT_ADD(HBASEAPI_INCREMENT_TIME, elapsed_us); EVENT_ADD(HBASEAPI_INCREMENT_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_INCREMENT, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_APPEND: EVENT_INC(HBASEAPI_APPEND_COUNT); EVENT_ADD(HBASEAPI_APPEND_TIME, elapsed_us); EVENT_ADD(HBASEAPI_APPEND_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_APPEND, elapsed_us); break; case ObTableProccessType::TABLE_API_HBASE_HYBRID: EVENT_INC(HBASEAPI_HYBRID_COUNT); EVENT_ADD(HBASEAPI_HYBRID_TIME, elapsed_us); EVENT_ADD(HBASEAPI_HYBRID_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_OTHER, elapsed_us); break; // table query @@ -262,6 +315,7 @@ public: EVENT_INC(TABLEAPI_QUERY_COUNT); EVENT_ADD(TABLEAPI_QUERY_TIME, elapsed_us); EVENT_ADD(TABLEAPI_QUERY_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_QUERY, elapsed_us); break; // hbase query @@ -269,6 +323,7 @@ public: EVENT_INC(HBASEAPI_SCAN_COUNT); EVENT_ADD(HBASEAPI_SCAN_TIME, elapsed_us); EVENT_ADD(HBASEAPI_SCAN_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_SCAN, elapsed_us); break; // table query async @@ -276,6 +331,7 @@ public: EVENT_INC(TABLEAPI_QUERY_COUNT); EVENT_ADD(TABLEAPI_QUERY_TIME, elapsed_us); EVENT_ADD(TABLEAPI_QUERY_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_QUERY, elapsed_us); break; // hbase query sync @@ -283,6 +339,7 @@ public: EVENT_INC(HBASEAPI_SCAN_COUNT); EVENT_ADD(HBASEAPI_SCAN_TIME, elapsed_us); EVENT_ADD(HBASEAPI_SCAN_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_HBASE_SCAN, elapsed_us); break; // table query_and_mutate @@ -290,11 +347,13 @@ public: EVENT_INC(TABLEAPI_QUERY_AND_MUTATE_COUNT); EVENT_ADD(TABLEAPI_QUERY_AND_MUTATE_TIME, elapsed_us); EVENT_ADD(TABLEAPI_QUERY_AND_MUTATE_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_QUERY_AND_MUTATE, elapsed_us); break; case ObTableProccessType::TABLE_API_GROUP_TRIGGER: EVENT_INC(TABLEAPI_GROUP_TRIGGER_COUNT); EVENT_ADD(TABLEAPI_GROUP_TRIGGER_TIME, elapsed_us); EVENT_ADD(TABLEAPI_GROUP_TRIGGER_ROW, rows); + COLLECT_RESPONSE_TIME(enable_response_time_stats, sql::stmt::T_KV_OTHER, elapsed_us); break; default: SERVER_LOG_RET(WARN, OB_ERR_UNEXPECTED, "unknow process type", K(process_type), K(elapsed_us), K(rows)); diff --git a/src/observer/table_load/ob_table_load_coordinator.cpp b/src/observer/table_load/ob_table_load_coordinator.cpp index ffb7630b0f..2051bf30d3 100644 --- a/src/observer/table_load/ob_table_load_coordinator.cpp +++ b/src/observer/table_load/ob_table_load_coordinator.cpp @@ -482,7 +482,7 @@ int ObTableLoadCoordinator::gen_apply_arg(ObDirectLoadResourceApplyArg &apply_ar if (ret == OB_EAGAIN) { retry_count++; ret = OB_SUCCESS; - usleep(RESOURCE_OP_WAIT_INTERVAL_US); + ob_usleep(RESOURCE_OP_WAIT_INTERVAL_US); } } else { ctx_->param_.need_sort_ = main_need_sort; diff --git a/src/observer/table_load/ob_table_load_task_scheduler.cpp b/src/observer/table_load/ob_table_load_task_scheduler.cpp index 534d0e876a..a16023eb47 100644 --- a/src/observer/table_load/ob_table_load_task_scheduler.cpp +++ b/src/observer/table_load/ob_table_load_task_scheduler.cpp @@ -33,7 +33,6 @@ using namespace storage; void ObTableLoadTaskThreadPoolScheduler::MyThreadPool::run1() { OB_ASSERT(OB_NOT_NULL(scheduler_)); - ObTenantStatEstGuard stat_est_guard(MTL_ID()); const int64_t thread_count = get_thread_count(); // LOG_INFO("table load task thread start", KP(this), "pid", get_tid_cache(), "thread_idx", get_thread_idx()); // 启动成功的线程数+1 diff --git a/src/observer/virtual_table/ob_all_latch.cpp b/src/observer/virtual_table/ob_all_latch.cpp index f4ddc6e985..ea9a4acd57 100644 --- a/src/observer/virtual_table/ob_all_latch.cpp +++ b/src/observer/virtual_table/ob_all_latch.cpp @@ -15,6 +15,8 @@ #include "observer/ob_server.h" #include "observer/ob_server_utils.h" #include "share/ob_tenant_mgr.h" +#include "share/ash/ob_di_util.h" + namespace oceanbase { @@ -56,9 +58,19 @@ int ObAllLatch::get_all_diag_info() { int ret = OB_SUCCESS; if (is_sys_tenant(effective_tenant_id_)) { - if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_all_latch_stat(*allocator_, tenant_dis_))) { - SERVER_LOG(WARN, "Fail to get tenant latch stat", KR(ret)); + common::ObVector ids; + GCTX.omt_->get_tenant_ids(ids); + for (int64_t i = 0; OB_SUCC(ret) && i < ids.size(); ++i) { + uint64_t tenant_id = ids[i]; + if (!is_virtual_tenant_id(tenant_id)) { + MTL_SWITCH(tenant_id) + { + if (OB_FAIL(get_the_diag_info(tenant_id))) { + SERVER_LOG(WARN, "Fail to get tenant latch stat", KR(ret), K(tenant_id)); + } + } } + } } else if (OB_FAIL(get_the_diag_info(effective_tenant_id_))) { SERVER_LOG(WARN, "Fail to get tenant latch stat", KR(ret), K_(effective_tenant_id)); } @@ -79,7 +91,7 @@ int ObAllLatch::get_the_diag_info(const uint64_t tenant_id) std::pair pair; pair.first = tenant_id; pair.second = new (buf) common::ObDiagnoseTenantInfo(allocator_); - if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, *(pair.second)))) { + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, *(pair.second)))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { diff --git a/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.cpp b/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.cpp new file mode 100644 index 0000000000..cc316273d8 --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.cpp @@ -0,0 +1,500 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SERVER + +#include "ob_all_virtual_res_mgr_sys_stat.h" +#include "lib/ob_running_mode.h" +#include "observer/ob_server_struct.h" +#include "observer/ob_server.h" +#include "observer/omt/ob_multi_tenant.h" +#include "share/cache/ob_kv_storecache.h" +#include "storage/tx_storage/ob_tenant_freezer.h" +#include "share/ash/ob_di_util.h" + +namespace oceanbase +{ +namespace observer +{ + +ObAllVirtualResMgrSysStat::ObAllVirtualResMgrSysStat() + : ObVirtualTableScannerIterator(), + ObMultiTenantOperator(), + addr_(NULL), + ipstr_(), + port_(0), + stat_iter_(0), + tenant_id_(OB_INVALID_TENANT_ID), + cur_group_id_(0), + cur_index_(0), + diag_info_(nullptr), + diag_infos_() +{ +} + +ObAllVirtualResMgrSysStat::~ObAllVirtualResMgrSysStat() +{ + reset(); +} + +void ObAllVirtualResMgrSysStat::reset() +{ + omt::ObMultiTenantOperator::reset(); + ObVirtualTableScannerIterator::reset(); + addr_ = NULL; + port_ = 0; + ipstr_.reset(); + stat_iter_ = 0; + tenant_id_ = OB_INVALID_ID; + cur_index_ = 0; + cur_group_id_ = 0; + diag_infos_.reset(); +} + +int ObAllVirtualResMgrSysStat::set_ip(common::ObAddr *addr) +{ + int ret = OB_SUCCESS; + char ipbuf[common::OB_IP_STR_BUFF]; + if (NULL == addr){ + ret = OB_ENTRY_NOT_EXIST; + } else if (!addr_->ip_to_string(ipbuf, sizeof(ipbuf))) { + SERVER_LOG(ERROR, "ip to string failed"); + ret = OB_ERR_UNEXPECTED; + } else { + ipstr_ = ObString::make_string(ipbuf); + if (OB_FAIL(ob_write_string(*allocator_, ipstr_, ipstr_))) { + SERVER_LOG(WARN, "failed to write string", K(ret)); + } + port_ = addr_->get_port(); + } + return ret; +} + +int ObAllVirtualResMgrSysStat::update_all_stats(const int64_t tenant_id, ObStatEventSetStatArray &stat_events) +{ + int ret = OB_SUCCESS; + if (is_virtual_tenant_id(tenant_id)) { + if (OB_FAIL(update_all_stats_(tenant_id, stat_events))) { + SERVER_LOG(WARN, "Fail to update_all_stats_ for virtual tenant", K(ret), K(tenant_id)); + } + } else { + MTL_SWITCH(tenant_id) { + if (OB_FAIL(update_all_stats_(tenant_id, stat_events))) { + SERVER_LOG(WARN, "Fail to update_all_stats_ for tenant", K(ret), K(tenant_id)); + } + } + } + return ret; +} + +int ObAllVirtualResMgrSysStat::update_all_stats_(const int64_t tenant_id, ObStatEventSetStatArray &stat_events) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(get_cache_size_(tenant_id, stat_events))) { + SERVER_LOG(WARN, "Fail to get cache size", K(ret)); + } else { + int64_t unused = 0; + //ignore ret + if (is_virtual_tenant_id(tenant_id)) { + ObVirtualTenantManager &tenant_mgr = common::ObVirtualTenantManager::get_instance(); + tenant_mgr.get_tenant_mem_limit(tenant_id, + stat_events.get(ObStatEventIds::MIN_MEMORY_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + stat_events.get(ObStatEventIds::MAX_MEMORY_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_); + } else { + storage::ObTenantFreezer *freezer = MTL(storage::ObTenantFreezer *); + freezer->get_tenant_memstore_cond( + stat_events.get(ObStatEventIds::ACTIVE_MEMSTORE_USED - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + stat_events.get(ObStatEventIds::TOTAL_MEMSTORE_USED - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + stat_events.get(ObStatEventIds::MAJOR_FREEZE_TRIGGER - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + stat_events.get(ObStatEventIds::MEMSTORE_LIMIT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + unused); + freezer->get_tenant_mem_limit( + stat_events.get(ObStatEventIds::MIN_MEMORY_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_, + stat_events.get(ObStatEventIds::MAX_MEMORY_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_); + } + + // not supported now. + stat_events.get(ObStatEventIds::DISK_USAGE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = 0; + + stat_events.get(ObStatEventIds::OBLOGGER_WRITE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_write_size() : 0; + stat_events.get(ObStatEventIds::ELECTION_WRITE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_elec_write_size() : 0; + stat_events.get(ObStatEventIds::ROOTSERVICE_WRITE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_rs_write_size() : 0; + stat_events.get(ObStatEventIds::OBLOGGER_TOTAL_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_total_write_count() : 0; + stat_events.get(ObStatEventIds::ELECTION_TOTAL_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_elec_total_write_count() : 0; + stat_events.get(ObStatEventIds::ROOTSERVICE_TOTAL_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_rs_total_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_ERROR_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_error_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_WARN_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_warn_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_INFO_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_info_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_TRACE_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_trace_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_DEBUG_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_debug_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_LOG_FLUSH_SPEED - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_async_flush_log_speed() : 0; + + + stat_events.get(ObStatEventIds::ASYNC_GENERIC_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_generic_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_USER_REQUEST_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_user_request_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_DATA_MAINTAIN_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_data_maintain_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_ROOT_SERVICE_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_root_service_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_SCHEMA_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_schema_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_FORCE_ALLOW_LOG_WRITE_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_force_allow_log_write_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_GENERIC_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_generic_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_USER_REQUEST_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_user_request_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_DATA_MAINTAIN_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_data_maintain_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_ROOT_SERVICE_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_root_service_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_SCHEMA_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_schema_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_FORCE_ALLOW_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_force_allow_log_dropped_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_ERROR_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_error_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_WARN_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_warn_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_INFO_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_info_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_TRACE_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_trace_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_DEBUG_LOG_DROPPED_COUNT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_dropped_debug_log_count() : 0; + stat_events.get(ObStatEventIds::ASYNC_LOG_FLUSH_SPEED - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? OB_LOGGER.get_async_flush_log_speed() : 0; + stat_events.get(ObStatEventIds::MEMORY_HOLD_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? lib::AChunkMgr::instance().get_hold() : 0; + stat_events.get(ObStatEventIds::MEMORY_USED_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? lib::AChunkMgr::instance().get_used() : 0; + stat_events.get(ObStatEventIds::MEMORY_FREE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? lib::AChunkMgr::instance().get_freelist_hold() : 0; + stat_events.get(ObStatEventIds::IS_MINI_MODE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? (lib::is_mini_mode() ? 1 : 0) : -1; + stat_events.get(ObStatEventIds::STANDBY_FETCH_LOG_BYTES - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? global_poc_server.get_ratelimit_rxbytes() : -1; + stat_events.get(ObStatEventIds::STANDBY_FETCH_LOG_BANDWIDTH_LIMIT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? global_poc_server.get_ratelimit() : -1; + stat_events.get(ObStatEventIds::MEMORY_LIMIT - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? GMEMCONF.get_server_memory_limit() : 0; + stat_events.get(ObStatEventIds::SYSTEM_MEMORY - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? GMEMCONF.get_reserved_server_memory() : 0; + stat_events.get(ObStatEventIds::HIDDEN_SYS_MEMORY - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ = + (OB_SYS_TENANT_ID == tenant_id) ? GMEMCONF.get_hidden_sys_memory() : 0; + + int ret_bk = ret; + if (NULL != GCTX.omt_) { + double cpu_usage = .0; + if (OB_SUCC(GCTX.omt_->get_tenant_cpu_usage(tenant_id, cpu_usage))) { + stat_events.get(ObStatEventIds::CPU_USAGE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = static_cast(cpu_usage * 100); + stat_events.get(ObStatEventIds::MEMORY_USAGE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = lib::get_tenant_memory_hold(tenant_id); + } else { + // it is ok to not have any records + } + + int64_t worker_time = 0; + if (OB_SUCC(GCTX.omt_->get_tenant_worker_time(tenant_id, worker_time))) { + stat_events.get(ObStatEventIds::WORKER_TIME - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = worker_time; + } else { + // it is ok to not have any records + } + + double min_cpu = .0; + double max_cpu = .0; + if (OB_SUCC(GCTX.omt_->get_tenant_cpu(tenant_id, min_cpu, max_cpu))) { + stat_events.get(ObStatEventIds::MIN_CPUS - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = static_cast(min_cpu * 100); + stat_events.get(ObStatEventIds::MAX_CPUS - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = static_cast(max_cpu * 100); + } else { + // it is ok to not have any records + } + } + if (NULL != GCTX.ob_service_) { + stat_events.get(ObStatEventIds::OBSERVER_PARTITION_TABLE_UPATER_USER_QUEUE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = 0; + stat_events.get(ObStatEventIds::OBSERVER_PARTITION_TABLE_UPATER_SYS_QUEUE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = 0; + stat_events.get(ObStatEventIds::OBSERVER_PARTITION_TABLE_UPATER_CORE_QUEUE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = 0; + } + + int64_t cpu_time = 0; + if (OB_SUCC(GCTX.omt_->get_tenant_cpu_time(tenant_id, cpu_time))) { + stat_events.get(ObStatEventIds::CPU_TIME - ObStatEventIds::STAT_EVENT_ADD_END - 1)->stat_value_ + = cpu_time; + } else { + // it is ok to not have any records + } + + if (!is_virtual_tenant_id(tenant_id)) { // skip virtual tenant + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + MTL_SWITCH(tenant_id) { + auto *tenant_base = MTL_CTX(); + int64_t max_sess_num = tenant_base->get_max_session_num(tenant_config->_resource_limit_max_session_num); + stat_events.get(ObStatEventIds::MAX_SESSION_NUM - ObStatEventIds::STAT_EVENT_ADD_END - 1)->stat_value_ + = max_sess_num; + } + } + } + + ret = ret_bk; + } + return ret; +} + +int ObAllVirtualResMgrSysStat::get_the_diag_info( + const uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + diag_infos_.reset(); + if (OB_FAIL(ObDiagnosticInfoUtil::get_group_diag_info(tenant_id, diag_infos_, allocator_))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + SERVER_LOG(WARN, "Fail to get tenant stat event", KR(ret), K(tenant_id)); + } + } + return ret; +} + +int ObAllVirtualResMgrSysStat::inner_get_next_row(ObNewRow *&row) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(execute(row))) { + SERVER_LOG(WARN, "execute fail", K(ret)); + } + return ret; +} + +int ObAllVirtualResMgrSysStat::process_curr_tenant(ObNewRow *&row) +{ + int ret = OB_SUCCESS; + ObObj *cells = cur_row_.cells_; + const int64_t col_count = output_column_ids_.count(); + + if (OB_UNLIKELY(NULL == allocator_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "allocator is NULL", K(ret)); + } else { + if (MTL_ID() != tenant_id_) { + diag_infos_.reuse(); + tenant_id_ = MTL_ID(); // new tenant, init diag info + if (OB_FAIL(set_ip(addr_))){ + SERVER_LOG(WARN, "can't get ip", K(ret)); + } else if (OB_FAIL(get_the_diag_info(tenant_id_))) { + SERVER_LOG(WARN, "get diag info fail", K(ret), K(tenant_id_)); + } else if (diag_infos_.size() == 0) { + ret = OB_ITER_END; + } else { + stat_iter_ = 0; + cur_index_ = 0; + cur_group_id_ = diag_infos_.at(cur_index_).first; + ObStatEventSetStatArray &stat_events = diag_infos_.at(cur_index_).second.get_set_stat_stats(); + if (OB_FAIL(update_all_stats_(tenant_id_, stat_events))) { + SERVER_LOG(WARN, "update all stats fail", K(ret), K(tenant_id_)); + } else { + diag_info_ = &diag_infos_.at(cur_index_).second; + } + } + } + + if (OB_SUCC(ret) && stat_iter_ >= ObStatEventIds::STAT_EVENT_SET_END) { + if (++cur_index_ < diag_infos_.size()) { + cur_group_id_ = diag_infos_.at(cur_index_).first; + stat_iter_ = 0; + ObStatEventSetStatArray &stat_events = diag_infos_.at(cur_index_).second.get_set_stat_stats(); + if (OB_FAIL(update_all_stats_(tenant_id_, stat_events))) { + SERVER_LOG(WARN, "update all stats fail", K(ret), K(tenant_id_)); + } else { + diag_info_ = &diag_infos_.at(cur_index_).second; + } + } else { + // current tenant stat finish + ret = OB_ITER_END; + } + + } + + if (OB_SUCC(ret)) { + uint64_t cell_idx = 0; + for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { + uint64_t col_id = output_column_ids_.at(i); + switch(col_id) { + case TENANT_ID: { + cells[cell_idx].set_int(tenant_id_); + break; + } + case GROUP_ID: { + cells[cell_idx].set_int(cur_group_id_); + break; + } + case SVR_IP: { + cells[cell_idx].set_varchar(ipstr_); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case SVR_PORT: { + cells[cell_idx].set_int(port_); + break; + } + case STATISTIC: { + if (stat_iter_ < ObStatEventIds::STAT_EVENT_ADD_END) { + cells[cell_idx].set_int(stat_iter_); + } else { + cells[cell_idx].set_int(stat_iter_ - 1); + } + break; + } + case VALUE: { + if (stat_iter_ < ObStatEventIds::STAT_EVENT_ADD_END) { + ObStatEventAddStat *stat = diag_info_->get_add_stat_stats().get(stat_iter_); + if (NULL == stat) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(WARN, "The argument is invalid, ", K(stat_iter_), K(ret)); + } else { + cells[cell_idx].set_int(stat->stat_value_); + } + } else { + ObStatEventSetStat *stat = diag_info_->get_set_stat_stats().get(stat_iter_ - ObStatEventIds::STAT_EVENT_ADD_END -1); + if (NULL == stat) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(WARN, "The argument is invalid, ", K(stat_iter_), K(ret)); + } else { + cells[cell_idx].set_int(stat->stat_value_); + } + } + break; + } + case VALUE_TYPE: { + if (stat_iter_ < ObStatEventIds::STAT_EVENT_ADD_END) { + cells[cell_idx].set_varchar("ADD_VALUE"); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } else { + cells[cell_idx].set_varchar("SET_VALUE"); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } + break; + } + case STAT_ID: { + cells[cell_idx].set_int(OB_STAT_EVENTS[stat_iter_].stat_id_); + break; + } + case NAME: { + cells[cell_idx].set_varchar(OB_STAT_EVENTS[stat_iter_].name_); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case CLASS: { + cells[cell_idx].set_int(OB_STAT_EVENTS[stat_iter_].stat_class_); + break; + } + case CAN_VISIBLE: { + cells[cell_idx].set_bool(OB_STAT_EVENTS[stat_iter_].can_visible_); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "invalid column id", K(ret), K(cell_idx), K(output_column_ids_), K(col_id)); + break; + } + } + if (OB_SUCC(ret)) { + cell_idx++; + } + } + } + + if (OB_SUCC(ret)) { + stat_iter_++; + row = &cur_row_; + if (ObStatEventIds::STAT_EVENT_ADD_END == stat_iter_) { + stat_iter_++; + } + } + } + return ret; +} + +int ObAllVirtualResMgrSysStat::get_cache_size_(const int64_t tenant_id, ObStatEventSetStatArray &stat_events) +{ + int ret = OB_SUCCESS; + ObArray inst_handles; + if (OB_FAIL(ObKVGlobalCache::get_instance().get_cache_inst_info(tenant_id, inst_handles))) { + SERVER_LOG(WARN, "Fail to get tenant cache infos, ", K(ret)); + } else { + ObKVCacheInst * inst = NULL; + for (int64_t i = 0; i < inst_handles.count(); ++i) { + inst = inst_handles.at(i).get_inst(); + if (OB_ISNULL(inst)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "ObKVCacheInstHandle with NULL ObKVCacheInst", K(ret)); + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "opt_table_stat_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::OPT_TAB_STAT_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "opt_column_stat_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::OPT_TAB_COL_STAT_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "tablet_ls_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::TABLET_LS_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "index_block_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::INDEX_BLOCK_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "user_block_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::USER_BLOCK_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "user_row_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::USER_ROW_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else if (0 == STRNCMP(inst->status_.config_->cache_name_, "bf_cache", MAX_CACHE_NAME_LENGTH)) { + stat_events.get(ObStatEventIds::BLOOM_FILTER_CACHE_SIZE - ObStatEventIds::STAT_EVENT_ADD_END -1)->stat_value_ + = inst->status_.map_size_ + inst->status_.store_size_; + } else { + //do nothing + } + } + } + return ret; +} + +void ObAllVirtualResMgrSysStat::release_last_tenant() +{ + diag_infos_.reset(); + tenant_id_ = OB_INVALID_TENANT_ID; +} + +bool ObAllVirtualResMgrSysStat::is_need_process(uint64_t tenant_id) +{ + return (is_sys_tenant(effective_tenant_id_) || tenant_id == effective_tenant_id_); +} +} /* namespace observer */ +} /* namespace oceanbase */ diff --git a/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.h b/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.h new file mode 100644 index 0000000000..caf0f3cc4b --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.h @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_ALL_VIRTUAL_RES_MGR_SYS_STAT_H_ +#define OB_ALL_VIRTUAL_RES_MGR_SYS_STAT_H_ + +#include "lib/stat/ob_session_stat.h" +#include "lib/statistic_event/ob_stat_class.h" +#include "lib/statistic_event/ob_stat_event.h" +#include "observer/omt/ob_multi_tenant_operator.h" +#include "observer/virtual_table/ob_all_virtual_diag_index_scan.h" +#include "share/ob_tenant_mgr.h" +#include "share/ob_virtual_table_scanner_iterator.h" + +namespace oceanbase +{ +namespace observer +{ + +class ObAllVirtualResMgrSysStat : public common::ObVirtualTableScannerIterator, + public omt::ObMultiTenantOperator +{ +public: + ObAllVirtualResMgrSysStat(); + virtual ~ObAllVirtualResMgrSysStat(); + virtual int inner_get_next_row(common::ObNewRow *&row); + virtual void reset(); + inline void set_addr(common::ObAddr &addr) {addr_ = &addr;} + virtual int set_ip(common::ObAddr *addr); + static int update_all_stats(const int64_t tenant_id, ObStatEventSetStatArray &stat_events); +protected: + virtual int get_the_diag_info(const uint64_t tenant_id); +private: + static int update_all_stats_(const int64_t tenant_id, ObStatEventSetStatArray &stat_events); + static int get_cache_size_(const int64_t tenant_id, ObStatEventSetStatArray &stat_events); + + // omt::ObMultiTenantOperator interface + virtual int process_curr_tenant(common::ObNewRow *&row) override; + virtual void release_last_tenant() override; + virtual bool is_need_process(uint64_t tenant_id) override; + +private: + enum SYS_COLUMN + { + TENANT_ID = common::OB_APP_MIN_COLUMN_ID, + GROUP_ID, + SVR_IP, + SVR_PORT, + STATISTIC, + VALUE, + VALUE_TYPE, + STAT_ID, + NAME, + CLASS, + CAN_VISIBLE + }; + common::ObAddr *addr_; + common::ObString ipstr_; + int32_t port_; + int32_t stat_iter_; + uint64_t tenant_id_; + int64_t cur_group_id_; + int64_t cur_index_; + common::ObDiagnoseTenantInfo *diag_info_; + ObArray> diag_infos_; + DISALLOW_COPY_AND_ASSIGN(ObAllVirtualResMgrSysStat); +}; + +} /* namespace observer */ +} /* namespace oceanbase */ + +#endif /* OB_ALL_VIRTUAL_RES_MGR_SYS_STAT_H_ */ diff --git a/src/observer/virtual_table/ob_all_virtual_session_event.cpp b/src/observer/virtual_table/ob_all_virtual_session_event.cpp index dca240e3e9..4bf6b7f1c8 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_event.cpp +++ b/src/observer/virtual_table/ob_all_virtual_session_event.cpp @@ -11,6 +11,7 @@ */ #include "observer/virtual_table/ob_all_virtual_session_event.h" +#include "share/ash/ob_di_util.h" using namespace oceanbase::common; @@ -70,7 +71,7 @@ int ObAllVirtualSessionEvent::set_ip(common::ObAddr *addr) int ObAllVirtualSessionEvent::get_all_diag_info() { int ret = OB_SUCCESS; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_all_diag_info(session_status_))) { + if (OB_SUCCESS != (ret = ObDiagnosticInfoUtil::get_all_diag_info(session_status_, effective_tenant_id_))) { SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); } return ret; @@ -92,14 +93,38 @@ int ObAllVirtualSessionEvent::inner_get_next_row(ObNewRow *&row) SERVER_LOG(WARN, "can't get session status", K(ret)); } } - if (0 == event_iter_) { + if (0 != event_iter_) { + for (; event_iter_ < WAIT_EVENTS_TOTAL; event_iter_++) { + if (collect_->base_value_.get_event_stats().get(event_iter_)->total_waits_ != 0) { + break; + } + } + if (event_iter_ >= WAIT_EVENTS_TOTAL) { + event_iter_ = 0; + session_iter_++; + collect_->lock_.unlock(); + } + } + while (OB_SUCCESS == ret && 0 == event_iter_ && session_iter_ < session_status_.count()) { while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { const uint64_t tenant_id = collect_->base_value_.get_tenant_id(); if (session_status_.at(session_iter_).first == collect_->session_id_ && (is_sys_tenant(effective_tenant_id_) || tenant_id == effective_tenant_id_)) { - break; + for (; event_iter_ < WAIT_EVENTS_TOTAL; event_iter_++) { + if (collect_->base_value_.get_event_stats().get(event_iter_)->total_waits_ != 0) { + // event_iter_ 0 means NULL_EVENT which cannot have actual wait. + break; + } + } + if (event_iter_ >= WAIT_EVENTS_TOTAL) { + event_iter_ = 0; + session_iter_++; + collect_->lock_.unlock(); + } else { + break; + } } else { session_iter_++; collect_->lock_.unlock(); @@ -223,21 +248,24 @@ int ObAllVirtualSessionEventI1::get_all_diag_info() int ret = OB_SUCCESS; int64_t index_id = -1; uint64_t key = 0; - std::pair pair; - for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { - index_id = get_index_ids().at(i); - if (0 < index_id) { - key = static_cast(index_id); - pair.first = key; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_the_diag_info(key, pair.second))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; + typedef std::pair DiPair; + HEAP_VAR(DiPair, pair) + { + for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { + index_id = get_index_ids().at(i); + if (0 < index_id) { + key = static_cast(index_id); + pair.first = key; + if (OB_SUCCESS != (ret = share::ObDiagnosticInfoUtil::get_the_diag_info(key, pair.second))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); + } } else { - SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); - } - } else { - if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { - SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { + SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + } } } } diff --git a/src/observer/virtual_table/ob_all_virtual_session_event.h b/src/observer/virtual_table/ob_all_virtual_session_event.h index 3d2dd8ae73..c3dfecc768 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_event.h +++ b/src/observer/virtual_table/ob_all_virtual_session_event.h @@ -39,8 +39,8 @@ public: protected: virtual int get_all_diag_info(); - common::ObSEArray, - common::OB_MAX_SERVER_SESSION_CNT+1> session_status_; + common::ObSEArray, + 8> session_status_; private: enum EVENT_COLUMN diff --git a/src/observer/virtual_table/ob_all_virtual_session_stat.cpp b/src/observer/virtual_table/ob_all_virtual_session_stat.cpp index e7a71b8e1f..b0eae58e54 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_session_stat.cpp @@ -11,6 +11,7 @@ */ #include "observer/virtual_table/ob_all_virtual_session_stat.h" +#include "share/ash/ob_di_util.h" using namespace oceanbase::common; @@ -70,7 +71,7 @@ int ObAllVirtualSessionStat::set_ip(common::ObAddr *addr) int ObAllVirtualSessionStat::get_all_diag_info() { int ret = OB_SUCCESS; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_all_diag_info(session_status_))) { + if (OB_SUCCESS != (ret = ObDiagnosticInfoUtil::get_all_diag_info(session_status_, effective_tenant_id_))) { SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); } return ret; @@ -94,7 +95,7 @@ int ObAllVirtualSessionStat::inner_get_next_row(ObNewRow *&row) } if (0 == stat_iter_) { while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { const uint64_t tenant_id = collect_->base_value_.get_tenant_id(); if (session_status_.at(session_iter_).first == collect_->session_id_ @@ -117,7 +118,7 @@ int ObAllVirtualSessionStat::inner_get_next_row(ObNewRow *&row) session_iter_++; collect_->lock_.unlock(); while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { if (session_status_.at(session_iter_).first == collect_->session_id_) { break; @@ -219,21 +220,24 @@ int ObAllVirtualSessionStatI1::get_all_diag_info() int ret = OB_SUCCESS; int64_t index_id = -1; uint64_t key = 0; - std::pair pair; - for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { - index_id = get_index_ids().at(i); - if (0 < index_id) { - key = static_cast(index_id); - pair.first = key; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_the_diag_info(key, pair.second))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; + typedef std::pair DiPair; + HEAP_VAR(DiPair, pair) + { + for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { + index_id = get_index_ids().at(i); + if (0 < index_id) { + key = static_cast(index_id); + pair.first = key; + if (OB_SUCCESS != (ret = share::ObDiagnosticInfoUtil::get_the_diag_info(key, pair.second))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); + } } else { - SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); - } - } else { - if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { - SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { + SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + } } } } diff --git a/src/observer/virtual_table/ob_all_virtual_session_stat.h b/src/observer/virtual_table/ob_all_virtual_session_stat.h index 03f09e45fd..09388a9ae5 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_stat.h +++ b/src/observer/virtual_table/ob_all_virtual_session_stat.h @@ -39,8 +39,8 @@ public: protected: virtual int get_all_diag_info(); - common::ObSEArray, - common::OB_MAX_SERVER_SESSION_CNT+1> session_status_; + common::ObSEArray, + 8> session_status_; private: enum SESSION_COLUMN { diff --git a/src/observer/virtual_table/ob_all_virtual_session_wait.cpp b/src/observer/virtual_table/ob_all_virtual_session_wait.cpp index 84e7cd2244..054d354f16 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_wait.cpp +++ b/src/observer/virtual_table/ob_all_virtual_session_wait.cpp @@ -11,6 +11,7 @@ */ #include "observer/virtual_table/ob_all_virtual_session_wait.h" +#include "share/ash/ob_di_util.h" using namespace oceanbase::common; @@ -68,7 +69,7 @@ int ObAllVirtualSessionWait::set_ip(common::ObAddr *addr) int ObAllVirtualSessionWait::get_all_diag_info() { int ret = OB_SUCCESS; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_all_diag_info(session_status_))) { + if (OB_SUCCESS != (ret = ObDiagnosticInfoUtil::get_all_diag_info(session_status_, effective_tenant_id_))) { SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); } return ret; @@ -92,20 +93,16 @@ int ObAllVirtualSessionWait::inner_get_next_row(ObNewRow *&row) } } while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { const uint64_t tenant_id = collect_->base_value_.get_tenant_id(); if (session_status_.at(session_iter_).first == collect_->session_id_ && (is_sys_tenant(effective_tenant_id_) || tenant_id == effective_tenant_id_)) { - if (OB_FAIL(collect_->base_value_.get_event_history().get_last_wait(event_desc))) { - if (OB_ITEM_NOT_SETTED == ret) { - ret = OB_SUCCESS; - session_iter_++; - collect_->lock_.unlock(); - } else { - collect_->lock_.unlock(); - SERVER_LOG(WARN, "Unexpected err", K(ret)); - } + event_desc = &collect_->base_value_.get_curr_wait(); + if (event_desc->wait_begin_time_ == 0) { + ret = OB_SUCCESS; + session_iter_++; + collect_->lock_.unlock(); } else if (NULL == event_desc) { ret = OB_ERR_UNEXPECTED; collect_->lock_.unlock(); @@ -273,27 +270,29 @@ int ObAllVirtualSessionWait::inner_get_next_row(ObNewRow *&row) return ret; } - int ObAllVirtualSessionWaitI1::get_all_diag_info() { int ret = OB_SUCCESS; int64_t index_id = -1; uint64_t key = 0; - std::pair pair; - for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { - index_id = get_index_ids().at(i); - if (0 < index_id) { - key = static_cast(index_id); - pair.first = key; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_the_diag_info(key, pair.second))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; + typedef std::pair DiPair; + HEAP_VAR(DiPair, pair) + { + for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { + index_id = get_index_ids().at(i); + if (0 < index_id) { + key = static_cast(index_id); + pair.first = key; + if (OB_SUCCESS != (ret = share::ObDiagnosticInfoUtil::get_the_diag_info(key, pair.second))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); + } } else { - SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); - } - } else { - if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { - SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { + SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + } } } } diff --git a/src/observer/virtual_table/ob_all_virtual_session_wait.h b/src/observer/virtual_table/ob_all_virtual_session_wait.h index 621968b2c5..0903eb407a 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_wait.h +++ b/src/observer/virtual_table/ob_all_virtual_session_wait.h @@ -39,8 +39,8 @@ public: protected: virtual int get_all_diag_info(); - common::ObSEArray, - common::OB_MAX_SERVER_SESSION_CNT+1> session_status_; + common::ObSEArray, + 8> session_status_; private: enum WAIT_COLUMN diff --git a/src/observer/virtual_table/ob_all_virtual_session_wait_history.cpp b/src/observer/virtual_table/ob_all_virtual_session_wait_history.cpp index 82cbd2a64f..73ab33d9cd 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_wait_history.cpp +++ b/src/observer/virtual_table/ob_all_virtual_session_wait_history.cpp @@ -11,6 +11,7 @@ */ #include "observer/virtual_table/ob_all_virtual_session_wait_history.h" +#include "share/ash/ob_di_util.h" using namespace oceanbase::common; @@ -72,7 +73,7 @@ int ObAllVirtualSessionWaitHistory::set_ip(common::ObAddr *addr) int ObAllVirtualSessionWaitHistory::get_all_diag_info() { int ret = OB_SUCCESS; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_all_diag_info(session_status_))) { + if (OB_SUCCESS != (ret = ObDiagnosticInfoUtil::get_all_diag_info(session_status_, effective_tenant_id_))) { SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); } return ret; @@ -99,11 +100,14 @@ int ObAllVirtualSessionWaitHistory::inner_get_next_row(ObNewRow *&row) } else { history_iter_.reset(); while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { const uint64_t tenant_id = collect_->base_value_.get_tenant_id(); if (session_status_.at(session_iter_).first == collect_->session_id_ && (is_sys_tenant(effective_tenant_id_) || tenant_id == effective_tenant_id_)) { + collect_->base_value_.get_event_history().curr_pos_ = 1; + collect_->base_value_.get_event_history().item_cnt_ = 1; + collect_->base_value_.get_event_history().items_[0] = collect_->base_value_.get_curr_wait(); collect_->base_value_.get_event_history().get_iter(history_iter_); break; } else { @@ -126,7 +130,7 @@ int ObAllVirtualSessionWaitHistory::inner_get_next_row(ObNewRow *&row) collect_->lock_.unlock(); } while (OB_SUCCESS == ret && session_iter_ < session_status_.count()) { - collect_ = session_status_.at(session_iter_).second; + collect_ = &session_status_.at(session_iter_).second; if (NULL != collect_ && OB_SUCCESS == collect_->lock_.try_rdlock()) { if (session_status_.at(session_iter_).first == collect_->session_id_) { history_iter_.reset(); @@ -153,7 +157,7 @@ int ObAllVirtualSessionWaitHistory::inner_get_next_row(ObNewRow *&row) if (OB_SUCCESS == ret && session_status_.count() != 0) { if (OB_ISNULL(event_desc) || OB_ISNULL(collect_)) { ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "event_desc or collect_ is NULL", K(ret), KP(event_desc), KP(collect_)); + SERVER_LOG(WARN, "event_desc or collect_ is NULL" , K(ret), KPC(event_desc), KP(collect_)); } uint64_t cell_idx = 0; double value = 0; @@ -277,25 +281,28 @@ int ObAllVirtualSessionWaitHistoryI1::get_all_diag_info() int ret = OB_SUCCESS; int64_t index_id = -1; uint64_t key = 0; - std::pair pair; - for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { - index_id = get_index_ids().at(i); - if (0 < index_id) { - key = static_cast(index_id); - pair.first = key; - if (OB_SUCCESS != (ret = ObDISessionCache::get_instance().get_the_diag_info(key, pair.second))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; + typedef std::pair DiPair; + HEAP_VAR(DiPair, pair) { + for (int64_t i = 0; OB_SUCC(ret) && i < get_index_ids().count(); ++i) { + index_id = get_index_ids().at(i); + if (0 < index_id) { + key = static_cast(index_id); + pair.first = key; + if (OB_SUCCESS != (ret = share::ObDiagnosticInfoUtil::get_the_diag_info(key, pair.second))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); + } } else { - SERVER_LOG(WARN, "Fail to get session status, ", K(ret)); - } - } else { - if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { - SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + if (OB_SUCCESS != (ret = session_status_.push_back(pair))) { + SERVER_LOG(WARN, "Fail to push diag info value to array, ", K(ret)); + } } } } } + return ret; } diff --git a/src/observer/virtual_table/ob_all_virtual_session_wait_history.h b/src/observer/virtual_table/ob_all_virtual_session_wait_history.h index 0da749a67e..b8498973a2 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_wait_history.h +++ b/src/observer/virtual_table/ob_all_virtual_session_wait_history.h @@ -39,8 +39,8 @@ public: protected: virtual int get_all_diag_info(); - common::ObSEArray, - common::OB_MAX_SERVER_SESSION_CNT+1> session_status_; + common::ObSEArray, + 8> session_status_; private: enum HISTORY_COLUMN diff --git a/src/observer/virtual_table/ob_all_virtual_sql_stat.cpp b/src/observer/virtual_table/ob_all_virtual_sql_stat.cpp new file mode 100644 index 0000000000..f5f4c91d1f --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_sql_stat.cpp @@ -0,0 +1,706 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SQL_ENG + +#include "ob_all_virtual_sql_stat.h" +#include "lib/allocator/ob_mod_define.h" +#include "observer/omt/ob_multi_tenant.h" +#include "share/rc/ob_tenant_base.h" +#include "share/rc/ob_context.h" +#include "observer/ob_server_struct.h" +#include "sql/plan_cache/ob_plan_cache.h" + +using namespace oceanbase::common; +using namespace oceanbase::sql; +using namespace oceanbase::observer; +using namespace oceanbase::share; + +int ObGetAllSqlStatCacheIdOp::operator()(common::hash::HashMapPair &entry) +{ + int ret = common::OB_SUCCESS; + if (OB_ISNULL(key_array_) || OB_ISNULL(entry.second)) { + ret = common::OB_NOT_INIT; + LOG_WARN("invalid argument", K(ret)); + } else if (entry.second->get_ns() == ObLibCacheNameSpace::NS_SQLSTAT || + entry.second->get_ns() == ObLibCacheNameSpace::NS_CRSR) { + if (!entry.second->added_lc()) { + // do nothing + } else if (OB_FAIL(key_array_->push_back(entry.first))) { + LOG_WARN("fail to push back plan_id to key array", K(ret)); + } + } + return ret; +} + +ObAllVirtualSqlStatIter::ObAllVirtualSqlStatIter() : + allocator_(nullptr), + tenant_ids_(), + cur_nth_tenant_(0), + cur_tenant_id_(0), + tmp_sql_stat_map_(), + sql_stat_cache_id_array_(), + sql_stat_cache_id_array_idx_(0) +{ +} + +void ObAllVirtualSqlStatIter::destroy() +{ + reset(); +} + +void ObAllVirtualSqlStatIter::reset() +{ + tenant_ids_.reset(); + cur_nth_tenant_ = 0; + cur_tenant_id_ = 0; + tmp_sql_stat_map_.destroy(); + sql_stat_cache_id_array_.reset(); + sql_stat_cache_id_array_idx_ = 0; +} + +int ObAllVirtualSqlStatIter::init(ObIAllocator *allocator ,const uint64_t effective_tenant_id) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.omt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null of omt", KR(ret)); + } else if (is_sys_tenant(effective_tenant_id)) { + if (OB_FAIL(GCTX.omt_->get_mtl_tenant_ids(tenant_ids_))) { + LOG_WARN("failed to get_mtl_tenant_ids", KR(ret)); + } + } else if (OB_FAIL(tenant_ids_.push_back(effective_tenant_id))) { + LOG_WARN("failed to push back tenant_id", KR(ret), K(effective_tenant_id)); + } + + if (OB_SUCC(ret)) { + const int64_t default_bucket_num = 64; + if (OB_FAIL(tmp_sql_stat_map_.create(default_bucket_num, ObMemAttr(MTL_ID(), "TmpSqlStatMgr")))) { + LOG_WARN("fail to create tmp sql stat map", K(ret)); + } else { + allocator_ = allocator; + } + } + return ret; +} + +int ObAllVirtualSqlStatIter::get_next_batch_sql_stat() +{ + int ret = OB_SUCCESS; + if (cur_nth_tenant_ >= tenant_ids_.count()) { + ret = OB_ITER_END; + } else if (OB_FAIL(tmp_sql_stat_map_.clear())) { + LOG_WARN("failed to clear tmp sql stat map", K(ret)); + } else if (FALSE_IT(sql_stat_cache_id_array_.reuse())) { + } else { + cur_tenant_id_ = tenant_ids_.at(cur_nth_tenant_); + MTL_SWITCH(cur_tenant_id_) { + ObReqTimeGuard req_timeinfo_guard; + ObPlanCache* plan_cache = MTL(ObPlanCache*); + if (OB_NOT_NULL(plan_cache)) { + ObGetAllSqlStatCacheIdOp op(&sql_stat_cache_id_array_); + if (OB_FAIL(plan_cache->foreach_cache_obj(op))) { + LOG_WARN("fail to get all sql stat cache id", K(ret)); + } + } else { + LOG_WARN("failed to get library cache", K(ret)); + } + + if (OB_SUCC(ret)) { + if (OB_NOT_NULL(GCTX.session_mgr_)) { + GCTX.session_mgr_->for_each_session(*this); + } + } + ++cur_nth_tenant_; + } else { + LOG_WARN("failed to switch mtl tenant", K(ret)); + } + } + return ret; +} + +bool ObAllVirtualSqlStatIter::operator()(sql::ObSQLSessionMgr::Key key, ObSQLSessionInfo *sess_info) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(sess_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null sess", K(ret)); + } else if (false == sess_info->is_valid()) { + // do nothing + } else if (ObSQLSessionState::QUERY_ACTIVE != sess_info->get_session_state()) { + // do nothing + } else if (sess_info->get_effective_tenant_id() == cur_tenant_id_) { + // WARNNIGN!!! + // Access to things like cur_sql_ctx_ and cur_plan is forbidden, + // these pointers are not guaranteed to be thread-safe and risk CORE! + ObSqlStatRecordKey key; + sess_info->get_cur_sql_id(key.sql_id_, sizeof(key.sql_id_)); + key.set_plan_hash(sess_info->get_current_plan_hash()); + + ObExecutingSqlStatRecord &executing_sql_stat_record = sess_info->get_executing_sql_stat_record(); + ObExecutedSqlStatRecord *value = nullptr; + if (!key.is_valid()) { + // do nothing + } else if (OB_FAIL(executing_sql_stat_record.record_sqlstat_end_value())){ + LOG_WARN("failed to record sqlstat end value in query virtual table", K(ret)); + } else if (OB_SUCC(tmp_sql_stat_map_.get_refactored(key, value))) { + if (OB_FAIL(value->sum_stat_value(executing_sql_stat_record))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } + } else if (OB_HASH_NOT_EXIST == ret) { + void *buf = nullptr; + ObString sql = ObString::make_empty_string(); + if (obmysql::COM_QUERY == sess_info->get_mysql_cmd() || + obmysql::COM_STMT_EXECUTE == sess_info->get_mysql_cmd() || + obmysql::COM_STMT_PREPARE == sess_info->get_mysql_cmd() || + obmysql::COM_STMT_PREXECUTE == sess_info->get_mysql_cmd()) { + sql = sess_info->get_current_query_string(); + } + + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("alloc is null", K(ret)); + } else if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObExecutedSqlStatRecord), ObMemAttr(MTL_ID(), "TmpSqlStatMgr")))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("alloc failed", K(ret)); + } else if (FALSE_IT(value = new(buf) ObExecutedSqlStatRecord())) { + } else if (OB_FAIL(value->get_sql_stat_info().init(key, *sess_info, sql, nullptr /*phy_plan*/))) { + LOG_WARN("failed to init sql stat info", K(ret)); + } else if (OB_FAIL(value->sum_stat_value(executing_sql_stat_record))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } else if (OB_FAIL(tmp_sql_stat_map_.set_refactored(key, value))) { + LOG_WARN("tmp_sql_stat_map_ set refactored failed", KR(ret)); + } + } else { + LOG_WARN("get_refactored fail", KR(ret), K(key)); + } + } + return true; +} + +int ObAllVirtualSqlStatIter::get_next_sql_stat ( + sql::ObExecutedSqlStatRecord &sql_stat_value, + uint64_t &tenant_id) +{ + int ret = OB_SUCCESS; + while (OB_SUCC(ret) && sql_stat_cache_id_array_idx_ >= sql_stat_cache_id_array_.count() && tmp_sql_stat_map_.empty()) { + if (OB_FAIL(get_next_batch_sql_stat())) { + LOG_WARN("failed to get next tenant sql stat", K(ret)); + } else { + sql_stat_cache_id_array_idx_ = 0; + } + } + + if (OB_SUCC(ret)) { + tenant_id = cur_tenant_id_; + MTL_SWITCH(cur_tenant_id_) { + if (sql_stat_cache_id_array_idx_ < sql_stat_cache_id_array_.count()) { + ObReqTimeGuard req_timeinfo_guard; + ObPlanCache* plan_cache = MTL(ObPlanCache*); + if (OB_NOT_NULL(plan_cache)) { + uint64_t cur_sql_stat_cache_id = sql_stat_cache_id_array_.at(sql_stat_cache_id_array_idx_); + sql_stat_cache_id_array_idx_++; + ObCacheObjGuard guard(VT_SQL_STAT_HANDLE); + int tmp_ret = plan_cache->ref_cache_obj(cur_sql_stat_cache_id, guard); //plan引用计数加VT_SQL_STAT_HANDLE + if (OB_HASH_NOT_EXIST == tmp_ret) { + //do nothing; + } else if (OB_SUCCESS != tmp_ret) { + ret = tmp_ret; + } else if (OB_ISNULL(guard.get_cache_obj())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache object is NULL", K(ret)); + } else { + bool is_succ_get_stat_value = false; + const ObExecutedSqlStatRecord *tmp_sql_stat_value = nullptr; + if (ObLibCacheNameSpace::NS_SQLSTAT == guard.get_cache_obj()->get_ns()) { + ObSqlStatRecordObj *cache_obj = static_cast(guard.get_cache_obj()); + if (OB_NOT_NULL(cache_obj) && OB_NOT_NULL(cache_obj->get_record_value()) && + cache_obj->get_record_value()->get_key().is_valid()) { + tmp_sql_stat_value = cache_obj->get_record_value(); + is_succ_get_stat_value = true; + } + } else if (ObLibCacheNameSpace::NS_CRSR == guard.get_cache_obj()->get_ns()) { + ObPhysicalPlan *plan = static_cast(guard.get_cache_obj()); + if (OB_NOT_NULL(plan) && plan->sql_stat_record_value_.get_key().is_valid()) { + tmp_sql_stat_value = &(plan->sql_stat_record_value_); + is_succ_get_stat_value = true; + } + } + if (OB_SUCC(ret) && is_succ_get_stat_value) { + if (OB_ISNULL(tmp_sql_stat_value)) { + // continue, do nothing + } else { + ObExecutedSqlStatRecord *value = nullptr; + if (OB_FAIL(sql_stat_value.assign(*(tmp_sql_stat_value)))) { + LOG_WARN("failed to assign executed sql stat record", K(ret)); + } else { + int tmp_ret = tmp_sql_stat_map_.get_refactored(sql_stat_value.get_key(), value); + if (OB_HASH_NOT_EXIST == tmp_ret) { + // do nothing + } else if (OB_SUCCESS == tmp_ret) { + if (OB_FAIL(sql_stat_value.sum_stat_value(*value))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } else if (OB_FAIL(tmp_sql_stat_map_.erase_refactored(sql_stat_value.get_key()))) { + LOG_WARN("sql_stat_value earse value failed", KR(ret)); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get from refactored", KR(ret), KR(tmp_ret)); + } + } + } + } + + } + } + } else if (!tmp_sql_stat_map_.empty()) { + if (OB_ISNULL(tmp_sql_stat_map_.begin()->second)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get sql stat from map", K(ret)); + } else { + const ObExecutedSqlStatRecord *tmp_sql_stat_value = tmp_sql_stat_map_.begin()->second; + if (!tmp_sql_stat_value->get_key().is_valid()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get sql stat from map", K(ret)); + } else if (OB_FAIL(sql_stat_value.assign(*(tmp_sql_stat_value)))) { + LOG_WARN("failed to assign executed sql stat record", K(ret)); + } else if (OB_FAIL(tmp_sql_stat_map_.erase_refactored(sql_stat_value.get_key()))) { + LOG_WARN("sql_stat_value earse value failed", KR(ret)); + } + } + } + } + } + return ret; +} + +ObAllVirtualSqlStat::ObAllVirtualSqlStat() : + ipstr_(), port_(0), iter_() +{} + +void ObAllVirtualSqlStat::destroy() +{ + ipstr_.reset(); + iter_.destroy(); +} + +void ObAllVirtualSqlStat::reset() +{ + port_ = 0; + ipstr_.reset(); + iter_.reset(); + start_to_read_ = false; +} + +int ObAllVirtualSqlStat::get_server_ip_and_port() +{ + int ret = OB_SUCCESS; + char ipbuf[common::OB_IP_STR_BUFF]; + const common::ObAddr &addr = GCTX.self_addr(); + if (!addr.ip_to_string(ipbuf, sizeof(ipbuf))) { + SERVER_LOG(ERROR, "ip to string failed"); + ret = OB_ERR_UNEXPECTED; + } else { + ipstr_ = ObString::make_string(ipbuf); + if (OB_FAIL(ob_write_string(*allocator_, ipstr_, ipstr_))) { + LOG_WARN("failed to write string", K(ret)); + } + port_ = addr.get_port(); + } + return ret; +} + +int ObAllVirtualSqlStat::fill_row( + const uint64_t tenant_id, + const ObExecutedSqlStatRecord *sql_stat_record, + common::ObNewRow *&row) +{ + int ret = OB_SUCCESS; + ObObj *cells = cur_row_.cells_; + + for (int64_t cell_idx = 0; OB_SUCC(ret) && cell_idx < output_column_ids_.count(); ++cell_idx) { + uint64_t col_id = output_column_ids_.at(cell_idx); + switch(col_id) { + case SVR_IP: { + cells[cell_idx].set_varchar(ipstr_); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case SVR_PORT: { + cells[cell_idx].set_int(port_); + break; + } + case TENANT_ID: { + cells[cell_idx].set_int(tenant_id); + break; + } + case SQL_ID: { + cells[cell_idx].set_varchar(ObString::make_string(sql_stat_record->get_key().sql_id_)); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case PLAN_ID: { + cells[cell_idx].set_int(sql_stat_record->get_sql_stat_info().get_plan_id()); + break; + } + case PLAN_HASH: { + cells[cell_idx].set_uint64(sql_stat_record->get_key().plan_hash_); + break; + } + case PLAN_TYPE: { + cells[cell_idx].set_int(sql_stat_record->get_sql_stat_info().get_plan_type()); + break; + } + case QUERY_SQL: { + ObCollationType src_cs_type = ObCharset::is_valid_collation(sql_stat_record->get_sql_stat_info().get_sql_cs_type()) ? + sql_stat_record->get_sql_stat_info().get_sql_cs_type() : ObCharset::get_system_collation(); + ObString src_string(static_cast(STRLEN(sql_stat_record->get_sql_stat_info().get_query_sql())), sql_stat_record->get_sql_stat_info().get_query_sql()); + ObString dst_string; + if (OB_FAIL(ObCharset::charset_convert(row_calc_buf_, + src_string, + src_cs_type, + ObCharset::get_system_collation(), + dst_string, + ObCharset::REPLACE_UNKNOWN_CHARACTER))) { + SERVER_LOG(WARN, "fail to convert sql string", K(ret)); + } else { + cells[cell_idx].set_lob_value(ObLongTextType, dst_string.ptr(), + min(dst_string.length(), 1024)); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation( + ObCharset::get_default_charset())); + } + break; + } + case SQL_TYPE: { + cells[cell_idx].set_int(sql_stat_record->get_sql_stat_info().get_sql_type()); + break; + } + case MODULE: { + cells[cell_idx].set_null(); // impl. later + break; + } + case ACTION: { + cells[cell_idx].set_null(); // impl. later + break; + } + case PARSING_DB_ID: { + cells[cell_idx].set_int(sql_stat_record->get_sql_stat_info().get_parsing_db_id()); + break; + } + case PARSING_DB_NAME: { + cells[cell_idx].set_varchar(sql_stat_record->get_sql_stat_info().get_parsing_db_name(), + static_cast(STRLEN(sql_stat_record->get_sql_stat_info().get_parsing_db_name()))); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case PARSING_USER_ID: { + cells[cell_idx].set_int(sql_stat_record->get_sql_stat_info().get_parsing_user_id()); + break; + } + case EXECUTIONS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_executions_total()); + break; + } + case EXECUTIONS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_executions_delta()); + break; + } + case DISK_READS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_disk_reads_total()); + break; + } + case DISK_READS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_disk_reads_delta()); + break; + } + case BUFFER_GETS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_buffer_gets_total()); + break; + } + case BUFFER_GETS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_buffer_gets_delta()); + break; + } + case ELAPSED_TIME_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_elapsed_time_total()); + break; + } + case ELAPSED_TIME_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_elapsed_time_delta()); + break; + } + case CPU_TIME_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_cpu_time_total()); + break; + } + case CPU_TIME_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_cpu_time_delta()); + break; + } + case CCWAIT_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_ccwait_total()); + break; + } + case CCWAIT_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_ccwait_delta()); + break; + } + case USERIO_WAIT_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_userio_wait_total()); + break; + } + case USERIO_WAIT_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_userio_wait_delta()); + break; + } + case APWAIT_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_apwait_total()); + break; + } + case APWAIT_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_apwait_delta()); + break; + } + case PHYSICAL_READ_REQUESTS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_physical_read_requests_total()); + break; + } + case PHYSICAL_READ_REQUESTS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_physical_read_requests_delta()); + break; + } + case PHYSICAL_READ_BYTES_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_physical_read_bytes_total()); + break; + } + case PHYSICAL_READ_BYTES_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_physical_read_bytes_delta()); + break; + } + case WRITE_THROTTLE_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_write_throttle_total()); + break; + } + case WRITE_THROTTLE_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_write_throttle_delta()); + break; + } + case ROWS_PROCESSED_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_rows_processed_total()); + break; + } + case ROWS_PROCESSED_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_rows_processed_delta()); + break; + } + case MEMSTORE_READ_ROWS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_memstore_read_rows_total()); + break; + } + case MEMSTORE_READ_ROWS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_memstore_read_rows_delta()); + break; + } + case MINOR_SSSTORE_READ_ROWS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_minor_ssstore_read_rows_total()); + break; + } + case MINOR_SSSTORE_READ_ROWS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_minor_ssstore_read_rows_delta()); + break; + } + case MAJOR_SSSTORE_READ_ROWS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_major_ssstore_read_rows_total()); + break; + } + case MAJOR_SSSTORE_READ_ROWS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_major_ssstore_read_rows_delta()); + break; + } + case RPC_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_rpc_total()); + break; + } + case RPC_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_rpc_delta()); + break; + } + case FETCHES_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_fetches_total()); + break; + } + case FETCHES_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_fetches_delta()); + break; + } + case RETRY_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_retry_total()); + break; + } + case RETRY_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_retry_delta()); + break; + } + case PARTITION_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_partition_total()); + break; + } + case PARTITION_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_partition_delta()); + break; + } + case NESTED_SQL_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_nested_sql_total()); + break; + } + case NESTED_SQL_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_nested_sql_delta()); + break; + } + case SOURCE_IP: { + if (sql_stat_record->get_key().source_addr_.is_valid()) { + char ipbuf[common::OB_IP_STR_BUFF]; + ObString source_ip_str; + const common::ObAddr &addr = sql_stat_record->get_key().source_addr_; + if (!addr.ip_to_string(ipbuf, sizeof(ipbuf))) { + SERVER_LOG(ERROR, "ip to string failed"); + ret = OB_ERR_UNEXPECTED; + } else { + source_ip_str = ObString::make_string(ipbuf); + if (OB_FAIL(ob_write_string(*allocator_, source_ip_str, source_ip_str))) { + LOG_WARN("failed to write string", K(ret)); + } else { + cells[cell_idx].set_varchar(source_ip_str); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + } + } + } else { + cells[cell_idx].set_varchar(ipstr_); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + } + + break; + } + case SOURCE_PORT: { + if (sql_stat_record->get_key().source_addr_.is_valid()) { + cells[cell_idx].set_int(sql_stat_record->get_key().source_addr_.get_port()); + } else { + cells[cell_idx].set_int(port_); + } + break; + } + case ROUTE_MISS_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_route_miss_total()); + break; + } + case ROUTE_MISS_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_route_miss_delta()); + break; + } + case FIRST_LOAD_TIME: { + int64_t first_load_timestamp = sql_stat_record->get_sql_stat_info().get_first_load_time(); + if (first_load_timestamp == 0) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_timestamp(first_load_timestamp); + } + break; + } + case PLAN_CACHE_HIT_TOTAL: { + cells[cell_idx].set_int(sql_stat_record->get_plan_cache_hit_total()); + break; + } + case PLAN_CACHE_HIT_DELTA: { + cells[cell_idx].set_int(sql_stat_record->get_plan_cache_hit_delta()); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected column id", K(col_id)); + } + } + } + if (OB_SUCC(ret)) { + row = &cur_row_; + } + return ret; +} + +int ObAllVirtualSqlStat::inner_get_next_row(common::ObNewRow *&row) +{ + int ret = OB_SUCCESS; + if (!start_to_read_) { + if (OB_FAIL(iter_.init(allocator_, effective_tenant_id_))) { + LOG_WARN("failed to init iterator", K(ret)); + } else { + start_to_read_ = true; + if (OB_FAIL(get_server_ip_and_port())) { + LOG_WARN("failed to get server ip and port", K(ret)); + } + } + } + + // clear last sql stat record + if (OB_SUCC(ret)) { + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("alloc is null", K(ret)); + } else if (OB_ISNULL(last_sql_stat_record_)) { + // is nullptr , do nothing + } else { + last_sql_stat_record_->~ObExecutedSqlStatRecord(); + allocator_->free(last_sql_stat_record_); + } + } + + if (OB_SUCC(ret)) { + ObExecutedSqlStatRecord *sql_stat_record = nullptr; + uint64_t tenant_id = OB_INVALID_TENANT_ID; + void *buf = nullptr; + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("alloc is null", K(ret)); + } else if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObExecutedSqlStatRecord), ObMemAttr(MTL_ID(), "TmpSqlStat")))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("alloc failed", K(ret)); + } else if (FALSE_IT(sql_stat_record = new(buf) ObExecutedSqlStatRecord())) { + } else { + while (OB_SUCC(ret) && (!sql_stat_record->get_key().is_valid() || OB_INVALID_TENANT_ID == tenant_id)) { + if (OB_FAIL(iter_.get_next_sql_stat(*sql_stat_record, tenant_id))) { + if (OB_ITER_END != ret) { + LOG_WARN("failed to get next sql_stat_record", K(ret)); + } + } + } // end while + + + if (OB_SUCC(ret)) { + if (sql_stat_record->get_key().is_valid() && OB_INVALID_TENANT_ID != tenant_id) { + if (OB_FAIL(fill_row(tenant_id, sql_stat_record, row))) { + LOG_WARN("failed to get row from sql_stat_record", K(ret)); + } else { + last_sql_stat_record_ = sql_stat_record; + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get row from sql_stat_record", K(ret)); + } + } + } + } + return ret; +} diff --git a/src/observer/virtual_table/ob_all_virtual_sql_stat.h b/src/observer/virtual_table/ob_all_virtual_sql_stat.h new file mode 100644 index 0000000000..df03d966e0 --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_sql_stat.h @@ -0,0 +1,154 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_ALL_VIRTUAL_SQL_STAT_H +#define OB_ALL_VIRTUAL_SQL_STAT_H + +#include "sql/engine/ob_tenant_sql_memory_manager.h" +#include "lib/utility/ob_macro_utils.h" +#include "share/ob_virtual_table_scanner_iterator.h" +#include "common/row/ob_row.h" +#include "sql/monitor/ob_sql_stat_record.h" + +namespace oceanbase +{ +namespace observer +{ +typedef common::hash::ObHashMap TmpSqlStatMap; +struct ObGetAllSqlStatCacheIdOp +{ + ObGetAllSqlStatCacheIdOp(common::ObIArray *key_array) + : key_array_(key_array) + {} + void reset() { key_array_ = NULL; } + int operator()(common::hash::HashMapPair &entry); +public: + common::ObIArray *key_array_; +}; + +class ObAllVirtualSqlStatIter +{ +public: + ObAllVirtualSqlStatIter(); + ~ObAllVirtualSqlStatIter() { destroy(); } +public: + void destroy(); + void reset(); + int init(ObIAllocator *allocator, const uint64_t effective_tenant_id); + int get_next_sql_stat(sql::ObExecutedSqlStatRecord &sql_stat_value, + uint64_t &tenant_id); + bool operator()(sql::ObSQLSessionMgr::Key key, sql::ObSQLSessionInfo *sess_info); + +private: + int get_next_batch_sql_stat(); +private: + ObIAllocator *allocator_; + common::ObSEArray tenant_ids_; + int64_t cur_nth_tenant_; + uint64_t cur_tenant_id_; + TmpSqlStatMap tmp_sql_stat_map_; + common::ObSEArray sql_stat_cache_id_array_; + int64_t sql_stat_cache_id_array_idx_; +}; + +class ObAllVirtualSqlStat : public common::ObVirtualTableScannerIterator +{ +public: + ObAllVirtualSqlStat(); + virtual ~ObAllVirtualSqlStat() { destroy(); } + +public: + void destroy(); + void reset(); + int inner_get_next_row(common::ObNewRow *&row); + +private: + enum STORAGE_COLUMN + { + SVR_IP = common::OB_APP_MIN_COLUMN_ID, + SVR_PORT, + TENANT_ID, + SQL_ID, + PLAN_ID, + PLAN_HASH, + PLAN_TYPE, + QUERY_SQL, + SQL_TYPE, + MODULE, + ACTION, + PARSING_DB_ID, + PARSING_DB_NAME, + PARSING_USER_ID, + EXECUTIONS_TOTAL, + EXECUTIONS_DELTA, + DISK_READS_TOTAL, + DISK_READS_DELTA, + BUFFER_GETS_TOTAL, + BUFFER_GETS_DELTA, + ELAPSED_TIME_TOTAL, + ELAPSED_TIME_DELTA, + CPU_TIME_TOTAL, + CPU_TIME_DELTA, + CCWAIT_TOTAL, + CCWAIT_DELTA, + USERIO_WAIT_TOTAL, + USERIO_WAIT_DELTA, + APWAIT_TOTAL, + APWAIT_DELTA, + PHYSICAL_READ_REQUESTS_TOTAL, + PHYSICAL_READ_REQUESTS_DELTA, + PHYSICAL_READ_BYTES_TOTAL, + PHYSICAL_READ_BYTES_DELTA, + WRITE_THROTTLE_TOTAL, + WRITE_THROTTLE_DELTA, + ROWS_PROCESSED_TOTAL, + ROWS_PROCESSED_DELTA, + MEMSTORE_READ_ROWS_TOTAL, + MEMSTORE_READ_ROWS_DELTA, + MINOR_SSSTORE_READ_ROWS_TOTAL, + MINOR_SSSTORE_READ_ROWS_DELTA, + MAJOR_SSSTORE_READ_ROWS_TOTAL, + MAJOR_SSSTORE_READ_ROWS_DELTA, + RPC_TOTAL, + RPC_DELTA, + FETCHES_TOTAL, + FETCHES_DELTA, + RETRY_TOTAL, + RETRY_DELTA, + PARTITION_TOTAL, + PARTITION_DELTA, + NESTED_SQL_TOTAL, + NESTED_SQL_DELTA, + SOURCE_IP, + SOURCE_PORT, + ROUTE_MISS_TOTAL, + ROUTE_MISS_DELTA, + FIRST_LOAD_TIME, + PLAN_CACHE_HIT_TOTAL, + PLAN_CACHE_HIT_DELTA + }; + int fill_row(const uint64_t tenant_id, + const ObExecutedSqlStatRecord *sql_stat_record, + common::ObNewRow *&row); + int get_server_ip_and_port(); +private: + common::ObString ipstr_; + int32_t port_; + ObAllVirtualSqlStatIter iter_; + ObExecutedSqlStatRecord *last_sql_stat_record_; +}; + + +} /* namespace observer */ +} /* namespace oceanbase */ + +#endif /* OB_ALL_VIRTUAL_SQL_STAT_H */ diff --git a/src/observer/virtual_table/ob_all_virtual_ss_local_cache_info.cpp b/src/observer/virtual_table/ob_all_virtual_ss_local_cache_info.cpp index b1f734f08d..835092a291 100644 --- a/src/observer/virtual_table/ob_all_virtual_ss_local_cache_info.cpp +++ b/src/observer/virtual_table/ob_all_virtual_ss_local_cache_info.cpp @@ -12,6 +12,7 @@ #include "ob_all_virtual_ss_local_cache_info.h" #include "share/ob_server_struct.h" +#include "share/ash/ob_di_util.h" #ifdef OB_BUILD_SHARED_STORAGE #include "storage/shared_storage/common/ob_ss_common_info.h" @@ -74,7 +75,7 @@ int ObAllVirtualSSLocalCacheInfo::get_the_diag_info( { int ret = OB_SUCCESS; diag_info.reset(); - if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + if (OB_FAIL(oceanbase::share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { diff --git a/src/observer/virtual_table/ob_all_virtual_sys_event.cpp b/src/observer/virtual_table/ob_all_virtual_sys_event.cpp index 73608c8245..b74835b1d6 100644 --- a/src/observer/virtual_table/ob_all_virtual_sys_event.cpp +++ b/src/observer/virtual_table/ob_all_virtual_sys_event.cpp @@ -12,6 +12,7 @@ #include "ob_all_virtual_sys_event.h" #include "share/ob_tenant_mgr.h" +#include "share/ash/ob_di_util.h" using namespace oceanbase::common; @@ -74,7 +75,7 @@ int ObAllVirtualSysEvent::get_the_diag_info( { int ret = OB_SUCCESS; diag_info_.reset(); - if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { @@ -120,12 +121,18 @@ int ObAllVirtualSysEvent::process_curr_tenant(ObNewRow *&row) if (OB_FAIL(set_ip(addr_))){ SERVER_LOG(WARN, "can't get ip", K(ret)); } else if (OB_FAIL(get_the_diag_info(tenant_id_, diag_info_))) { - SERVER_LOG(WARN, "get diag info fail", K(ret), K(tenant_id_)); + if (OB_ITER_END != ret) { + SERVER_LOG(WARN, "get diag info fail", K(ret), K(tenant_id_)); + } } else { event_iter_ = 0; } } - + for (; event_iter_ < WAIT_EVENTS_TOTAL; event_iter_++) { + if (diag_info_.get_event_stats().get(event_iter_)->total_waits_ > 0) { + break; + } + } if (event_iter_ >= WAIT_EVENTS_TOTAL) { ret = OB_ITER_END; } @@ -232,7 +239,7 @@ int ObAllVirtualSysEventI1::get_the_diag_info( diag_info.reset(); if (!is_contain(get_index_ids(), (int64_t)tenant_id)) { ret = OB_ITER_END; - } else if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + } else if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { diff --git a/src/observer/virtual_table/ob_all_virtual_sys_stat.cpp b/src/observer/virtual_table/ob_all_virtual_sys_stat.cpp index 77effeaacd..47f3101a24 100644 --- a/src/observer/virtual_table/ob_all_virtual_sys_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_sys_stat.cpp @@ -19,6 +19,7 @@ #include "observer/omt/ob_multi_tenant.h" #include "share/cache/ob_kv_storecache.h" #include "storage/tx_storage/ob_tenant_freezer.h" +#include "share/ash/ob_di_util.h" namespace oceanbase { @@ -283,7 +284,7 @@ int ObAllVirtualSysStat::get_the_diag_info( { int ret = OB_SUCCESS; diag_info.reset(); - if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { @@ -491,7 +492,7 @@ int ObAllVirtualSysStatI1::get_the_diag_info( diag_info.reset(); if (!is_contain(get_index_ids(), (int64_t)tenant_id)) { ret = OB_ITER_END; - } else if (OB_FAIL(common::ObDIGlobalTenantCache::get_instance().get_the_diag_info(tenant_id, diag_info))) { + } else if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(tenant_id, diag_info))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { diff --git a/src/observer/virtual_table/ob_gv_sql_audit.cpp b/src/observer/virtual_table/ob_gv_sql_audit.cpp index 5e3ad4cc2d..523ba43f36 100644 --- a/src/observer/virtual_table/ob_gv_sql_audit.cpp +++ b/src/observer/virtual_table/ob_gv_sql_audit.cpp @@ -1069,7 +1069,7 @@ int ObGvSqlAudit::fill_cells(obmysql::ObMySQLRequestRecord &record) cells[cell_idx].set_int(record.data_.plsql_exec_time_); } break; case NETWORK_WAIT_TIME: { - cells[cell_idx].set_null(); + cells[cell_idx].set_uint64(record.data_.exec_record_.network_wait_time_); } break; case STMT_TYPE: { ObString stmt_type_name; diff --git a/src/observer/virtual_table/ob_information_kvcache_table.cpp b/src/observer/virtual_table/ob_information_kvcache_table.cpp index b52055b7cf..ab2e63a00b 100644 --- a/src/observer/virtual_table/ob_information_kvcache_table.cpp +++ b/src/observer/virtual_table/ob_information_kvcache_table.cpp @@ -11,6 +11,9 @@ */ #include "observer/virtual_table/ob_information_kvcache_table.h" +#include "share/ash/ob_di_util.h" +#include "observer/ob_server_struct.h" +#include "observer/omt/ob_multi_tenant.h" using namespace oceanbase::common; @@ -123,12 +126,31 @@ int ObInfoSchemaKvCacheTable::get_tenant_info() if (is_sys_tenant(effective_tenant_id_)) { arenallocator_.reuse(); tenant_dis_.reuse(); - if (OB_FAIL(ObDIGlobalTenantCache::get_instance().get_all_stat_event(arenallocator_, tenant_dis_))) { - SERVER_LOG(WARN, "Fail to get all stat event", K(ret)); + common::ObVector ids; + GCTX.omt_->get_tenant_ids(ids); + for (int64_t i = 0; OB_SUCC(ret) && i < ids.size(); ++i) { + uint64_t tenant_id = ids[i]; + void *buf = NULL; + if (!is_virtual_tenant_id(tenant_id)) { + if (OB_ISNULL(buf = allocator_->alloc(sizeof(common::ObDiagnoseTenantInfo)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + SERVER_LOG(WARN, "Fail to alloc buf", KR(ret)); + } else { + std::pair pair; + pair.first = tenant_id; + pair.second = new (buf) common::ObDiagnoseTenantInfo(allocator_); + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info( + tenant_id, *(pair.second)))) { + SERVER_LOG(WARN, "Fail to get tenant stat event", K(ret), K(tenant_id)); + } else if (OB_FAIL(tenant_dis_.push_back(pair))) { + SERVER_LOG(WARN, "Fail to get tenant stat event", K(ret), K(tenant_id)); + } + } + } } } else { tenant_di_info_.reset(); - if (OB_FAIL(ObDIGlobalTenantCache::get_instance().get_the_diag_info(effective_tenant_id_, tenant_di_info_))) { + if (OB_FAIL(share::ObDiagnosticInfoUtil::get_the_diag_info(effective_tenant_id_, tenant_di_info_))) { SERVER_LOG(WARN, "Fail to get tenant stat event", K(ret), K(effective_tenant_id_)); } } diff --git a/src/observer/virtual_table/ob_information_query_response_time.cpp b/src/observer/virtual_table/ob_information_query_response_time.cpp index 7565b26d31..fafc6d8048 100644 --- a/src/observer/virtual_table/ob_information_query_response_time.cpp +++ b/src/observer/virtual_table/ob_information_query_response_time.cpp @@ -29,8 +29,9 @@ ObInfoSchemaQueryResponseTimeTable::ObInfoSchemaQueryResponseTimeTable() addr_(NULL), ipstr_(), port_(0), - time_collector_(nullptr), - utility_iter_(0) + time_collector_(), + utility_iter_(0), + sql_type_iter_(0) { } @@ -46,8 +47,9 @@ void ObInfoSchemaQueryResponseTimeTable::reset() port_ = 0; ipstr_.reset(); start_to_read_ = false; - time_collector_ = nullptr; + time_collector_.flush(); utility_iter_ = 0; + sql_type_iter_ = 0; ObVirtualTableScannerIterator::reset(); } @@ -126,30 +128,64 @@ int ObInfoSchemaQueryResponseTimeTable::process_curr_tenant(ObNewRow *&row) } else if (OB_ISNULL(cur_row_.cells_)) { ret = OB_ERR_UNEXPECTED; SERVER_LOG(ERROR, "cur row cell is NULL", K(ret)); - } else if(0 == ObRSTCollector::get_instance().collector_map_.size()){ - ret = OB_ITER_END; - SERVER_LOG(WARN, "query response time size is 0", K(MTL_ID()), K(time), K(ret)); } else { - if (utility_iter_ == 0){ - if (OB_FAIL(ObRSTCollector::get_instance().collector_map_.get_refactored(MTL_ID(), time_collector_))){ - SERVER_LOG(WARN, "time collector of the tenant does not exist", K(MTL_ID()), K(time), K(ret)); - ret = OB_ITER_END; - } else { - if (OB_FAIL(process_row_data(row, cells))){ - SERVER_LOG(WARN, "process row data of time collector failed", K(MTL_ID()), K(time), K(ret)); - } + if (utility_iter_ == 0 && sql_type_iter_ == 0) { + observer::ObTenantQueryRespTimeCollector *t_query_resp_time_collector = MTL(observer::ObTenantQueryRespTimeCollector *); + if (OB_FAIL(ret)) { + // do nothing + } else if (OB_ISNULL(t_query_resp_time_collector)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "t_query_resp_time_collector should not be null", K(ret)); + } else if (OB_FAIL(t_query_resp_time_collector->get_sum_value(time_collector_))) { + SERVER_LOG(WARN, "failed to get sum value",K(ret), K(MTL_ID())); + } else if (OB_FAIL(process_row_data(row, cells))){ + SERVER_LOG(WARN, "process row data of time collector failed", K(MTL_ID()), K(ret)); } - } else if (utility_iter_ == time_collector_->bound_count()){ + } else if (utility_iter_ == time_collector_.utility().bound_count() && sql_type_iter_ == static_cast(RespTimeSqlType::END) -1 ){ ret = OB_ITER_END; } else { + if (utility_iter_ == time_collector_.utility().bound_count()) { + sql_type_iter_ ++; + utility_iter_ = 0; + } if (OB_FAIL(process_row_data(row, cells))){ - SERVER_LOG(WARN, "process row data of time collector failed", K(MTL_ID()), K(time), K(ret)); + SERVER_LOG(WARN, "process row data of time collector failed", K(MTL_ID()), K(ret)); } } } return ret; } - +static inline const char *sql_type_to_string(RespTimeSqlType type) +{ + switch(type) + { + case(RespTimeSqlType::select_sql): return "SELECT"; + case(RespTimeSqlType::insert_sql): return "INSERT"; + case(RespTimeSqlType::delete_sql): return "DELETE"; + case(RespTimeSqlType::update_sql): return "UPDATE"; + case(RespTimeSqlType::replace_sql): return "REPLACE"; + case(RespTimeSqlType::commit_sql): return "COMMIT"; + case(RespTimeSqlType::other_sql): return "OTHER"; + case(RespTimeSqlType::tableapi_select_sql): return "TABLEAPI SELECT"; + case(RespTimeSqlType::tableapi_insert_sql): return "TABLEAPI INSERT"; + case(RespTimeSqlType::tableapi_delete_sql): return "TABLEAPI DELETE"; + case(RespTimeSqlType::tableapi_update_sql): return "TABLEAPI UPDATE"; + case(RespTimeSqlType::tableapi_replace_sql): return "TABLEAPI REPLACE"; + case(RespTimeSqlType::tableapi_query_and_mutate_sql): return "TABLEAPI QUERY AND MUTATE"; + case(RespTimeSqlType::tableapi_other_sql): return "TABLEAPI OTHER"; + case(RespTimeSqlType::hbase_scan_sql): return "HBASE SCAN"; + case(RespTimeSqlType::hbase_put_sql): return "HBASE PUT"; + case(RespTimeSqlType::hbase_delete_sql): return "HBASE DELETE"; + case(RespTimeSqlType::hbase_append_sql): return "HBASE APPEND"; + case(RespTimeSqlType::hbase_increment_sql): return "HBASE INCREMENT"; + case(RespTimeSqlType::hbase_check_and_put_sql): return "HBASE CHECK AND PUT"; + case(RespTimeSqlType::hbase_check_and_mutate_sql): return "HBASE CHECK AND MUTATE"; + case(RespTimeSqlType::hbase_check_and_delete_sql): return "HBASE CHECK AND DELETE"; + case(RespTimeSqlType::hbase_hybrid_batch_sql): return "HBASE HYBRID BATCH"; + case(RespTimeSqlType::inner_sql): return "INNER SQL"; + default: return ""; + } +} int ObInfoSchemaQueryResponseTimeTable::process_row_data(ObNewRow *&row, ObObj* cells) { int ret = OB_SUCCESS; @@ -165,6 +201,7 @@ int ObInfoSchemaQueryResponseTimeTable::process_row_data(ObNewRow *&row, ObObj* } case SVR_IP: { cells[cell_idx].set_varchar(ipstr_); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case SVR_PORT: { @@ -172,21 +209,36 @@ int ObInfoSchemaQueryResponseTimeTable::process_row_data(ObNewRow *&row, ObObj* break; } case QUERY_RESPPONSE_TIME:{ - cells[cell_idx].set_int(time_collector_->bound(utility_iter_)); + cells[cell_idx].set_int(time_collector_.utility().bound(utility_iter_)); break; } - case COUNT: { - cells[cell_idx].set_int(time_collector_->count(utility_iter_)); + case COUNT: { + int64_t val = 0; + if (OB_FAIL(time_collector_.get_count_val(static_cast(sql_type_iter_), utility_iter_, val))) { + SERVER_LOG(WARN, "failed to get count val", K(ret), K(utility_iter_), K(sql_type_iter_)); + } else { + cells[cell_idx].set_int(val); + } break; } case TOTAL: { - cells[cell_idx].set_int(time_collector_->total(utility_iter_)); + int64_t val = 0; + if (OB_FAIL(time_collector_.get_total_time_val(static_cast(sql_type_iter_), utility_iter_, val))) { + SERVER_LOG(WARN, "failed to get count val", K(ret), K(utility_iter_), K(sql_type_iter_)); + } else { + cells[cell_idx].set_int(val); + } break; } case SQL_TYPE: { - // unused - cells[cell_idx].set_varchar(""); - cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + const char* sql_type = sql_type_to_string(static_cast(sql_type_iter_)); + if (strcmp(sql_type, "") == 0) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "invalid sql type, please check sql_type_to_string func", K(ret), K(sql_type_iter_), K(sql_type)); + } else { + cells[cell_idx].set_varchar(sql_type); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } break; } default: { @@ -211,8 +263,9 @@ int ObInfoSchemaQueryResponseTimeTable::process_row_data(ObNewRow *&row, ObObj* void ObInfoSchemaQueryResponseTimeTable::release_last_tenant() { - time_collector_ = nullptr; + time_collector_.flush(); utility_iter_ = 0; + sql_type_iter_ = 0; } } // namespace observer diff --git a/src/observer/virtual_table/ob_information_query_response_time.h b/src/observer/virtual_table/ob_information_query_response_time.h index 77446303af..f0b1d03342 100644 --- a/src/observer/virtual_table/ob_information_query_response_time.h +++ b/src/observer/virtual_table/ob_information_query_response_time.h @@ -51,7 +51,7 @@ public: addr_ = &addr; } int process_row_data(ObNewRow *&row, ObObj* cells); - + private: enum SYS_COLUMN { TENANT_ID = common::OB_APP_MIN_COLUMN_ID, @@ -65,8 +65,9 @@ private: common::ObAddr* addr_; common::ObString ipstr_; int32_t port_; - ObRSTTimeCollector* time_collector_; + ObRespTimeInfoCollector time_collector_; int32_t utility_iter_; + int32_t sql_type_iter_; }; } // namespace observer diff --git a/src/observer/virtual_table/ob_virtual_ash.cpp b/src/observer/virtual_table/ob_virtual_ash.cpp index 39b74d053f..b80507fa79 100644 --- a/src/observer/virtual_table/ob_virtual_ash.cpp +++ b/src/observer/virtual_table/ob_virtual_ash.cpp @@ -25,6 +25,7 @@ using namespace oceanbase::share; ObVirtualASH::ObVirtualASH() : ObVirtualTableScannerIterator(), + iterator_(), addr_(), ipstr_(), port_(0), @@ -83,7 +84,7 @@ int ObVirtualASH::inner_get_next_row(common::ObNewRow *&row) do { if (iterator_.has_next()) { - const ActiveSessionStat &node = iterator_.next(); + const ObActiveSessionStatItem &node = iterator_.next(); if (OB_SYS_TENANT_ID == effective_tenant_id_ || node.tenant_id_ == effective_tenant_id_) { if (OB_FAIL(convert_node_to_row(node, row))) { LOG_WARN("fail convert row", K(ret)); @@ -98,7 +99,7 @@ int ObVirtualASH::inner_get_next_row(common::ObNewRow *&row) return ret; } -int ObVirtualASH::convert_node_to_row(const ActiveSessionStat &node, ObNewRow *&row) +int ObVirtualASH::convert_node_to_row(const ObActiveSessionStatItem &node, ObNewRow *&row) { int ret = OB_SUCCESS; ObObj *cells = cur_row_.cells_; @@ -147,17 +148,21 @@ int ObVirtualASH::convert_node_to_row(const ActiveSessionStat &node, ObNewRow *& } case SQL_ID: { if ('\0' == node.sql_id_[0]) { - cells[cell_idx].set_varchar(""); + cells[cell_idx].set_null(); } else { cells[cell_idx].set_varchar(node.sql_id_, static_cast(OB_MAX_SQL_ID_LENGTH)); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); } - cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case TRACE_ID: { - int len = node.trace_id_.to_string(trace_id_, sizeof(trace_id_)); - cells[cell_idx].set_varchar(trace_id_, len); - cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + if (node.trace_id_.is_valid()) { + int len = node.trace_id_.to_string(trace_id_, sizeof(trace_id_)); + cells[cell_idx].set_varchar(trace_id_, len); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } else { + cells[cell_idx].set_null(); + } break; } case EVENT_NO: { @@ -217,21 +222,36 @@ int ObVirtualASH::convert_node_to_row(const ActiveSessionStat &node, ObNewRow *& break; } case MODULE: { - cells[cell_idx].set_null(); // impl. later + if (node.module_[0] == '\0') { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.module_, static_cast(STRLEN(node.module_))); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case ACTION: { - cells[cell_idx].set_null(); // impl. later + if (node.action_[0] == '\0') { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.action_, static_cast(STRLEN(node.action_))); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case CLIENT_ID: { - cells[cell_idx].set_null(); // impl. later + if (node.client_id_[0] == '\0') { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.client_id_, static_cast(STRLEN(node.client_id_))); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case BACKTRACE: { #ifndef NDEBUG if (node.bt_[0] == '\0') { - cells[cell_idx].set_varchar(""); + cells[cell_idx].set_null(); } else { cells[cell_idx].set_varchar(node.bt_); } @@ -270,95 +290,163 @@ int ObVirtualASH::convert_node_to_row(const ActiveSessionStat &node, ObNewRow *& break; } case PROGRAM: { - cells[cell_idx].set_null(); + if ('\0' == node.program_[0]) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.program_, static_cast(STRLEN(node.program_))); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case TM_DELTA_TIME: { - cells[cell_idx].set_null(); + cells[cell_idx].set_int(node.delta_time_); break; } case TM_DELTA_CPU_TIME: { - cells[cell_idx].set_null(); + cells[cell_idx].set_int(node.delta_cpu_time_); break; } case TM_DELTA_DB_TIME: { - cells[cell_idx].set_null(); + cells[cell_idx].set_int(node.delta_db_time_); break; } case TOP_LEVEL_SQL_ID: { - cells[cell_idx].set_null(); + if ('\0' == node.top_level_sql_id_[0]) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.top_level_sql_id_); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case IN_PLSQL_COMPILATION: { - cells[cell_idx].set_bool(false); + cells[cell_idx].set_bool(node.in_plsql_compilation_); break; } case IN_PLSQL_EXECUTION: { - cells[cell_idx].set_bool(false); + cells[cell_idx].set_bool(node.in_plsql_execution_); break; } case PLSQL_ENTRY_OBJECT_ID: { - cells[cell_idx].set_null(); + if (OB_INVALID_ID == node.plsql_entry_object_id_) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_int(node.plsql_entry_object_id_); + } break; } case PLSQL_ENTRY_SUBPROGRAM_ID: { - cells[cell_idx].set_null(); + if (OB_INVALID_ID == node.plsql_entry_subprogram_id_) { + if (OB_INVALID_ID != node.plsql_entry_object_id_) { + cells[cell_idx].set_int(1); + } else { + cells[cell_idx].set_null(); + } + } else { + cells[cell_idx].set_int(node.plsql_entry_subprogram_id_); + } break; } case PLSQL_ENTRY_SUBPROGRAM_NAME: { - cells[cell_idx].set_null(); + if ('\0' == node.plsql_entry_subprogram_name_[0]) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.plsql_entry_subprogram_name_); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case PLSQL_OBJECT_ID: { - cells[cell_idx].set_null(); + if (OB_INVALID_ID == node.plsql_object_id_) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_int(node.plsql_object_id_); + } break; } case PLSQL_SUBPROGRAM_ID: { - cells[cell_idx].set_null(); + if (OB_INVALID_ID == node.plsql_subprogram_id_) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_int(node.plsql_subprogram_id_); + } break; } case PLSQL_SUBPROGRAM_NAME: { - cells[cell_idx].set_null(); + if ('\0' == node.plsql_subprogram_name_[0]) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_varchar(node.plsql_subprogram_name_); + } + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); break; } case EVENT_ID: { - cells[cell_idx].set_null(); + if (OB_LIKELY(node.event_no_ == 0)) { + cells[cell_idx].set_null(); + } else { + cells[cell_idx].set_int(OB_WAIT_EVENTS[node.event_no_].event_id_); + } break; } case IN_FILTER_ROWS: { - cells[cell_idx].set_bool(false); + cells[cell_idx].set_bool(node.in_filter_rows_); break; } case GROUP_ID: { - cells[cell_idx].set_null(); + cells[cell_idx].set_int(node.group_id_); break; } case TX_ID: { - cells[cell_idx].set_null(); + if (node.tx_id_ != 0) { + cells[cell_idx].set_int(node.tx_id_); + } else { + cells[cell_idx].set_null(); + } break; } case BLOCKING_SESSION_ID: { - cells[cell_idx].set_null(); + if (node.block_sessid_ != 0) { + cells[cell_idx].set_int(node.block_sessid_); + } else { + cells[cell_idx].set_null(); + } break; } case PLAN_HASH: { - cells[cell_idx].set_null(); + if (node.plan_hash_ != 0) { + cells[cell_idx].set_uint64(node.plan_hash_); + } else { + cells[cell_idx].set_null(); + } break; } case THREAD_ID: { - cells[cell_idx].set_null(); + if (node.tid_ != 0) { + cells[cell_idx].set_int(node.tid_); + } else { + cells[cell_idx].set_null(); + } break; } case STMT_TYPE: { - cells[cell_idx].set_null(); + if (node.stmt_type_ != 0) { + cells[cell_idx].set_int(node.stmt_type_); + } else { + cells[cell_idx].set_null(); + } break; } case TABLET_ID: { - cells[cell_idx].set_null(); + if (node.tablet_id_ != 0) { + cells[cell_idx].set_int(node.tablet_id_); + } else { + cells[cell_idx].set_null(); + } break; } case PROXY_SID: { - cells[cell_idx].set_null(); + cells[cell_idx].set_int(node.proxy_sid_); break; } case DELTA_READ_IO_REQUESTS: { @@ -396,7 +484,7 @@ int ObVirtualASHI1::inner_get_next_row(common::ObNewRow *&row) int ret = OB_SUCCESS; do { if (iterator_.has_next()) { - const ActiveSessionStat &node = iterator_.next(); + const ObActiveSessionStatItem &node = iterator_.next(); if (OB_SYS_TENANT_ID == effective_tenant_id_ || node.tenant_id_ == effective_tenant_id_) { if (OB_FAIL(convert_node_to_row(node, row))) { LOG_WARN("fail convert row", K(ret)); diff --git a/src/observer/virtual_table/ob_virtual_ash.h b/src/observer/virtual_table/ob_virtual_ash.h index 8490b9b6cf..18104a21d5 100644 --- a/src/observer/virtual_table/ob_virtual_ash.h +++ b/src/observer/virtual_table/ob_virtual_ash.h @@ -38,7 +38,7 @@ public: private: int set_ip(const common::ObAddr &addr); protected: - int convert_node_to_row(const common::ActiveSessionStat &node, ObNewRow *&row); + int convert_node_to_row(const common::ObActiveSessionStatItem &node, ObNewRow *&row); protected: enum COLUMN_ID { diff --git a/src/observer/virtual_table/ob_virtual_data_access_service.cpp b/src/observer/virtual_table/ob_virtual_data_access_service.cpp index 6c6e0e8167..3fd572a35c 100644 --- a/src/observer/virtual_table/ob_virtual_data_access_service.cpp +++ b/src/observer/virtual_table/ob_virtual_data_access_service.cpp @@ -23,6 +23,10 @@ namespace observer int ObVirtualDataAccessService::table_scan(ObVTableScanParam ¶m, ObNewRowIterator *&result) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + const share::ObLSID &ls_id = param.ls_id_; + const common::ObTabletID &data_tablet_id = param.tablet_id_; + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = data_tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; ObVirtualTableIterator *vt_iter = NULL; if (OB_FAIL(vt_iter_factory_.create_virtual_table_iterator(param, vt_iter))) { diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index 5b530058c3..36102ecad7 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -229,6 +229,7 @@ #include "observer/virtual_table/ob_tenant_show_restore_preview.h" #include "observer/virtual_table/ob_all_virtual_tenant_resource_limit.h" #include "observer/virtual_table/ob_all_virtual_tenant_resource_limit_detail.h" +#include "observer/virtual_table/ob_all_virtual_res_mgr_sys_stat.h" #include "observer/virtual_table/ob_all_virtual_tracepoint_info.h" #include "observer/virtual_table/ob_all_virtual_nic_info.h" #include "observer/virtual_table/ob_all_virtual_sys_variable_default_value.h" @@ -236,6 +237,7 @@ #include "observer/virtual_table/ob_information_schema_enable_roles_table.h" #include "observer/virtual_table/ob_all_virtual_tenant_scheduler_running_job.h" #include "observer/virtual_table/ob_all_virtual_compatibility_control.h" +#include "observer/virtual_table/ob_all_virtual_sql_stat.h" #include "observer/virtual_table/ob_all_virtual_ss_local_cache_info.h" #include "observer/virtual_table/ob_all_virtual_vector_index_info.h" #include "observer/virtual_table/ob_all_virtual_tmp_file.h" @@ -2827,6 +2829,14 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ALL_VIRTUAL_SQLSTAT_TID: { + ObAllVirtualSqlStat *all_virtual_sqlstat = NULL; + if (OB_SUCC(NEW_VIRTUAL_TABLE(ObAllVirtualSqlStat, all_virtual_sqlstat))) { + all_virtual_sqlstat->set_allocator(&allocator); + vt_iter = static_cast(all_virtual_sqlstat); + } + break; + } case OB_ALL_VIRTUAL_SS_LOCAL_CACHE_INFO_TID: { ObAllVirtualSSLocalCacheInfo *local_cache_info = nullptr; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObAllVirtualSSLocalCacheInfo, local_cache_info))) { @@ -2880,6 +2890,16 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID: + { + ObAllVirtualResMgrSysStat *all_virtual_res_mgr_sysstat = nullptr; + if (OB_SUCC(NEW_VIRTUAL_TABLE(ObAllVirtualResMgrSysStat, + all_virtual_res_mgr_sysstat))) { + vt_iter = static_cast(all_virtual_res_mgr_sysstat); + all_virtual_res_mgr_sysstat->set_addr(addr_); + } + break; + } case OB_ALL_VIRTUAL_KV_CLIENT_INFO_TID: { ObAllVirtualKvClientInfo *all_virtual_kv_client_info = NULL; diff --git a/src/pl/diagnosis/ob_pl_sql_audit_guard.cpp b/src/pl/diagnosis/ob_pl_sql_audit_guard.cpp index 0aa8eab5ac..177822101b 100644 --- a/src/pl/diagnosis/ob_pl_sql_audit_guard.cpp +++ b/src/pl/diagnosis/ob_pl_sql_audit_guard.cpp @@ -43,17 +43,17 @@ ObPLSqlAuditGuard::ObPLSqlAuditGuard( { enable_perf_event_ = lib::is_diagnose_info_enabled(); enable_sql_audit_ = GCONF.enable_sql_audit && session_info_.get_local_ob_enable_sql_audit(); - // enable_sql_stat_ = session_info.is_sqlstat_enabled(); + enable_sql_stat_ = session_info.is_sqlstat_enabled(); max_wait_guard_ = new (memory1) ObMaxWaitGuard(enable_perf_event_ ? &max_wait_desc_ : NULL); total_wait_guard_ = new (memory2) ObTotalWaitGuard(enable_perf_event_ ? &total_wait_desc_ : NULL); if (enable_perf_event_) { record_.exec_record_.record_start(); } - // if (enable_sql_stat_ && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { - // record_.sqlstat_record_.record_sqlstat_start_value(); - // record_.sqlstat_record_.set_is_in_retry(session_info_.get_is_in_retry()); - // session_info_.sql_sess_record_sql_stat_start_value(record_.sqlstat_record_); - // } + if (enable_sql_stat_ && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { + sqlstat_record_.record_sqlstat_start_value(); + sqlstat_record_.set_is_in_retry(session_info_.get_is_in_retry()); + session_info_.sql_sess_record_sql_stat_start_value(sqlstat_record_); + } // 监控项统计开始 record_.time_record_.set_send_timestamp(ObTimeUtility::current_time()); } @@ -65,11 +65,12 @@ ObPLSqlAuditGuard::~ObPLSqlAuditGuard() if (enable_perf_event_) { record_.exec_record_.record_end(); } - // if (enable_sql_stat_ && OB_NOT_NULL(exec_ctx_.get_sql_ctx()) && OB_NOT_NULL(spi_result_.get_result_set())) { - // record_.sqlstat_record_.record_sqlstat_end_value(); - // record_.sqlstat_record_.move_to_sqlstat_cache( - // session_info_, exec_ctx_.get_sql_ctx()->cur_sql_, spi_result_.get_result_set()->get_physical_plan()); - // } + if (enable_sql_stat_ && OB_NOT_NULL(exec_ctx_.get_sql_ctx()) && OB_NOT_NULL(spi_result_.get_result_set())) { + sqlstat_record_.record_sqlstat_end_value(); + sqlstat_record_.set_is_plan_cache_hit(exec_ctx_.get_sql_ctx()->plan_cache_hit_); + sqlstat_record_.move_to_sqlstat_cache( + session_info_, exec_ctx_.get_sql_ctx()->cur_sql_, spi_result_.get_result_set()->get_physical_plan()); + } max_wait_guard_->~ObMaxWaitGuard(); total_wait_guard_->~ObTotalWaitGuard(); diff --git a/src/pl/diagnosis/ob_pl_sql_audit_guard.h b/src/pl/diagnosis/ob_pl_sql_audit_guard.h index 6edfb7db08..76bf242acf 100644 --- a/src/pl/diagnosis/ob_pl_sql_audit_guard.h +++ b/src/pl/diagnosis/ob_pl_sql_audit_guard.h @@ -107,6 +107,7 @@ private: bool enable_perf_event_; bool enable_sql_audit_; bool enable_sql_stat_; + bool enable_sqlstat_; sql::ObExecContext &exec_ctx_; sql::ObSQLSessionInfo &session_info_; @@ -124,6 +125,8 @@ private: observer::ObQueryRetryCtrl &retry_ctrl_; sql::ObPLSPITraceIdGuard &traceid_guard_; sql::stmt::StmtType stmt_type_; + + ObExecutingSqlStatRecord sqlstat_record_; }; } diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 0ea6157f48..bf241e6b82 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -706,6 +706,12 @@ int ObPLContext::init(ObSQLSessionInfo &session_info, : ctx.get_allocator(), session_info.get_current_query_string(), cur_query_)); OZ (session_info.store_top_query_string(cur_query_)); OZ (recursion_ctx_.init(session_info)); + // set top level sql id + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di) && di->get_ash_stat().top_level_sql_id_[0] == '\0') { + session_info.get_cur_sql_id(di->get_ash_stat().top_level_sql_id_, + sizeof(di->get_ash_stat().top_level_sql_id_)); + } OX (session_info.set_pl_stack_ctx(this)); OX (need_remove_top_stack = true); OX (session_info.set_pl_can_retry(true)); @@ -1557,6 +1563,7 @@ int ObPL::execute(ObExecContext &ctx, int64_t execute_start = ObTimeUtility::current_time(); ObObj local_result(ObMaxType); int local_status = OB_SUCCESS; + ObPLASHGuard guard(routine.get_package_id(), routine.get_routine_id(), routine.get_function_name()); ObArenaAllocator tmp_alloc(GET_PL_MOD_STRING(PL_MOD_IDX::OB_PL_ARENA), OB_MALLOC_NORMAL_BLOCK_SIZE, MTL_ID()); ObPLAllocator1 pl_sym_allocator(PL_MOD_IDX::OB_PL_SYMBOL_TABLE, &tmp_alloc); OZ (pl_sym_allocator.init(nullptr)); @@ -1948,6 +1955,7 @@ int ObPL::execute(ObExecContext &ctx, ParamStore ¶ms, const ObStmtNodeTree * || lib::is_mysql_mode(); int64_t old_worker_timeout_ts = 0; + ObPLASHGuard guard(ObPLResolver::ANONYMOUS_VIRTUAL_OBJECT_ID, OB_INVALID_ID); /* !!! * PL,req_timeinfo_guard一定要在执行前定义 * !!! @@ -2098,6 +2106,7 @@ int ObPL::execute(ObExecContext &ctx, ObPLFunction *routine = NULL; ObCacheObjGuard cacheobj_guard(PL_ANON_HANDLE); int64_t old_worker_timeout_ts = 0; + ObPLASHGuard guard(ObPLResolver::ANONYMOUS_VIRTUAL_OBJECT_ID, OB_INVALID_ID); /* !!! * PL,req_timeinfo_guard一定要在执行前定义 @@ -2200,6 +2209,7 @@ int ObPL::execute(ObExecContext &ctx, ObCacheObjGuard cacheobj_guard(PL_ROUTINE_HANDLE); int64_t old_worker_timeout_ts = 0; ObCurTraceId::TraceId parent_trace_id; + ObPLASHGuard guard(package_id, routine_id); /* !!! * PL,req_timeinfo_guard一定要在执行前定义 * !!! @@ -5143,5 +5153,167 @@ int ObPLFunction::gen_action_from_precompiled(const ObString &name, size_t lengt return ret; } +ObPLASHGuard::ObPLASHGuard(ObPLASHStatus status) + : plsql_current_subprogram_name_("\0"), + in_plsql_compilation_(false), + in_plsql_execution_(false), + plsql_entry_object_id_(0), + plsql_entry_subprogram_id_(0), + plsql_current_object_id_(0), + plsql_current_subprogram_id_(0), + set_entry_info_(0), + set_entry_name_(0), + set_current_name_(0), + pl_ash_status_(ObPLASHStatus::INVALID_ASH_STATUS) +{ + pl_ash_status_ = status; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + switch (pl_ash_status_) { + case IS_PLSQL_COMPILATION: { + in_plsql_compilation_ = di->get_ash_stat().in_plsql_compilation_; + di->get_ash_stat().in_plsql_compilation_ = 1; + break; + } + case IS_PLSQL_EXECUTION: { + in_plsql_execution_ = di->get_ash_stat().in_plsql_execution_; + di->get_ash_stat().in_plsql_execution_ = 1; + break; + } + case IS_SQL_EXECUTION: { + in_plsql_execution_ = di->get_ash_stat().in_plsql_execution_; + di->get_ash_stat().in_plsql_execution_ = 0; + break; + } + default: { + // do nothing + } + } + } +} + +ObPLASHGuard::ObPLASHGuard(int64_t package_id, int64_t routine_id) + : plsql_current_subprogram_name_("\0"), + in_plsql_compilation_(false), + in_plsql_execution_(false), + plsql_entry_object_id_(0), + plsql_entry_subprogram_id_(0), + plsql_current_object_id_(0), + plsql_current_subprogram_id_(0), + set_entry_info_(0), + set_entry_name_(0), + set_current_name_(0), + pl_ash_status_(ObPLASHStatus::INVALID_ASH_STATUS) +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + in_plsql_execution_ = di->get_ash_stat().in_plsql_execution_; + di->get_ash_stat().in_plsql_execution_ = 1; + pl_ash_status_ = INVALID_ASH_STATUS; + + if (di->get_ash_stat().plsql_entry_object_id_ == OB_INVALID_ID) { + set_entry_info_ = true; + di->get_ash_stat().plsql_entry_object_id_ = + OB_INVALID_ID == package_id ? routine_id : package_id; + di->get_ash_stat().plsql_entry_subprogram_id_ = + OB_INVALID_ID == package_id ? OB_INVALID_ID : routine_id; + } else { + plsql_current_object_id_ = di->get_ash_stat().plsql_object_id_; + plsql_current_subprogram_id_ = di->get_ash_stat().plsql_subprogram_id_; + MEMCPY(plsql_current_subprogram_name_, + di->get_ash_stat().plsql_subprogram_name_, + common::OB_MAX_ASH_PL_NAME_LENGTH); + di->get_ash_stat().plsql_object_id_ = + OB_INVALID_ID == package_id ? routine_id : package_id; + di->get_ash_stat().plsql_subprogram_id_ = + OB_INVALID_ID == package_id ? OB_INVALID_ID : routine_id; + } + } +} + +ObPLASHGuard::ObPLASHGuard(int64_t package_id, int64_t routine_id, const ObString &routine_name) + : plsql_current_subprogram_name_("\0"), + in_plsql_compilation_(false), + in_plsql_execution_(false), + plsql_entry_object_id_(0), + plsql_entry_subprogram_id_(0), + plsql_current_object_id_(0), + plsql_current_subprogram_id_(0), + set_entry_info_(0), + set_entry_name_(0), + set_current_name_(0), + pl_ash_status_(ObPLASHStatus::INVALID_ASH_STATUS) +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + // set sub name + if (di->get_ash_stat().plsql_entry_object_id_ == package_id && + di->get_ash_stat().plsql_entry_subprogram_id_ == routine_id) { + set_entry_name_ = true; + int64_t size = routine_name.length() > common::OB_MAX_ASH_PL_NAME_LENGTH + ? common::OB_MAX_ASH_PL_NAME_LENGTH + : routine_name.length(); + MEMCPY( + di->get_ash_stat().plsql_entry_subprogram_name_, routine_name.ptr(), size); + di->get_ash_stat().plsql_entry_subprogram_name_[size] = '\0'; + } else if (di->get_ash_stat().plsql_object_id_ == package_id && + di->get_ash_stat().plsql_subprogram_id_ == routine_id) { + set_current_name_ = true; + MEMCPY(plsql_current_subprogram_name_, + di->get_ash_stat().plsql_subprogram_name_, + common::OB_MAX_ASH_PL_NAME_LENGTH); + if (OB_INVALID_ID != package_id) { + int64_t size = routine_name.length() > common::OB_MAX_ASH_PL_NAME_LENGTH + ? common::OB_MAX_ASH_PL_NAME_LENGTH + : routine_name.length(); + MEMCPY(di->get_ash_stat().plsql_subprogram_name_, routine_name.ptr(), size); + di->get_ash_stat().plsql_subprogram_name_[size] = '\0'; + } + } + } +} + +ObPLASHGuard::~ObPLASHGuard() +{ + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + if (set_entry_name_) { + di->get_ash_stat().plsql_entry_subprogram_name_[0] = '\0'; + } else if (set_current_name_) { + MEMCPY(di->get_ash_stat().plsql_subprogram_name_, + plsql_current_subprogram_name_, common::OB_MAX_ASH_PL_NAME_LENGTH); + } else if (set_entry_info_) { + di->get_ash_stat().plsql_entry_object_id_ = -1; + di->get_ash_stat().plsql_entry_subprogram_id_ = -1; + di->get_ash_stat().plsql_object_id_ = -1; + di->get_ash_stat().plsql_subprogram_id_ = -1; + di->get_ash_stat().top_level_sql_id_[0] = '\0'; + di->get_ash_stat().in_plsql_execution_ = in_plsql_execution_; + } else if (INVALID_ASH_STATUS == pl_ash_status_) { + di->get_ash_stat().plsql_object_id_ = plsql_current_object_id_; + di->get_ash_stat().plsql_subprogram_id_ = plsql_current_subprogram_id_; + di->get_ash_stat().in_plsql_execution_ = in_plsql_execution_; + } else { + switch (pl_ash_status_) { + case IS_PLSQL_COMPILATION: { + di->get_ash_stat().in_plsql_compilation_ = in_plsql_compilation_; + break; + } + case IS_PLSQL_EXECUTION: { + di->get_ash_stat().in_plsql_execution_ = in_plsql_execution_; + break; + } + case IS_SQL_EXECUTION: { + di->get_ash_stat().in_plsql_execution_ = in_plsql_execution_; + break; + } + default: { + // do nothing + } + } + } + } +} + } // namespace pl } diff --git a/src/pl/ob_pl.h b/src/pl/ob_pl.h index 69ac6b36bc..b49d558ace 100644 --- a/src/pl/ob_pl.h +++ b/src/pl/ob_pl.h @@ -1281,6 +1281,33 @@ private: sql::ObExecContext &exec_ctx_; ObPLContext *parent_stack_; }; + +class ObPLASHGuard +{ +public: + enum ObPLASHStatus { + INVALID_ASH_STATUS, + IS_PLSQL_COMPILATION, + IS_PLSQL_EXECUTION, + IS_SQL_EXECUTION, + }; + ObPLASHGuard(ObPLASHStatus status); + ObPLASHGuard(int64_t package_id, int64_t routine_id); + ObPLASHGuard(int64_t package_id, int64_t routine_id, const ObString &routine_name); + ~ObPLASHGuard(); +private: + char plsql_current_subprogram_name_[common::OB_MAX_ASH_PL_NAME_LENGTH + 1]; + bool in_plsql_compilation_; + bool in_plsql_execution_; + int64_t plsql_entry_object_id_; + int64_t plsql_entry_subprogram_id_; + int64_t plsql_current_object_id_; + int64_t plsql_current_subprogram_id_; + bool set_entry_info_; + bool set_entry_name_; + bool set_current_name_; + ObPLASHStatus pl_ash_status_; +}; } } #endif /* OCEANBASE_SRC_PL_OB_PL_H_ */ diff --git a/src/pl/ob_pl_compile.cpp b/src/pl/ob_pl_compile.cpp index ac413ac8ba..4a50add36c 100644 --- a/src/pl/ob_pl_compile.cpp +++ b/src/pl/ob_pl_compile.cpp @@ -188,6 +188,7 @@ int ObPLCompiler::compile( FLTSpanGuard(pl_compile); int64_t compile_start = ObTimeUtility::current_time(); uint64_t block_hash = OB_INVALID_ID; + ObPLASHGuard plash_guard(ObPLASHGuard::ObPLASHStatus::IS_PLSQL_COMPILATION); //Step 1:构造匿名块的ObPLFunctionAST HEAP_VAR(ObPLFunctionAST, func_ast, allocator_) { @@ -343,6 +344,7 @@ int ObPLCompiler::compile(const uint64_t id, ObPLFunction &func) { int ret = OB_SUCCESS; + ObPLASHGuard plash_guard(ObPLASHGuard::ObPLASHStatus::IS_PLSQL_COMPILATION); HEAP_VAR(ObPLFunctionAST, func_ast, allocator_) { const share::schema::ObRoutineInfo *routine = NULL; OZ (schema_guard_.get_routine_info(get_tenant_id_by_object_id(id), id, routine)); @@ -838,7 +840,7 @@ int ObPLCompiler::compile_package(const ObPackageInfo &package_info, int64_t compile_start = ObTimeUtility::current_time(); ObPLCompilerEnvGuard guard(package_info, session_info_, schema_guard_, ret, parent_ns); - + ObPLASHGuard plash_guard(ObPLASHGuard::ObPLASHStatus::IS_PLSQL_COMPILATION); session_info_.set_for_trigger_package(package_info.is_for_trigger()); if (OB_NOT_NULL(parent_ns)) { if (parent_ns->get_compile_flag().compile_with_invoker_right()) { diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index 4664b771c2..33c75720f2 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -161,6 +161,7 @@ public: static const char *ANONYMOUS_ARG; static const char *ANONYMOUS_SQL_ARG; static const char *ANONYMOUS_INOUT_ARG; + static const uint64_t ANONYMOUS_VIRTUAL_OBJECT_ID = 1; public: class HandlerAnalyzer diff --git a/src/pl/sys_package/ob_dbms_workload_repository.cpp b/src/pl/sys_package/ob_dbms_workload_repository.cpp index 5829d6232d..202316d2d5 100644 --- a/src/pl/sys_package/ob_dbms_workload_repository.cpp +++ b/src/pl/sys_package/ob_dbms_workload_repository.cpp @@ -25,6 +25,9 @@ #include #include "share/ob_lob_access_utils.h" #include "lib/timezone/ob_time_convert.h" +#include "sql/resolver/ob_resolver_utils.h" +#include "share/ob_version.h" +#include namespace oceanbase { @@ -32,6 +35,7 @@ using namespace common; using namespace share; using namespace obrpc; using namespace share::schema; +using namespace common::sqlclient; class ObSrvNetworkFrame; namespace pl { @@ -86,7 +90,6 @@ int ObDbmsWorkloadRepository::create_snapshot( user_submit_snap_arg, user_submit_snapshot_resp))) { if (OB_NEED_RETRY == ret) { ob_usleep(SLEEP_INTERVAL_US); - continue; } else { LOG_WARN("failed to send sync snapshot task", KR(ret), K(OB_SYS_TENANT_ID), K(user_submit_snapshot_resp)); @@ -108,7 +111,6 @@ int ObDbmsWorkloadRepository::create_snapshot( LOG_WARN("failed to check all tenants' last snapshot status", K(ret), K(is_all_finished)); } else if (!is_all_finished) { ob_usleep(SLEEP_INTERVAL_US); - continue; } } if (OB_SUCC(ret)) { @@ -148,7 +150,7 @@ int ObDbmsWorkloadRepository::check_snapshot_task_success_for_snap_id( SMART_VAR(ObISQLClient::ReadResult, res) { ObMySQLResult *result = nullptr; - if (OB_FAIL(sql.assign_fmt("SELECT count(*) as cnt FROM %s where " + if (OB_FAIL(sql.assign_fmt("SELECT COUNT(*) AS CNT FROM %s where " "cluster_id=%ld and snap_id=%ld and status!=%ld", OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, cluster_id, snap_id, ObWrSnapshotStatus::SUCCESS))) { LOG_WARN("failed to format sql", KR(ret)); @@ -161,7 +163,7 @@ int ObDbmsWorkloadRepository::check_snapshot_task_success_for_snap_id( LOG_WARN("failed read __wr_snapshot records",K(snap_id), K(cluster_id)); } else { int64_t cnt = 0; - EXTRACT_INT_FIELD_MYSQL(*result, "cnt", cnt, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "CNT", cnt, int64_t); if (OB_SUCC(ret)) { if (cnt > 0) { is_all_success = false; @@ -252,7 +254,6 @@ int ObDbmsWorkloadRepository::drop_snapshot_range( LOG_WARN("failed to check drop task state ", K(low_snap_id), K(high_snap_id), K(is_all_finished)); } else if (!is_all_finished) { ob_usleep(SLEEP_INTERVAL_US); - continue; } } } @@ -274,9 +275,9 @@ int ObDbmsWorkloadRepository::check_drop_task_success_for_snap_id_range( SMART_VAR(ObISQLClient::ReadResult, res) { ObMySQLResult *result = nullptr; - if (OB_FAIL(sql.assign_fmt("SELECT count(*) as cnt FROM %s where " - "cluster_id=%ld and snap_id between %ld and %ld and status=%ld", - OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, cluster_id, low_snap_id, high_snap_id, ObWrSnapshotStatus::DELETED))) { + if (OB_FAIL(sql.assign_fmt("SELECT COUNT(*) AS CNT FROM %s where " + "cluster_id=%ld and snap_id between %ld and %ld and (status=%ld or status=%ld)", + OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, cluster_id, low_snap_id, high_snap_id, ObWrSnapshotStatus::DELETED, ObWrSnapshotStatus::SUCCESS))) { LOG_WARN("failed to format sql", KR(ret)); } else if (OB_FAIL(GCTX.sql_proxy_->read(res, OB_SYS_TENANT_ID, sql.ptr()))) { LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); @@ -326,7 +327,7 @@ int ObDbmsWorkloadRepository::modify_snapshot_settings( ret = OB_NOT_SUPPORTED; LOG_WARN("tenant data version is too low for wr", K(ctx.exec_ctx_->get_my_session()->get_effective_tenant_id()), K(data_version)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than 4.2.1, workload repository not supported"); - } else if (OB_UNLIKELY(2 != params.count())) { + } else if (OB_UNLIKELY(3 != params.count())) { ret = OB_INVALID_ARGUMENT_NUM; LOG_WARN("parameters number is wrong", K(ret), K(params.count())); } else if (OB_FAIL(GCTX.location_service_->get_leader( @@ -368,9 +369,24 @@ int ObDbmsWorkloadRepository::modify_snapshot_settings( } } + int64_t topnsql = 0; + if (OB_SUCC(ret)) { + if (params.at(2).is_null()) { + topnsql = -1; // null + } else { + topnsql = params.at(2).get_int(); + if (topnsql < 30 || topnsql > 50000) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid value range, topnsql needs to be between 30 and 50000.", K(ret)); + LOG_USER_ERROR(OB_INVALID_ARGUMENT, + "Invalid value range, topnsql needs to be between 30 and 50000."); + } + } + } + if (OB_SUCC(ret)) { ObWrUserModifySettingsArg wr_user_modify_settings_arg( - ctx.exec_ctx_->get_my_session()->get_effective_tenant_id(), retention, interval); + ctx.exec_ctx_->get_my_session()->get_effective_tenant_id(), retention, interval, topnsql); if (OB_FAIL(wr_proxy.to(leader) .by(OB_SYS_TENANT_ID) .group_id(share::OBCG_WR) @@ -387,39 +403,26 @@ int ObDbmsWorkloadRepository::generate_ash_report_text( ObPLExecCtx &ctx, sql::ParamStore ¶ms, common::ObObj &result) { int ret = OB_SUCCESS; - AshReportParams ash_report_params; + AshReportParams ash_report_params(ctx.exec_ctx_->get_my_session()->get_timezone_info()); uint64_t data_version = OB_INVALID_VERSION; ObStringBuffer buff(&ctx.exec_ctx_->get_allocator()); - if (OB_UNLIKELY(5 != params.count())) { - ret = OB_INVALID_ARGUMENT_NUM; - LOG_WARN("parameters number is wrong", K(ret), K(params.count())); - } else if (params.at(0).is_null()) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("first parameters is null", K(ret), K(params.at(0))); - } else if (params.at(1).is_null()) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("second parameters is null", K(ret), K(params.at(1))); - } else if (OB_FAIL(GET_MIN_DATA_VERSION(ctx.exec_ctx_->get_my_session()->get_effective_tenant_id(), data_version))) { + if (OB_FAIL(GET_MIN_DATA_VERSION(ctx.exec_ctx_->get_my_session()->get_effective_tenant_id(), data_version))) { LOG_WARN("get min data_version failed", KR(ret), K(ctx.exec_ctx_->get_my_session()->get_effective_tenant_id())); } else if (data_version < DATA_VERSION_4_2_1_0) { ret = OB_NOT_SUPPORTED; LOG_WARN("tenant data version is too low for wr", K(ctx.exec_ctx_->get_my_session()->get_effective_tenant_id()), K(data_version)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than 4.2.1, workload repository not supported"); - } else if (OB_FAIL(params.at(2).get_string(ash_report_params.sql_id))) { - LOG_WARN("failed to get sql id from params", K(ret), K(params.at(2))); - } else if (OB_FAIL(params.at(3).get_string(ash_report_params.trace_id))) { - LOG_WARN("failed to get trace id from params", K(ret), K(params.at(3))); - } else if (OB_FAIL(params.at(4).get_string(ash_report_params.wait_class))) { - LOG_WARN("failed to get wait class from params", K(ret), K(params.at(4))); - } else if (OB_FAIL(buff.append("\n# ASH Report\n\n"))) { // print header - LOG_WARN("failed to append string into buff", K(ret)); + } else if (OB_FAIL(process_ash_report_params(data_version, params, ash_report_params))) { + LOG_WARN("failed to process ash report params", K(ret), K(data_version), K(params)); } else { - ash_report_params.ash_begin_time = params.at(0).get_datetime(); - ash_report_params.ash_end_time = params.at(1).get_datetime(); // calc ASH_BEGIN_TIME and ASH_END_TIME int64_t ash_begin_time = 0; int64_t ash_end_time = 0; + if (OB_FAIL(print_ash_report_header(ash_report_params, buff))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + if (OB_SUCC(ret)) { if (OB_FAIL(get_ash_begin_and_end_time(ash_report_params, ash_begin_time, ash_end_time))) { LOG_WARN("failed to get ash begin time and end time", K(ret)); @@ -443,8 +446,8 @@ int ObDbmsWorkloadRepository::generate_ash_report_text( (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000LL; bool no_data = false; // if no data, will just print ash summary info if (OB_SUCC(ret)) { - if (OB_FAIL(print_ash_summary_info(ash_report_params, params.at(0).get_datetime(), - params.at(1).get_datetime(), dur_elapsed_time, num_samples, num_events, buff, + if (OB_FAIL(print_ash_summary_info(ash_report_params, ash_report_params.user_input_ash_begin_time, + ash_report_params.user_input_ash_end_time, dur_elapsed_time, num_samples, num_events, buff, no_data))) { LOG_WARN("failed to print ash summary info", K(ret)); } @@ -452,37 +455,58 @@ int ObDbmsWorkloadRepository::generate_ash_report_text( // print other infos if (OB_SUCC(ret) && !no_data) { - if (OB_FAIL( - print_ash_top_user_event_info(ash_report_params, num_samples, num_events, buff))) { - LOG_WARN("failed to print ash top user event info", K(ret)); - } else if (OB_FAIL(print_ash_top_events_and_value( + if (OB_FAIL(print_ash_top_active_tenants( ash_report_params, num_samples, num_events, buff))) { - LOG_WARN("failed to print ash top event and p1/p2/p3 value", K(ret)); - } else if (OB_FAIL(print_ash_top_exec_phase( - ash_report_params, num_samples, dur_elapsed_time, buff))) { - LOG_WARN("failed to print ash top phase of execution", K(ret)); - } else if (OB_FAIL(print_ash_top_sql_with_event(ash_report_params, num_events, buff))) { - LOG_WARN("failed to print ash top sql event info", K(ret)); - } else if (OB_FAIL( - print_ash_top_sql_with_blocking_event(ash_report_params, num_events, buff))) { - LOG_WARN("failed to print ash top sql with blocking event info", K(ret)); - } else if (OB_FAIL(print_ash_sql_text_list(ash_report_params, buff))) { - LOG_WARN("failed to print ash sql text list", K(ret)); - } else if (OB_FAIL(print_ash_top_session_info( - ash_report_params, num_samples, num_events, dur_elapsed_time, buff))) { - LOG_WARN("failed to print ash top session info", K(ret)); - } else if (OB_FAIL(print_ash_top_blocking_session_info( - ash_report_params, num_samples, num_events, dur_elapsed_time, buff))) { - LOG_WARN("failed to print ash top blocking session info", K(ret)); - } else if (OB_FAIL(print_ash_top_latches_info(ash_report_params, num_samples, buff))) { - LOG_WARN("failed to print ash sql top latches info", K(ret)); - } else if (OB_FAIL(print_ash_node_load(ash_report_params, buff))) { - LOG_WARN("failed to print ash node load", K(ret)); + LOG_WARN("failed to print ash top active tenants", K(ret)); + } else if (OB_FAIL(print_ash_top_node_load( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_top_group( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_foreground_db_time( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_background_db_time( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_top_sessions( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_blocking_session( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top blocking session", K(ret)); + } else if (OB_FAIL(print_ash_top_latches( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_activity_over_time( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_top_execution_phase( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_sql_command_type( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_sql_with_top_wait_events( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_sql_with_top_operator( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_plsql( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_top_sql_text( + ash_report_params, num_samples, num_events, buff))) { + LOG_WARN("failed to print ash top node load", K(ret)); + } else if (OB_FAIL(print_ash_report_end(ash_report_params, buff))) { + LOG_WARN("failed to ash report end", K(ret)); } } if (OB_SUCC(ret)) { - ObTextStringResult text_res(ObTextType, true, &ctx.exec_ctx_->get_allocator()); + ObTextStringResult text_res(lib::is_oracle_mode()? ObLongTextType : ObTextType, true, &ctx.exec_ctx_->get_allocator()); if (FALSE_IT( result.set_collation_type(ctx.exec_ctx_->get_my_session()->get_nls_collation()))) { } else if (OB_FAIL(text_res.init(buff.length()))) { @@ -492,7 +516,7 @@ int ObDbmsWorkloadRepository::generate_ash_report_text( } else { ObString lob_str; text_res.get_result_buffer(lob_str); - OX(result.set_lob_value(ObTextType, lob_str.ptr(), lob_str.length())); + OX(result.set_lob_value(lib::is_oracle_mode()? ObLongTextType : ObTextType, lob_str.ptr(), lob_str.length())); OX(result.set_has_lob_header()); } } @@ -545,44 +569,306 @@ int ObDbmsWorkloadRepository::format_row(const int64_t column_size, const char * return ret; } -int ObDbmsWorkloadRepository::usec_to_string( +int ObDbmsWorkloadRepository::usec_to_string(const common::ObTimeZoneInfo *tz_info, const int64_t usec, char *buf, int64_t buf_len, int64_t &pos) { int ret = OB_SUCCESS; ObTime time; - if (OB_FAIL(ObTimeConverter::usec_to_ob_time(usec, time))) { + if (OB_FAIL(ObTimeConverter::datetime_to_ob_time(usec, tz_info, time))) { LOG_WARN("failed to usec to ob time", K(ret), K(usec)); - } else if (OB_FAIL(ObTimeConverter::ob_time_to_str( - time, DT_TYPE_DATETIME, 0 /*scale*/, buf, buf_len, pos, true /*with_delim*/))) { + } else if (OB_FAIL(ObTimeConverter::ob_time_to_str(time, + lib::is_oracle_mode() ? DT_TYPE_ORACLE_TIMESTAMP : DT_TYPE_DATETIME, 0 /*scale*/, + buf, buf_len, pos, true /*with_delim*/))) { LOG_WARN("fail to change time to string", K(ret), K(time), K(pos)); } return ret; } -const char *NULL_CHAR = ""; -const int NULL_CHAR_LENGTH = 0; -const char *FILTER_EVENT_STR = - "1"; -const char *ASH_VIEW_SQL = - "SELECT * FROM ( SELECT a.sample_id, a.sample_time, a.svr_ip, " - " a.svr_port, a.con_id, a.user_id, a.session_id, a.session_type, a.session_state, " - "a.sql_id, a.plan_id," - " a.trace_id, IF(a.event='' OR a.event is NULL, 'CPU + Wait for CPU', a.event) as event, " - "nvl(a.event_no, 1) " - " as event_no, a.p1, a.p1text, a.p2, a.p2text, a.p3, a.p3text, " - " IF(a.wait_class = '' OR a.wait_class is NULL, 'CPU', a.wait_class) as wait_class, " - " nvl(a.wait_class_id, 9999) as wait_class_id, a.time_waited, a.sql_plan_line_id, " - "a.in_parse, " - " a.in_pl_parse, a.in_plan_cache, a.in_sql_optimize, a.in_sql_execution, " - "a.in_px_execution, a.in_sequence_load, a.in_committing, a.in_storage_read, " - "a.in_storage_write, a.in_remote_das_execution, a.module, a.action, a.client_id FROM GV$ACTIVE_SESSION_HISTORY a " - " WHERE 1=1 and a.sample_time between '%.*s' and '%.*s' " - ") unified_ash WHERE sample_time between '%.*s' and '%.*s' " - " AND ('%.*s' = '' OR sql_id like '%.*s') " - " AND ('%.*s' = '' OR trace_id like '%.*s') " - " AND ('%.*s' = '' OR wait_class like '%.*s') " - " AND ('%.*s' = '' OR module like '%.*s') " - " AND ('%.*s' = '' OR action like '%.*s') " - " AND ('%.*s' = '' OR client_id like '%.*s')"; + +const char *mysql_table = " FROM oceanbase.GV$ACTIVE_SESSION_HISTORY ASH"; + +const char *oracle_table = " FROM SYS.GV$ACTIVE_SESSION_HISTORY ASH"; + +const char *ASH_VIEW_SQL_425 = +"SELECT" +" ASH.SVR_IP AS SVR_IP," +" ASH.SVR_PORT AS SVR_PORT," +" ASH.SAMPLE_TIME AS SAMPLE_TIME," +" ASH.CON_ID AS TENANT_ID," +" ASH.USER_ID AS USER_ID," +" ASH.SESSION_ID AS SESSION_ID," +" ASH.SESSION_TYPE AS SESSION_TYPE," +" ASH.SQL_ID AS SQL_ID," +" ASH.PLAN_ID AS PLAN_ID," +" ASH.TRACE_ID AS TRACE_ID," +" ASH.EVENT AS EVENT," +" ASH.EVENT_NO AS EVENT_NO," +" ASH.EVENT_ID AS EVENT_ID," +" ASH.P1 AS P1," +" ASH.P1TEXT AS P1TEXT," +" ASH.P2 AS P2," +" ASH.P2TEXT AS P2TEXT," +" ASH.P3 AS P3," +" ASH.P3TEXT AS P3TEXT," +" ASH.WAIT_CLASS AS WAIT_CLASS," +" ASH.WAIT_CLASS_ID AS WAIT_CLASS_ID," +" ASH.TIME_WAITED AS TIME_WAITED," +" ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID," +" ASH.GROUP_ID AS GROUP_ID," +" ASH.PLAN_HASH AS PLAN_HASH," +" ASH.THREAD_ID AS THREAD_ID," +" ASH.STMT_TYPE AS STMT_TYPE," +" ASH.PROGRAM AS PROGRAM," +" ASH.MODULE AS MODULE," +" ASH.ACTION AS ACTION," +" ASH.CLIENT_ID AS CLIENT_ID," +" ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID," +" ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME," +" ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID," +" ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID," +" ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME," +" ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID," +" ASH.TABLET_ID AS TABLET_ID," +" ASH.TIME_MODEL AS TIME_MODEL," +" ASH.TM_DELTA_TIME AS TM_DELTA_TIME, " +" ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, " +" ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, " +" ASH.PROXY_SID AS PROXY_SID" +" %s" +" WHERE sample_time between '%.*s' and '%.*s'"; + +const char *ASH_VIEW_SQL_424 = +"SELECT" +" ASH.SVR_IP AS SVR_IP," +" ASH.SVR_PORT AS SVR_PORT," +" ASH.SAMPLE_TIME AS SAMPLE_TIME," +" ASH.CON_ID AS TENANT_ID," +" ASH.USER_ID AS USER_ID," +" ASH.SESSION_ID AS SESSION_ID," +" ASH.SESSION_TYPE AS SESSION_TYPE," +" ASH.SQL_ID AS SQL_ID," +" ASH.PLAN_ID AS PLAN_ID," +" ASH.TRACE_ID AS TRACE_ID," +" ASH.EVENT AS EVENT," +" ASH.EVENT_NO AS EVENT_NO," +" ASH.EVENT_ID AS EVENT_ID," +" ASH.P1 AS P1," +" ASH.P1TEXT AS P1TEXT," +" ASH.P2 AS P2," +" ASH.P2TEXT AS P2TEXT," +" ASH.P3 AS P3," +" ASH.P3TEXT AS P3TEXT," +" ASH.WAIT_CLASS AS WAIT_CLASS," +" ASH.WAIT_CLASS_ID AS WAIT_CLASS_ID," +" ASH.TIME_WAITED AS TIME_WAITED," +" ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID," +" ASH.GROUP_ID AS GROUP_ID," +" ASH.PLAN_HASH AS PLAN_HASH," +" ASH.THREAD_ID AS THREAD_ID," +" ASH.STMT_TYPE AS STMT_TYPE," +" ASH.PROGRAM AS PROGRAM," +" ASH.MODULE AS MODULE," +" ASH.ACTION AS ACTION," +" ASH.CLIENT_ID AS CLIENT_ID," +" ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID," +" ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME," +" ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID," +" ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID," +" ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME," +" ASH.TIME_MODEL AS TIME_MODEL" +" %s" +" WHERE sample_time between '%.*s' and '%.*s'"; + +const char *ASH_VIEW_SQL_423 = +"SELECT" +" ASH.SVR_IP AS SVR_IP," +" ASH.SVR_PORT AS SVR_PORT," +" ASH.SAMPLE_TIME AS SAMPLE_TIME," +" ASH.CON_ID AS TENANT_ID," +" ASH.USER_ID AS USER_ID," +" ASH.SESSION_ID AS SESSION_ID," +" ASH.SESSION_TYPE AS SESSION_TYPE," +" ASH.SQL_ID AS SQL_ID," +" ASH.PLAN_ID AS PLAN_ID," +" ASH.TRACE_ID AS TRACE_ID," +" ASH.EVENT AS EVENT," +" ASH.EVENT_NO AS EVENT_NO," +" ASH.EVENT_ID AS EVENT_ID," +" ASH.P1 AS P1," +" ASH.P1TEXT AS P1TEXT," +" ASH.P2 AS P2," +" ASH.P2TEXT AS P2TEXT," +" ASH.P3 AS P3," +" ASH.P3TEXT AS P3TEXT," +" ASH.WAIT_CLASS AS WAIT_CLASS," +" ASH.WAIT_CLASS_ID AS WAIT_CLASS_ID," +" ASH.TIME_WAITED AS TIME_WAITED," +" ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID," +" ASH.GROUP_ID AS GROUP_ID," +" NULL AS PLAN_HASH," +" NULL AS THREAD_ID," +" NULL AS STMT_TYPE," +" ASH.PROGRAM AS PROGRAM," +" ASH.MODULE AS MODULE," +" ASH.ACTION AS ACTION," +" ASH.CLIENT_ID AS CLIENT_ID," +" ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID," +" ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME," +" ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID," +" ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID," +" ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME," +" 0 AS TIME_MODEL" +" %s" +" WHERE sample_time between '%.*s' and '%.*s'"; + +const char *ASH_VIEW_SQL_422 = +"SELECT" +" ASH.SVR_IP AS SVR_IP," +" ASH.SVR_PORT AS SVR_PORT," +" ASH.SAMPLE_TIME AS SAMPLE_TIME," +" ASH.CON_ID AS TENANT_ID," +" ASH.USER_ID AS USER_ID," +" ASH.SESSION_ID AS SESSION_ID," +" ASH.SESSION_TYPE AS SESSION_TYPE," +" ASH.SQL_ID AS SQL_ID," +" ASH.PLAN_ID AS PLAN_ID," +" ASH.TRACE_ID AS TRACE_ID," +" ASH.EVENT AS EVENT," +" ASH.EVENT_NO AS EVENT_NO," +" ASH.EVENT_ID AS EVENT_ID," +" ASH.P1 AS P1," +" ASH.P1TEXT AS P1TEXT," +" ASH.P2 AS P2," +" ASH.P2TEXT AS P2TEXT," +" ASH.P3 AS P3," +" ASH.P3TEXT AS P3TEXT," +" ASH.WAIT_CLASS AS WAIT_CLASS," +" ASH.WAIT_CLASS_ID AS WAIT_CLASS_ID," +" ASH.TIME_WAITED AS TIME_WAITED," +" ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID," +" NULL AS GROUP_ID," +" NULL AS PLAN_HASH," +" NULL AS THREAD_ID," +" NULL AS STMT_TYPE," +" ASH.PROGRAM AS PROGRAM," +" ASH.MODULE AS MODULE," +" ASH.ACTION AS ACTION," +" ASH.CLIENT_ID AS CLIENT_ID," +" ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID," +" ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID," +" ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME," +" ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID," +" ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID," +" ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME," +" 0 AS TIME_MODEL" +" %s" +" WHERE sample_time between '%.*s' and '%.*s'"; + +const char *ASH_VIEW_SQL_421 = +"SELECT" +" ASH.SVR_IP AS SVR_IP," +" ASH.SVR_PORT AS SVR_PORT," +" ASH.SAMPLE_TIME AS SAMPLE_TIME," +" ASH.CON_ID AS TENANT_ID," +" ASH.USER_ID AS USER_ID," +" ASH.SESSION_ID AS SESSION_ID," +" ASH.SESSION_TYPE AS SESSION_TYPE," +" ASH.SQL_ID AS SQL_ID," +" ASH.PLAN_ID AS PLAN_ID," +" ASH.TRACE_ID AS TRACE_ID," +" ASH.EVENT AS EVENT," +" ASH.EVENT_NO AS EVENT_NO," +" 0 AS EVENT_ID," +" ASH.P1 AS P1," +" ASH.P1TEXT AS P1TEXT," +" ASH.P2 AS P2," +" ASH.P2TEXT AS P2TEXT," +" ASH.P3 AS P3," +" ASH.P3TEXT AS P3TEXT," +" ASH.WAIT_CLASS AS WAIT_CLASS," +" ASH.WAIT_CLASS_ID AS WAIT_CLASS_ID," +" ASH.TIME_WAITED AS TIME_WAITED," +" ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID," +" NULL AS GROUP_ID," +" NULL AS PLAN_HASH," +" NULL AS THREAD_ID," +" NULL AS STMT_TYPE," +" '' AS PROGRAM," +" ASH.MODULE AS MODULE," +" ASH.ACTION AS ACTION," +" ASH.CLIENT_ID AS CLIENT_ID," +" NULL AS TOP_LEVEL_SQL_ID," +" NULL AS PLSQL_ENTRY_OBJECT_ID," +" NULL AS PLSQL_ENTRY_SUBPROGRAM_ID," +" NULL AS PLSQL_ENTRY_SUBPROGRAM_NAME," +" NULL AS PLSQL_OBJECT_ID," +" NULL AS PLSQL_SUBPROGRAM_ID," +" NULL AS PLSQL_SUBPROGRAM_NAME," +" 0 AS TIME_MODEL" +" %s" +" WHERE sample_time between '%.*s' and '%.*s'"; + +#define EXTRACT_INT_FIELD_FOR_ASH(result, column_name, field, type) \ + if (OB_SUCC(ret)) { \ + ObObjMeta _col_type; \ + if (OB_FAIL((result).get_type(column_name, _col_type))) { \ + LOG_WARN("get column type from result failed", K(ret), K(column_name)); \ + } else if (_col_type.is_number() || _col_type.is_decimal_int()) { \ + EXTRACT_INT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field , type); \ + } else { \ + EXTRACT_INT_FIELD_MYSQL_SKIP_RET(result, column_name, field, type); \ + } \ + } + +#define EXTRACT_INT_FIELD_FOR_ASH_STR(result, column_name, field, type) \ + type field = 0; \ + char field##_char[64] = ""; \ + if (OB_SUCC(ret)) { \ + ObObjMeta col_type; \ + if (OB_FAIL((result).get_type(column_name, col_type))) { \ + LOG_WARN("get column type from result failed", K(ret), K(column_name)); \ + } else if (col_type.is_number() || col_type.is_decimal_int()) { \ + EXTRACT_INT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field, type); \ + } else { \ + EXTRACT_INT_FIELD_MYSQL_SKIP_RET(result, column_name, field, type); \ + } \ + sprintf(field##_char, "%ld", field); \ + } + +#define EXTRACT_UINT_FIELD_FOR_ASH(result, column_name, field, type) \ + if (OB_SUCC(ret)) { \ + ObObjMeta _col_type; \ + if (OB_FAIL((result).get_type(column_name, _col_type))) { \ + LOG_WARN("get column type from result failed", K(ret), K(column_name)); \ + } else if (_col_type.is_unumber() || _col_type.is_number() || _col_type.is_decimal_int()) { \ + EXTRACT_UINT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field , type); \ + } else { \ + EXTRACT_UINT_FIELD_MYSQL_SKIP_RET(result, column_name, field, type); \ + } \ + } + +#define EXTRACT_UINT_FIELD_FOR_ASH_STR(result, column_name, field, type) \ + type field = 0; \ + char field##_char[64] = ""; \ + if (OB_SUCC(ret)) { \ + ObObjMeta col_type; \ + if (OB_FAIL((result).get_type(column_name, col_type))) { \ + LOG_WARN("get column type from result failed", K(ret), K(column_name)); \ + } else if (col_type.is_unumber() || col_type.is_number() || col_type.is_decimal_int()) { \ + EXTRACT_UINT_FIELD_FROM_NUMBER_SKIP_RET(result, column_name, field, type); \ + } else { \ + EXTRACT_UINT_FIELD_MYSQL_SKIP_RET(result, column_name, field, type); \ + } \ + sprintf(field##_char, "%lu", field); \ + } + +#define ASH_FIELD_CHAR(field) field##_char int ObDbmsWorkloadRepository::append_fmt_ash_view_sql( const AshReportParams &ash_report_params, ObSqlString &sql_string) @@ -592,26 +878,227 @@ int ObDbmsWorkloadRepository::append_fmt_ash_view_sql( int64_t time_buf_pos = 0; char ash_begin_time_buf[time_buf_len]; char ash_end_time_buf[time_buf_len]; - if (OB_FAIL(usec_to_string( - ash_report_params.ash_begin_time, ash_begin_time_buf, time_buf_len, time_buf_pos))) { + char port_buf[time_buf_len]; + uint64_t data_version = 0; + const char* ash_view_ptr = nullptr; + if (OB_FAIL(GET_MIN_DATA_VERSION(MTL_ID(), data_version))) { + LOG_WARN("get_min_data_version failed", K(ret), K(MTL_ID())); + } else { + if (data_version < DATA_VERSION_4_3_0_0) { + // v4.2 + if (data_version >= MOCK_DATA_VERSION_4_2_5_0) { + ash_view_ptr = ASH_VIEW_SQL_425; + } else if (data_version >= MOCK_DATA_VERSION_4_2_4_0) { + ash_view_ptr = ASH_VIEW_SQL_424; + } else if (data_version == MOCK_DATA_VERSION_4_2_3_0) { + ash_view_ptr = ASH_VIEW_SQL_423; + } else if (data_version == DATA_VERSION_4_2_2_0) { + ash_view_ptr = ASH_VIEW_SQL_422; + } else { + ash_view_ptr = ASH_VIEW_SQL_421; + } + } else { + // v4.3 + if (data_version >= DATA_VERSION_4_3_5_0) { + ash_view_ptr = ASH_VIEW_SQL_425; + } else { + ash_view_ptr = ASH_VIEW_SQL_421; + } + } + } + + if (OB_FAIL(ret)) { + } else if (OB_ISNULL(ash_view_ptr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ash view ptr is nullptr", K(ret), K(ash_view_ptr)); + } else if (OB_FAIL(usec_to_string(ash_report_params.tz_info, ash_report_params.ash_begin_time, + ash_begin_time_buf, time_buf_len, time_buf_pos))) { LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret)); } else if (FALSE_IT(time_buf_pos = 0)) { - } else if (OB_FAIL(usec_to_string( - ash_report_params.ash_end_time, ash_end_time_buf, time_buf_len, time_buf_pos))) { + } else if (OB_FAIL(usec_to_string(ash_report_params.tz_info, ash_report_params.ash_end_time, + ash_end_time_buf, time_buf_len, time_buf_pos))) { LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt(ASH_VIEW_SQL, static_cast(time_buf_pos), - ash_begin_time_buf, static_cast(time_buf_pos), ash_end_time_buf, - static_cast(time_buf_pos), ash_begin_time_buf, static_cast(time_buf_pos), - ash_end_time_buf, ash_report_params.sql_id.length(), - ash_report_params.sql_id.ptr(), ash_report_params.sql_id.length(), - ash_report_params.sql_id.ptr(), ash_report_params.trace_id.length(), - ash_report_params.trace_id.ptr(), ash_report_params.trace_id.length(), - ash_report_params.trace_id.ptr(), ash_report_params.wait_class.length(), - ash_report_params.wait_class.ptr(), ash_report_params.wait_class.length(), - ash_report_params.wait_class.ptr(), NULL_CHAR_LENGTH, NULL_CHAR, NULL_CHAR_LENGTH, - NULL_CHAR, NULL_CHAR_LENGTH, NULL_CHAR, NULL_CHAR_LENGTH, NULL_CHAR, - NULL_CHAR_LENGTH, NULL_CHAR, NULL_CHAR_LENGTH, NULL_CHAR))) { + } else if (FALSE_IT(sprintf(port_buf, "%ld", ash_report_params.port))) { + } else if (OB_FAIL(sql_string.append_fmt(ash_view_ptr, + lib::is_oracle_mode() ? oracle_table : mysql_table, static_cast(time_buf_pos), + ash_begin_time_buf, static_cast(time_buf_pos), ash_end_time_buf))) { LOG_WARN("failed to assign query string", K(ret)); + } else { + if (ash_report_params.svr_ip != "") { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.SVR_IP = '%.*s'", + ash_report_params.svr_ip.length(), ash_report_params.svr_ip.ptr()))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + if (ash_report_params.port != -1) { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.PORT = '%lu'", ash_report_params.port))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + if (ash_report_params.sql_id != "") { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.SQL_ID = '%.*s'", + ash_report_params.sql_id.length(), ash_report_params.sql_id.ptr()))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + if (ash_report_params.trace_id != "") { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.TRACE_ID = '%.*s'", + ash_report_params.trace_id.length(), ash_report_params.trace_id.ptr()))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + if (ash_report_params.wait_class != "") { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.WAIT_CLASS = '%.*s'", + ash_report_params.wait_class.length(), ash_report_params.wait_class.ptr()))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + if (ash_report_params.tenant_id > 0) { + if (OB_FAIL(sql_string.append_fmt(" AND ASH.CON_ID = '%lu'", ash_report_params.tenant_id))) { + LOG_WARN("failed to assign query string", K(ret)); + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::append_time_model_view_sql(ObSqlString &sql_string, + const char *select_lists, + const ObArrayWrap &timemodel_columns, + const ObArrayWrap &timemodel_fields, + const char *source_table, + bool with_sum) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(source_table) || strlen(source_table) <= 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("source table is nullptr", KR(ret), K(source_table)); + } else if (OB_UNLIKELY(timemodel_columns.count() != timemodel_fields.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("timemodel arguements is invalid", KR(ret), K(timemodel_columns), K(timemodel_fields)); + } else if (OB_FAIL(sql_string.append("SELECT "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (select_lists != nullptr && OB_FAIL(sql_string.append(select_lists))) { + LOG_WARN("append select lists string failed", KR(ret), K(select_lists)); + } else if (select_lists != nullptr && OB_FAIL(sql_string.append(", "))) { + LOG_WARN("append sql string failed", KR(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < timemodel_columns.count(); ++i) { + const char *timemodel_column = timemodel_columns.at(i); + int64_t timemodel_flag = (1 << timemodel_fields.at(i)); + if (i > 0 && OB_FAIL(sql_string.append(", "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (with_sum && OB_FAIL(sql_string.append("SUM("))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (lib::is_oracle_mode() && + OB_FAIL(sql_string.append_fmt("CASE WHEN BITAND(TIME_MODEL, %ld) = 0 THEN 0 ELSE 1 END", timemodel_flag))) { + LOG_WARN("append timemodel flag failed", KR(ret)); + } else if (!lib::is_oracle_mode() && + OB_FAIL(sql_string.append_fmt("CASE WHEN (time_model & %ld) = 0 THEN 0 ELSE 1 END", timemodel_flag))) { + LOG_WARN("append timemodel flag failed", KR(ret)); + } else if (with_sum && OB_FAIL(sql_string.append(")"))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (OB_FAIL(sql_string.append_fmt(" AS %s", timemodel_column))) { + LOG_WARN("append timemodel column failed", KR(ret)); + } + } + if (OB_SUCC(ret)) { + bool is_single_table = is_single_identifier(source_table); + if (is_single_table) { + if (OB_FAIL(sql_string.append_fmt(" FROM %s tmp_timemodel WHERE time_model > 0", source_table))) { + LOG_WARN("append timemodel source table failed", KR(ret)); + } + } else { + //is inner view + if (OB_FAIL(sql_string.append_fmt(" FROM (%s) tmp_timemodel WHERE time_model > 0", source_table))) { + LOG_WARN("append timemodel source table failed", KR(ret)); + } + } + } + return ret; +} + +bool ObDbmsWorkloadRepository::is_single_identifier(const char *sql_str) +{ + bool is_single = true; + bool found_space = false; + if (sql_str == NULL || *sql_str == '\0') { + is_single = false; + } + for (int i = 0; is_single && sql_str[i] != '\0'; i++) { + if (isspace((unsigned char)sql_str[i])) { + if (found_space) { + is_single = false; + } else { + found_space = true; + } + } + } + return is_single; +} + +int ObDbmsWorkloadRepository::unpivot_time_model_column_sql(ObSqlString &sql_string, + const char *select_lists, + const ObArrayWrap &timemodel_columns, + const char *source_table) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(source_table)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("source table is nullptr", KR(ret)); + } else if (OB_FAIL(sql_string.append("SELECT "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (select_lists != nullptr && OB_FAIL(sql_string.append(select_lists))) { + LOG_WARN("append select lists string failed", KR(ret), K(select_lists)); + } else if (select_lists != nullptr && OB_FAIL(sql_string.append(", "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (OB_FAIL(sql_string.append("CASE rn_ "))) { + LOG_WARN("append sql string failed", KR(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < timemodel_columns.count(); ++i) { + const char *timemodel_column = timemodel_columns.at(i); + int64_t rn = i + 1; + if (OB_FAIL(sql_string.append_fmt("WHEN %ld THEN '%s' ", rn, timemodel_column))) { + LOG_WARN("append timemodel column failed", KR(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(sql_string.append("END AS phase_name, "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (OB_FAIL(sql_string.append("CASE rn_ "))) { + LOG_WARN("append sql string failed", KR(ret)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < timemodel_columns.count(); ++i) { + const char *timemodel_column = timemodel_columns.at(i); + int64_t rn = i + 1; + if (OB_FAIL(sql_string.append_fmt("WHEN %ld THEN %s ", rn, timemodel_column))) { + LOG_WARN("append timemodel column failed", KR(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(sql_string.append("END AS phase_cnt "))) { + LOG_WARN("append sql string failed", KR(ret)); + } + } + if (OB_SUCC(ret)) { + bool is_single_table = is_single_identifier(source_table); + if (is_single_table) { + if (OB_FAIL(sql_string.append_fmt("FROM %s tmp_tm, ", source_table))) { + LOG_WARN("append timemodel source table failed", KR(ret)); + } + } else { + //is inner view + if (OB_FAIL(sql_string.append_fmt("FROM (%s) tmp_tm, ", source_table))) { + LOG_WARN("append timemodel source table failed", KR(ret)); + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(sql_string.append_fmt("(SELECT ROW_NUMBER() OVER(ORDER BY NULL) AS rn_ " + "FROM table(generator(%ld))) t_", timemodel_columns.count()))) { + LOG_WARN("append sql string failed", KR(ret)); + } } return ret; } @@ -624,7 +1111,9 @@ int ObDbmsWorkloadRepository::get_ash_begin_and_end_time( ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); const uint64_t tenant_id = MTL_ID(); HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { @@ -637,8 +1126,7 @@ int ObDbmsWorkloadRepository::get_ash_begin_and_end_time( } else if (OB_FAIL(sql_string.append(") top_event "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); @@ -652,9 +1140,21 @@ int ObDbmsWorkloadRepository::get_ash_begin_and_end_time( LOG_WARN("fail to get next row", KR(ret)); } } else { - EXTRACT_DATETIME_FIELD_MYSQL_SKIP_RET( - *result, "ASH_BEGIN_TIME", ash_begin_time, int64_t); - EXTRACT_DATETIME_FIELD_MYSQL_SKIP_RET(*result, "ASH_END_TIME", ash_end_time, int64_t); + if (OB_FAIL(result->get_timestamp("ASH_BEGIN_TIME", nullptr, ash_begin_time))) { + if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) { + ret = OB_SUCCESS; + ash_begin_time = 0; + } else { + LOG_WARN("failed to get timestamp", K(ret)); + } + } else if (OB_FAIL(result->get_timestamp("ASH_END_TIME", nullptr, ash_end_time))) { + if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) { + ret = OB_SUCCESS; + ash_end_time = 0; + } else { + LOG_WARN("failed to get timestamp", K(ret)); + } + } } } // end while } @@ -671,24 +1171,22 @@ int ObDbmsWorkloadRepository::get_ash_num_samples_and_events( ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); const uint64_t tenant_id = MTL_ID(); HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(sql_string.append("SELECT COUNT(1) AS NUM_SAMPLES, CAST(SUM("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(")AS SIGNED INTEGER) AS NUM_EVENTS FROM ("))) { + if (OB_FAIL(sql_string.append_fmt( + "SELECT COUNT(1) AS NUM_SAMPLES, COUNT(1) AS NUM_EVENTS FROM ("))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL(sql_string.append(") top_event "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); @@ -702,8 +1200,8 @@ int ObDbmsWorkloadRepository::get_ash_num_samples_and_events( LOG_WARN("fail to get next row", KR(ret)); } } else { - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "NUM_SAMPLES", num_samples, int64_t); - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "NUM_EVENTS", num_events, int64_t); + EXTRACT_INT_FIELD_FOR_ASH(*result, "NUM_SAMPLES", num_samples, int64_t); + EXTRACT_INT_FIELD_FOR_ASH(*result, "NUM_EVENTS", num_events, int64_t); } } // end while } @@ -723,64 +1221,78 @@ int ObDbmsWorkloadRepository::print_ash_summary_info(const AshReportParams &ash_ int64_t l_etime_buf_pos = 0; int64_t ash_begin_time_buf_pos = 0; int64_t ash_end_time_buf_pos = 0; - char l_btime_buf[time_buf_len]; - char l_etime_buf[time_buf_len]; - char ash_begin_time_buf[time_buf_len]; - char ash_end_time_buf[time_buf_len]; + char l_btime_buf[time_buf_len] = ""; + char l_etime_buf[time_buf_len] = ""; + char ash_begin_time_buf[time_buf_len] = ""; + char ash_end_time_buf[time_buf_len] = ""; double avg_active_sess = static_cast(num_samples) / dur_elapsed_time; avg_active_sess = round(avg_active_sess * 100) / 100; // round to two decimal places + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("
"))) {
+      LOG_WARN("failed to append string into buff", K(ret));
+    }
+  }
   HEAP_VAR(ObSqlString, temp_string)
   {
-    if (OB_FAIL(usec_to_string(l_btime, l_btime_buf, time_buf_len, l_btime_buf_pos))) {
+    if (OB_FAIL(usec_to_string(
+            ash_report_params.tz_info, l_btime, l_btime_buf, time_buf_len, l_btime_buf_pos))) {
       LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret));
-    } else if (OB_FAIL(usec_to_string(l_etime, l_etime_buf, time_buf_len, l_etime_buf_pos))) {
+    } else if (OB_FAIL(usec_to_string(ash_report_params.tz_info, l_etime, l_etime_buf, time_buf_len,
+                   l_etime_buf_pos))) {
       LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret));
     } else if (ash_report_params.ash_begin_time <= 0 && ash_report_params.ash_end_time <= 0) {
       ash_begin_time_buf[0] = '\0';
       ash_begin_time_buf_pos = 0;
       ash_end_time_buf[0] = '\0';
       ash_end_time_buf_pos = 0;
-    } else if (OB_FAIL(usec_to_string(ash_report_params.ash_begin_time, ash_begin_time_buf,
-                   time_buf_len, ash_begin_time_buf_pos))) {
+    } else if (OB_FAIL(usec_to_string(ash_report_params.tz_info, ash_report_params.ash_begin_time,
+                   ash_begin_time_buf, time_buf_len, ash_begin_time_buf_pos))) {
       LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret));
-    } else if (OB_FAIL(usec_to_string(ash_report_params.ash_end_time, ash_end_time_buf,
-                   time_buf_len, ash_end_time_buf_pos))) {
+    } else if (OB_FAIL(usec_to_string(ash_report_params.tz_info, ash_report_params.ash_end_time,
+                   ash_end_time_buf, time_buf_len, ash_end_time_buf_pos))) {
       LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to print time as str", K(ret));
     }
 
+    // OS info
+    struct utsname uts;
+    if (0 != ::uname(&uts)) {
+      ret = OB_ERR_SYS;
+      LOG_WARN("call uname failed");
+    }
+
     if (OB_FAIL(ret)) {
-    } else if (OB_FAIL(temp_string.append("----\n"))) {
-      LOG_WARN("append sql failed", K(ret));
-    } else if (OB_FAIL(temp_string.append_fmt("           Sample Begin: %.*s \n",
+    } else if (OB_FAIL(
+                   temp_string.append_fmt("           Cluster Name: %s \n", GCONF.cluster.str()))) {
+      LOG_WARN("failed to assign Cluster Name string", K(ret));
+    } else if (OB_FAIL(temp_string.append_fmt(
+                   "       Observer Version: %s (%s) \n", PACKAGE_STRING, build_version()))) {
+      LOG_WARN("failed to assign Observer Version string", K(ret));
+    } else if (OB_FAIL(temp_string.append_fmt("  Operation System Info: %s(%s)_%s \n", uts.sysname,
+                   uts.release, uts.machine))) {
+      LOG_WARN("failed to assign Operation System Info string", K(ret));
+    } else if (OB_FAIL(temp_string.append_fmt("  User Input Begin Time: %.*s \n",
                    static_cast(l_btime_buf_pos), l_btime_buf))) {
-      LOG_WARN("failed to assign query string", K(ret));
-    } else if (OB_FAIL(temp_string.append_fmt("             Sample End: %.*s \n",
+      LOG_WARN("failed to assign Sample Begin string", K(ret));
+    } else if (OB_FAIL(temp_string.append_fmt("    User Input End Time: %.*s \n",
                    static_cast(l_etime_buf_pos), l_etime_buf))) {
-      LOG_WARN("failed to assign query string", K(ret));
-    } else if (OB_FAIL(temp_string.append("             ----------\n"))) {
-      LOG_WARN("append sql failed", K(ret));
+      LOG_WARN("failed to assign Sample End string", K(ret));
     } else if (OB_FAIL(temp_string.append_fmt("    Analysis Begin Time: %.*s \n",
                    static_cast(ash_begin_time_buf_pos), ash_begin_time_buf))) {
-      LOG_WARN("failed to assign query string", K(ret));
+      LOG_WARN("failed to assign Analysis Begin Time string", K(ret));
     } else if (OB_FAIL(temp_string.append_fmt("      Analysis End Time: %.*s \n",
                    static_cast(ash_end_time_buf_pos), ash_end_time_buf))) {
-      LOG_WARN("failed to assign query string", K(ret));
+      LOG_WARN("failed to assign Analysis End Time string", K(ret));
     } else if (OB_FAIL(
                    temp_string.append_fmt("           Elapsed Time: %ld \n", dur_elapsed_time))) {
-      LOG_WARN("failed to assign query string", K(ret));
+      LOG_WARN("failed to assign Elapsed Time string", K(ret));
     } else if (OB_FAIL(temp_string.append_fmt("          Num of Sample: %ld \n", num_samples))) {
-      LOG_WARN("failed to assign query string", K(ret));
-    } else if (OB_FAIL(temp_string.append_fmt("          Num of Events: %ld \n", num_events))) {
-      LOG_WARN("failed to assign query string", K(ret));
+      LOG_WARN("failed to assign Num of Sample string", K(ret));
     } else if (OB_FAIL(
                    temp_string.append_fmt("Average Active Sessions: %.2f \n", avg_active_sess))) {
-      LOG_WARN("failed to assign query string", K(ret));
-    } else if (OB_FAIL(temp_string.append("----\n"))) {
-      LOG_WARN("append sql failed", K(ret));
+      LOG_WARN("failed to assign Average Active Sessions string", K(ret));
     } else if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) {
       LOG_WARN("failed to push string into buff", K(ret));
     } else {
-
       if (dur_elapsed_time <= 0) {
         dur_elapsed_time = 1;
       }
@@ -793,50 +1305,122 @@ int ObDbmsWorkloadRepository::print_ash_summary_info(const AshReportParams &ash_
       }
     }
   }
+  if (OB_SUCC(ret) && ash_report_params.is_html) {
+    if (OB_FAIL(buff.append("
"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } else if (OB_FAIL(buff.append("
    "))) { // hyperlink list for sections + LOG_WARN("failed to append string into buff", K(ret)); + } + } return ret; } -int ObDbmsWorkloadRepository::print_ash_top_user_event_info( - const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, - ObStringBuffer &buff) +inline void calc_ratio(int64_t dividend, int64_t divisor, char *ratio_char) +{ + if (divisor != 0) { + double ratio = static_cast(dividend) / divisor; + ratio = round(1000 * 100 * ratio) / 1000; + sprintf(ratio_char, "%.2f%%", ratio); + } +} + +inline void calc_avg_avtive_sessions(int64_t dividend, int64_t divisor, char *ratio_char) +{ + double ratio = static_cast(dividend) / divisor; + ratio = round(1000 * ratio) / 1000; + sprintf(ratio_char, "%.2f", ratio); +} + +int ObDbmsWorkloadRepository::print_ash_top_active_tenants(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Active Tenants"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top User Events:\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top active tenant information"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Total Count: num of records during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Wait Event Count: num of records when session is on wait event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "On CPU Count: num of records when session is on cpu"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "% Activity: activity(cpu + wait) percentage for given tenant"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Equivalent Client Load: equivalent client average active sessions " + "during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-"}; - const int64_t column_widths[] = {40, 20, 9}; - const char *column_headers[] = {"Event", "WAIT_CLASS", "% Event"}; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 8; + const int64_t column_widths[column_size] = {64, 12, 18, 23, 19, 20, 11, 20}; + const char *column_headers[column_size] = {"Tenant Name", "Session Type", "Total Count", + "Wait Event Count", "On CPU Count", "Avg Active Sessions", "% Activity", "Equivalent Client Load"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + //If the ratio between client total time and db time is below the minimum activity level, + //we consider that particular client session to be inactive. + //In this case, when calculating the load for that client session, + //only the db time passing through that session will be recorded, + //without taking into account any idle time within it. + //see it:SUM(CASE WHEN (DB_CNT < 0.1*DELTA_TIME) THEN DB_CNT ELSE DELTA_TIME END) as TOTAL_TIME + //min_active_ratio=0.1 + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 3 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append("SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1)" - " EVENT_CNT FROM ("))) { + } else if (OB_FAIL(sql_string.append_fmt( + "SELECT TENANT_ID, SESSION_TYPE, %s FROM (" + "SELECT TENANT_ID, SESSION_TYPE, COUNT(*) AS DB_CNT, %s FROM (", + lib::is_oracle_mode() + ? "SUM(DB_CNT) as CNT, " + "SUM(CPU_CNT) as CPU_CNT, " + "SUM(WAIT_CNT) as WAIT_CNT, " + "SUM(CASE WHEN (DB_CNT < 0.1 * DELTA_TIME) THEN DB_CNT ELSE DELTA_TIME END) as TOTAL_TIME" + : "CAST(SUM(DB_CNT) AS SIGNED) as CNT, " + "CAST(SUM(CPU_CNT) AS SIGNED) as CPU_CNT, " + "CAST(SUM(WAIT_CNT) AS SIGNED) as WAIT_CNT, " + "CAST(SUM(CASE WHEN (DB_CNT < 0.1 * DELTA_TIME) THEN DB_CNT ELSE DELTA_TIME END) AS SIGNED) as TOTAL_TIME", + lib::is_oracle_mode() + ? "sum(decode(event_no, 0, 1, 0)) as CPU_CNT, " + "sum(decode(event_no, 0, 0, 1)) as WAIT_CNT, " + "(round((cast(max(sample_time) as date) - cast(min(sample_time) as date)) * 86400) + 1) as DELTA_TIME" + : "cast(sum(if(event_no = 0, 1, 0)) as signed integer) as CPU_CNT, " + "cast(sum(if(event_no = 0, 0, 1)) as signed integer) as WAIT_CNT, " + "CAST((time_to_sec(MAX(sample_time)) - time_to_sec(MIN(sample_time)) + 1) AS SIGNED) as DELTA_TIME"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC"))) { + } else if (OB_FAIL(sql_string.append( + ") tmp_ash GROUP BY tenant_id, proxy_sid, session_type" + ") session_load GROUP BY tenant_id, session_type ORDER BY cnt DESC"))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); } else { while (OB_SUCC(ret)) { if (OB_FAIL(result->next())) { @@ -848,30 +1432,66 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( } } else { int64_t tmp_real_str_len = 0; - int64_t event_cnt = 0; - char event[64] = ""; - char wait_class[64] = ""; - char event_radio_char[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "WAIT_CLASS", wait_class, 64, tmp_real_str_len); - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(10000 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); + uint64_t tenant_id = 0; + char tenant_name[64] = ""; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TENANT_ID", tenant_id, uint64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CPU_CNT", cpu_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "WAIT_CNT", wait_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_TIME", total_time, int64_t); if (OB_SUCC(ret)) { - const char *column_content[] = {event, wait_class, event_radio_char}; - if (OB_FAIL(format_row( - 3 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + ObSchemaGetterGuard schema_guard; + const ObSimpleTenantSchema *tenant_info = nullptr; + if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema service is nullptr", K(ret)); + } else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_info))) { + LOG_WARN("get tenant info failed", K(ret), K(tenant_id)); + } + ret = OB_SUCCESS; + if (OB_NOT_NULL(tenant_info)) { + snprintf(tenant_name, 64, "%s", tenant_info->get_tenant_name()); + tenant_name[63] = '\0'; + } else { + snprintf(tenant_name, 63, "tenant:%ld", tenant_id); + } + } + + char session_type_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "SESSION_TYPE", session_type_char, 64, tmp_real_str_len); + + char activity_radio_char[64] = ""; + calc_ratio(cnt, num_samples, activity_radio_char); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + + char client_load_char[64] = ""; + calc_avg_avtive_sessions(total_time, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + client_load_char); + + if (OB_SUCC(ret)) { + const char *column_content[] = {tenant_name, session_type_char, + ASH_FIELD_CHAR(cnt), ASH_FIELD_CHAR(wait_cnt), ASH_FIELD_CHAR(cpu_cnt), + avg_active_sessions_char, activity_radio_char, client_load_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { LOG_WARN("failed to format row", K(ret)); } + with_color = !with_color; } } } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { LOG_WARN("failed to format row", K(ret)); } } @@ -881,58 +1501,92 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( return ret; } -int ObDbmsWorkloadRepository::print_ash_top_events_and_value( - const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, - ObStringBuffer &buff) +int ObDbmsWorkloadRepository::print_ash_top_node_load(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Node Load"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top Events P1/P2/P3 Value:\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top node measured by DB time"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "IP: OceanBase instance svr_ip"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Port: OceanBase instance svr_port"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Total Count: num of records during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Wait Event Count: num of records when session is on wait event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "On CPU Count: num of records when session is on cpu"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "% Activity: activity(cpu + wait) percentage for given tenant"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Equivalent Client Load: equivalent client average active sessions " + "during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 10, 12, 50, 20, 20, 20}; - const char *column_headers[] = {"Event", "% Event", "% Activity", "Max P1/P2/P3", "Parameter 1", - "Parameter 2", "Parameter 3"}; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 9; + const int64_t column_widths[column_size] = {16, 7, 12, 18, 23, 19, 20, 11, 20}; + const char *column_headers[column_size] = {"IP", "Port", "Session Type", "Total Count", + "Wait Event Count", "On CPU Count", "Avg Active Sessions", "% Activity", "Equivalent Client Load"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { + //If the ratio between client total time and db time is below the minimum activity level, + //we consider that particular client session to be inactive. + //In this case, when calculating the load for that client session, + //only the db time passing through that session will be recorded, + //without taking into account any idle time within it. + //see it:SUM(CASE WHEN (0.1 * TM_DELTA_TIME > 1000000) THEN 1000000 ELSE TM_DELTA_TIME END) + //min_active_ratio=0.1 ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 7 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append("SELECT * FROM (SELECT EVENT, CAST(SUM("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - ")AS SIGNED INTEGER) EVENT_CNT, CAST(COUNT(1) AS SIGNED INTEGER)" - " SAMPLE_CNT, MAX(P1) P1, MAX(P2) P2, "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - "MAX(P3) P3, MAX(P1TEXT) P1TEXT, MAX(P2TEXT) P2TEXT, MAX(P3TEXT)" - " P3TEXT FROM ("))) { + } else if (OB_FAIL(sql_string.append_fmt( + "SELECT SVR_IP, SVR_PORT, SESSION_TYPE, COUNT(*) AS CNT, %s FROM (", + lib::is_oracle_mode() + ? "sum(decode(event_no, 0, 1, 0)) as CPU_CNT, " + "sum(decode(event_no, 0, 0, 1)) as WAIT_CNT, " + "SUM(CASE WHEN (0.1 * TM_DELTA_TIME > 1000000) THEN 1000000 ELSE TM_DELTA_TIME END) as TOTAL_TIME" + : "cast(sum(if(event_no = 0, 1, 0)) as signed) as CPU_CNT, " + "cast(sum(if(event_no = 0, 0, 1)) as signed) as WAIT_CNT, " + "cast(SUM(CASE WHEN (0.1 * TM_DELTA_TIME > 1000000) THEN 1000000 ELSE TM_DELTA_TIME END) as signed) as TOTAL_TIME" + ))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL(sql_string.append( - ") top_event GROUP BY EVENT, WAIT_CLASS ORDER BY 2 DESC) LIMIT 10"))) { + ") top_event GROUP BY svr_ip, svr_port, session_type ORDER BY cnt DESC"))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); } else { while (OB_SUCC(ret)) { if (OB_FAIL(result->next())) { @@ -944,256 +1598,318 @@ int ObDbmsWorkloadRepository::print_ash_top_events_and_value( } } else { int64_t tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); + char ip_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SVR_IP", ip_char, 64, tmp_real_str_len); + + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "SVR_PORT", port, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CPU_CNT", cpu_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "WAIT_CNT", wait_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_TIME", total_time, int64_t); + char session_type_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "SESSION_TYPE", session_type_char, 64, tmp_real_str_len); + + char activity_radio_char[64] = ""; + calc_ratio(cnt, num_samples, activity_radio_char); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + + char client_load_char[64] = ""; + calc_avg_avtive_sessions(total_time, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time), + client_load_char); + + if (OB_SUCC(ret)) { + const char *column_content[] = {ip_char, ASH_FIELD_CHAR(port), session_type_char, + ASH_FIELD_CHAR(cnt), ASH_FIELD_CHAR(wait_cnt), ASH_FIELD_CHAR(cpu_cnt), + avg_active_sessions_char, activity_radio_char, client_load_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_foreground_db_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Foreground DB Time"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "this section lists top foreground db time categorized by event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Event Name: comprise wait event and on cpu event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Event Samples: num of sampled session activity records"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 5; + const int64_t column_widths[column_size] = {64, 20, 13, 20, 11}; + const char *column_headers[column_size] = { + "Event Name", "Wait Class", "Event Count", "Avg Active Sessions", "% Activity"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } else if ( + OB_FAIL(sql_string.append_fmt("SELECT * FROM (SELECT %s, %s, count(*) as CNT FROM (", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'ON CPU', EVENT) AS VARCHAR2(64)) AS EVENT" + : "CAST(IF (EVENT_NO = 0, 'ON CPU', EVENT) AS CHAR(64)) AS EVENT", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'NULL', WAIT_CLASS) AS VARCHAR2(64)) AS WAIT_CLASS" + : "CAST(IF (EVENT_NO = 0, 'NULL', WAIT_CLASS) AS CHAR(64)) AS WAIT_CLASS"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(" and session_type='FOREGROUND') tmp_ash GROUP BY " + "tmp_ash.EVENT_NO, tmp_ash.WAIT_CLASS, tmp_ash.EVENT ORDER BY cnt DESC)"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" WHERE ROWNUM <= 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + char wait_class_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "WAIT_CLASS", wait_class_char, 64, tmp_real_str_len); + + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); - int64_t event_cnt = 0; char event_radio_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(10000 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); + calc_ratio(cnt, num_samples, event_radio_char); + + if (OB_SUCC(ret)) { + const char *column_content[] = {event_char, wait_class_char, ASH_FIELD_CHAR(cnt), + avg_active_sessions_char, event_radio_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +#define EXTRACT_ASH_EXEC_PHASE(phase) \ + int64_t phase##_cnt = 0; \ + EXTRACT_INT_FIELD_FOR_ASH(*result, #phase, phase##_cnt, int64_t); \ + if (OB_FAIL(ret)) { \ + } else if (OB_FAIL( \ + phase_array.push_back(std::pair(#phase, phase##_cnt)))) { \ + LOG_WARN("failed to push ##phase pair into phase array", K(ret)); \ + } + +int ObDbmsWorkloadRepository::print_ash_top_execution_phase( + const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, + ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Execution Phase"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "this section lists top phases of execution, such as SQL, PL/SQL, STORAGE, " + "etc."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 6; + const int64_t column_widths[column_size] = {12, 40, 10, 11, 40, 11}; + const char *column_headers[column_size] = { + "Session Type", "Phase of Execution", "Active Samples", "% Activity", "SQL_ID", "% SQL_ID"}; + + const char *tm_columns[] = {"IN_PARSE", + "IN_PL_PARSE", + "IN_PLAN_CACHE", + "IN_SQL_OPTIMIZE", + "IN_SQL_EXECUTION", + "IN_PX_EXECUTION", + "IN_SEQUENCE_LOAD", + "IN_COMMITTING", + "IN_STORAGE_READ", + "IN_STORAGE_WRITE", + "IN_REMOTE_DAS_EXECUTION", + "IN_FILTER_ROWS", + "IN_PLSQL_COMPILATION", + "IN_PLSQL_EXECUTION", + "IN_RPC_ENCODE", + "IN_RPC_DECODE", + "IN_CONNECTION_MGR"}; + int32_t tm_flags[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + ObArrayWrap tm_cols_wrap(tm_columns, 17); + ObArrayWrap tm_flags_wrap(tm_flags, 17); + HEAP_VARS_3((ObISQLClient::ReadResult, res), (ObSqlString, sql_string), (ObSqlString, tm_view)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append( + "WITH session_data AS (" + "SELECT session_type, sql_id, trace_id, time_model FROM ("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(") tmp_ash WHERE tmp_ash.time_model > 0) "))) { + LOG_WARN("append ash view sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "SELECT SQL_ID, SESSION_TYPE, PHASE_NAME, SQL_PHASE_SAMPLES, TOTAL_PHASE_SAMPLES " + "FROM (" + "SELECT sql_id, session_type, phase_name, phase_cnt AS sql_phase_samples, " + "SUM(phase_cnt) OVER(PARTITION BY session_type, phase_name ORDER BY phase_cnt ASC) AS total_phase_samples, " + "ROW_NUMBER() OVER(PARTITION BY session_type, phase_name ORDER BY phase_cnt DESC) AS sql_rank " + "FROM ("))) { + LOG_WARN("append ash sql failed", K(ret)); + } else if (OB_FAIL(append_time_model_view_sql( + tm_view,"sql_id, session_type", tm_cols_wrap, tm_flags_wrap, "session_data", true))) { + LOG_WARN("append time model view sql failed", K(ret)); + } else if (OB_FAIL(tm_view.append(" GROUP BY sql_id, session_type"))) { + LOG_WARN("append sql string failed", K(ret)); + } else if (OB_FAIL(unpivot_time_model_column_sql(sql_string, "sql_id, session_type", tm_cols_wrap, tm_view.ptr()))) { + LOG_WARN("append unpivot timemodel column sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + ") unpivot_phase WHERE phase_cnt > 0" + ") all_phase " + "WHERE sql_rank = 1 " + "ORDER BY SESSION_TYPE DESC, TOTAL_PHASE_SAMPLES DESC"))) { + LOG_WARN("unpivot time model column sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char session_type_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "SESSION_TYPE", session_type_char, 64, tmp_real_str_len); + + tmp_real_str_len = 0; + char phase_name_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "PHASE_NAME", phase_name_char, 64, tmp_real_str_len); + + tmp_real_str_len = 0; + char sql_id_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "SQL_ID", sql_id_char, 64, tmp_real_str_len); + + int64_t sql_phase_samples = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "SQL_PHASE_SAMPLES", sql_phase_samples, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_PHASE_SAMPLES", total_phase_samples, int64_t); - int64_t sample_cnt = 0; char sample_radio_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SAMPLE_CNT", sample_cnt, int64_t); - double sample_radio = static_cast(sample_cnt) / num_samples; - sample_radio = round(1000 * 100 * sample_radio) / 1000; - sprintf(sample_radio_char, "%.3f%%", sample_radio); - - int64_t p1 = 0; - int64_t p2 = 0; - int64_t p3 = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "P1", p1, int64_t); - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "P2", p2, int64_t); - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "P3", p3, int64_t); - char p1p2p3_char[OB_MAX_WAIT_EVENT_PARAM_LENGTH * 3] = ""; - sprintf(p1p2p3_char, "%ld, %ld, %ld", p1, p2, p3); - - char p1_text[OB_MAX_WAIT_EVENT_PARAM_LENGTH] = " "; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "P1TEXT", p1_text, OB_MAX_WAIT_EVENT_PARAM_LENGTH, tmp_real_str_len); - char p2_text[OB_MAX_WAIT_EVENT_PARAM_LENGTH] = " "; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "P2TEXT", p2_text, OB_MAX_WAIT_EVENT_PARAM_LENGTH, tmp_real_str_len); - char p3_text[OB_MAX_WAIT_EVENT_PARAM_LENGTH] = " "; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "P3TEXT", p3_text, OB_MAX_WAIT_EVENT_PARAM_LENGTH, tmp_real_str_len); - + calc_ratio(total_phase_samples, num_samples, sample_radio_char); + char sql_radio_char[64] = ""; + calc_ratio(sql_phase_samples, num_samples, sql_radio_char); if (OB_SUCC(ret)) { - const char *column_content[] = {event, event_radio_char, sample_radio_char, - p1p2p3_char, p1_text, p2_text, p3_text}; - if (OB_FAIL(format_row( - 7 /*column_size*/, column_content, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } // end while - - if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } - } - return ret; -} - -int ObDbmsWorkloadRepository::print_ash_top_exec_phase(const AshReportParams &ash_report_params, - const int64_t num_samples, const int64_t dur_elapsed_time, ObStringBuffer &buff) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(GCTX.sql_proxy_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top Phase of Execution:\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 12, 14, 40}; - const char *column_headers[] = { - "Phase of Execution", "% Activity", "Sample Count", "Avg Active Sessions"}; - HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) - { - ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 4 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append("SELECT "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append("CAST(SUM(CASE WHEN IN_PARSE = 'N' THEN 0 ELSE 1 " - "END)AS SIGNED INTEGER) IN_PARSE, " - "CAST(SUM(CASE WHEN IN_PL_PARSE = 'N' THEN 0 ELSE 1 " - "END)AS SIGNED INTEGER) IN_PL_PARSE, " - "CAST(SUM(CASE WHEN IN_PLAN_CACHE = 'N' THEN 0 ELSE 1 " - "END)AS SIGNED INTEGER) IN_PLAN_CACHE, " - "CAST(SUM(CASE WHEN IN_SQL_OPTIMIZE = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_SQL_OPTIMIZE, " - "CAST(SUM(CASE WHEN IN_SQL_EXECUTION = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_SQL_EXECUTION, " - "CAST(SUM(CASE WHEN IN_PX_EXECUTION = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_PX_EXECUTION, " - "CAST(SUM(CASE WHEN IN_SEQUENCE_LOAD = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_SEQUENCE_LOAD, " - "CAST(SUM(CASE WHEN IN_COMMITTING = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_COMMITTING, " - "CAST(SUM(CASE WHEN IN_STORAGE_READ = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_STORAGE_READ, " - "CAST(SUM(CASE WHEN IN_STORAGE_WRITE = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_STORAGE_WRITE, " - "CAST(SUM(CASE WHEN IN_REMOTE_DAS_EXECUTION = 'N' THEN 0 ELSE " - "1 END)AS SIGNED INTEGER) IN_REMOTE_DAS_EXECUTION " - " FROM ("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { - LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event"))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); - } else if (OB_ISNULL(result = res.get_result())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); - } else { - while (OB_SUCC(ret)) { - if (OB_FAIL(result->next())) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - break; - } else { - LOG_WARN("fail to get next row", KR(ret)); - } - } else { - ObArray> phase_array; - - int64_t in_parse_cnt = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_PARSE", in_parse_cnt, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back( - std::pair("IN_PARSE", in_parse_cnt)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_pl_parse_cnt = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_PL_PARSE", in_pl_parse_cnt, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back( - std::pair("IN_PL_PARSE", in_pl_parse_cnt)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_plan_cache = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_PLAN_CACHE", in_plan_cache, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back( - std::pair("IN_PLAN_CACHE", in_plan_cache)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_sql_optimize = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_SQL_OPTIMIZE", in_sql_optimize, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back( - std::pair("IN_SQL_OPTIMIZE", in_sql_optimize)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_sql_execution = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET( - *result, "IN_SQL_EXECUTION", in_sql_execution, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair( - "IN_SQL_EXECUTION", in_sql_execution)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_px_execution = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_PX_EXECUTION", in_px_execution, int64_t); - if (OB_FAIL(ret)) { - - } else if (OB_FAIL(phase_array.push_back( - std::pair("IN_PX_EXECUTION", in_px_execution)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_sequence_load = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET( - *result, "IN_SEQUENCE_LOAD", in_sequence_load, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair( - "IN_SEQUENCE_LOAD", in_sequence_load)))) { - LOG_WARN("failed to push pair into phase array", K(ret)); - } - - int64_t in_committing = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_COMMITTING", in_committing, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair("IN_COMMITTING", in_committing)))) { - LOG_WARN("failed to push pair into phase array",K(ret)); - } - - int64_t in_storage_read = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_STORAGE_READ", in_storage_read, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair("IN_STORAGE_READ", in_storage_read)))) { - LOG_WARN("failed to push pair into phase array",K(ret)); - } - - int64_t in_storage_write = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_STORAGE_WRITE", in_storage_write, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair("IN_STORAGE_WRITE", in_storage_write)))) { - LOG_WARN("failed to push pair into phase array",K(ret)); - } - - int64_t in_das_remote_exec = 0; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IN_REMOTE_DAS_EXECUTION", in_das_remote_exec, int64_t); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(phase_array.push_back(std::pair("IN_REMOTE_DAS_EXECUTION", in_das_remote_exec)))) { - LOG_WARN("failed to push pair into phase array",K(ret)); - } - - lib::ob_sort(phase_array.begin(), phase_array.end(), phase_cmp_func); - for (int64_t i = 0; OB_SUCC(ret) && i < phase_array.count(); i++) { - const char *phase_name = phase_array.at(i).first; - int64_t phase_cnt = phase_array.at(i).second; - char sample_radio_char[64] = ""; - double sample_radio = static_cast(phase_cnt) / num_samples; - sample_radio = round(1000 * 100 * sample_radio) / 1000; - sprintf(sample_radio_char, "%.3f%%", sample_radio); - - char phase_cnt_char[64] = ""; - sprintf(phase_cnt_char, "%ld", phase_cnt); - - char phase_avg_time_char[64] = ""; - double phase_avg_time = static_cast(phase_cnt) / dur_elapsed_time; - phase_avg_time = round(1000 * 100 * phase_avg_time) / 1000; - sprintf(phase_avg_time_char, "%.3f%%", phase_avg_time); - const char *column_content[] = { - phase_name, sample_radio_char, phase_cnt_char, phase_avg_time_char}; - if (OB_FAIL(format_row( - 4 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + session_type_char, phase_name_char, ASH_FIELD_CHAR(total_phase_samples), sample_radio_char, + sql_id_char, sql_radio_char}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 4, 4))) { LOG_WARN("failed to format row", K(ret)); } + with_color = !with_color; } } } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1203,63 +1919,85 @@ int ObDbmsWorkloadRepository::print_ash_top_exec_phase(const AshReportParams &as return ret; } -int ObDbmsWorkloadRepository::print_ash_top_sql_with_event( - const AshReportParams &ash_report_params, const int64_t num_events, ObStringBuffer &buff) +#undef EXTRACT_ASH_EXEC_PHASE + +int ObDbmsWorkloadRepository::print_ash_background_db_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Background DB Time"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top SQL with Top Events\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - All events included.\n"))) { + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "this section lists top DB Time for background sessions"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - Empty ''SQL Text'' if it is PL/SQL query\n"))) { + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Program: process name for background sessions"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Event Name: comprise wait event and on cpu event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Event Samples: num of sampled session activity records"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - - const char *table_top[] = {"-", "-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 12, 25, 40, 12, 60}; - const char *column_headers[] = { - "SQL ID", "PLAN ID", "Sampled # of Executions", "Event", "% Event", "SQL Text"}; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 8; + const int64_t column_widths[column_size] = {65, 64, 64, 64, 20, 13, 11, 20}; + const char *column_headers[column_size] = { + "Program", "Module", "Action", "Event Name", "Wait Class", "Event Samples", " % Activity", "Avg Active Sessions"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 6 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append( - "SELECT SQL_ID, PLAN_ID, EVENT_CNT, EVENT, QUERY_SQL FROM (SELECT ash.*, " - "SUBSTR(TRIM(REPLACE(QUERY_SQL, CHAR(10), '''')), 1, 55) AS QUERY_SQL "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append("FROM (SELECT SQL_ID, PLAN_ID, CAST(SUM("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(") AS SIGNED INTEGER) EVENT_CNT, EVENT FROM ("))) { + } else if ( + OB_FAIL(sql_string.append_fmt( + "SELECT * FROM (" + "SELECT CASE WHEN program IS NULL THEN 'UNDEFINED' ELSE program END AS PROGRAM, " + "CASE WHEN module IS NULL THEN 'UNDEFINED' ELSE module END AS MODULE, " + "CASE WHEN action IS NULL THEN 'UNDEFINED' ELSE action END AS ACTION, " + "%s, %s, COUNT(*) AS CNT FROM (", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'ON CPU', EVENT) AS VARCHAR2(64)) AS EVENT" + : "CAST(IF (EVENT_NO = 0, 'ON CPU', EVENT) AS CHAR(64)) AS EVENT", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'NULL', WAIT_CLASS) AS VARCHAR2(64)) AS WAIT_CLASS" + : "CAST(IF (EVENT_NO = 0, 'NULL', WAIT_CLASS) AS CHAR(64)) AS WAIT_CLASS"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash "))) { + } else if (OB_FAIL(sql_string.append(" and session_type='BACKGROUND') ta GROUP BY " + "ta.program, ta.module, ta.action, ta.event_no, ta.event, ta.wait_class " + "having count(*) > 1 ORDER BY cnt DESC)"))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - "LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND " - "ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 LIMIT 100"))) { + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" WHERE ROWNUM <= 30 "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); } else { while (OB_SUCC(ret)) { if (OB_FAIL(result->next())) { @@ -1271,45 +2009,46 @@ int ObDbmsWorkloadRepository::print_ash_top_sql_with_event( } } else { int64_t tmp_real_str_len = 0; - char sql_id[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); + char program_char[64 + 1] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "PROGRAM", program_char, 64, tmp_real_str_len); + char module_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "MODULE", module_char, 64, tmp_real_str_len); + char action_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "ACTION", action_char, 64, tmp_real_str_len); + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + char wait_class_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "WAIT_CLASS", wait_class_char, 64, tmp_real_str_len); - int64_t plan_id = 0; - char plan_id_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "PLAN_ID", plan_id, int64_t); - sprintf(plan_id_char, "%ld", plan_id); - - int64_t event_cnt = 0; - char event_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - sprintf(event_cnt_char, "%ld", event_cnt); - - tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); char event_radio_char[64] = ""; - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(100 * 100 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); + calc_ratio(cnt, num_samples, event_radio_char); - tmp_real_str_len = 0; - char query_sql[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( - *result, "QUERY_SQL", query_sql, 63, tmp_real_str_len); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); if (OB_SUCC(ret)) { const char *column_content[] = { - sql_id, plan_id_char, event_cnt_char, event, event_radio_char, query_sql}; - if (OB_FAIL(format_row( - 6 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + program_char, module_char, action_char, + event_char, wait_class_char, + ASH_FIELD_CHAR(cnt), event_radio_char, avg_active_sessions_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { LOG_WARN("failed to format row", K(ret)); } + with_color = !with_color; } } } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1319,67 +2058,631 @@ int ObDbmsWorkloadRepository::print_ash_top_sql_with_event( return ret; } -int ObDbmsWorkloadRepository::print_ash_top_sql_with_blocking_event( - const AshReportParams &ash_report_params, const int64_t num_events, ObStringBuffer &buff) +int ObDbmsWorkloadRepository::print_ash_top_sessions(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Sessions"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top SQL with Top Blocking Events\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - Empty result if no event other than On CPU sampled\n"))) { + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top Active Sessions with " + "the largest wait event and SQL_ID"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - Empty ''SQL Text'' if it is PL/SQL query\n"))) { + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Session ID: user session id"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: represents the load on the database caused by this session"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Event Name: comprise wait event and on cpu event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Event: represents the activity load of the event on the database"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% SQL ID: represents the activity load of the event on the database"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Sql Executions: represents the execution count of the SQL_ID"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - - const char *table_top[] = {"-", "-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 12, 25, 40, 12, 60}; - const char *column_headers[] = { - "SQL ID", "PLAN ID", "Sampled # of Executions", "Event", "% Event", "SQL Text"}; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 11; + const int64_t column_widths[column_size] = {20, 64, 11, 20, 64, 20, 11, 40, 20, 11, 13}; + const char *column_headers[column_size] = {"Session ID", "Program", "% Activity", "Avg Active Sessions", + "Event Name", "Wait Class", "% Event", "SQL ID", "Plan Hash", "% SQL ID", "Sql Executions"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths, true))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 6 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { + } else if ( + OB_FAIL(sql_string.append_fmt( + "WITH session_data AS (" + "SELECT session_id, %s AS event, %s AS wait_class, " + "event_no, sql_id, plan_hash, trace_id, program FROM (", + lib::is_oracle_mode() + ? "CAST(DECODE(event_no, 0, 'ON CPU', event) AS VARCHAR2(64))" + : "CAST(IF (event_no = 0, 'ON CPU', event) AS CHAR(64))", + lib::is_oracle_mode() + ? "CAST(DECODE(event_no, 0, 'NULL', wait_class) AS VARCHAR2(64))" + : "CAST(IF (event_no = 0, 'NULL', wait_class) AS CHAR(64))"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(" and session_type='FOREGROUND') tmp_ash), "))) { + LOG_WARN("failed to append sql", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "top_session AS (" + "SELECT session_id, COUNT(*) AS total_sample_count, program " + "FROM session_data " + "GROUP BY session_id, program " + "ORDER BY total_sample_count DESC %s), ", + lib::is_oracle_mode() ? "FETCH FIRST 30 ROWS ONLY" : "LIMIT 30"))) { + LOG_WARN("append top session topic text failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_event AS (" + "SELECT session_id, event_no, event, wait_class, event_sample_count " + "FROM (" + "SELECT session_id, event_no, event, wait_class, COUNT(*) AS event_sample_count, " + "ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY COUNT(*) DESC) AS event_rank " + "FROM session_data " + "WHERE session_id IN (SELECT session_id FROM top_session) " + "GROUP BY session_id, event_no, event, wait_class) event_data " + "WHERE event_rank = 1), "))) { + LOG_WARN("append top event topic text failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "sql_data AS (" + "SELECT session_id, event_no, sql_id, plan_hash, " + "SUM(COUNT(*)) OVER (PARTITION BY session_id, event_no, sql_id ORDER BY COUNT(*)) AS sql_sample_count, " + "COUNT(DISTINCT trace_id) AS sql_exec_count " + "FROM session_data " + "WHERE (session_id, event_no) IN (SELECT session_id, event_no FROM top_event) " + "GROUP BY session_id, event_no, sql_id, plan_hash), "))) { + LOG_WARN("append sql_data text failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_sql AS (" + "SELECT session_id, sql_id, plan_hash, sql_sample_count, sql_exec_count " + "FROM (" + "SELECT session_id, sql_id, plan_hash, sql_sample_count, sql_exec_count, " + "ROW_NUMBER() OVER (PARTITION BY session_id, event_no ORDER BY sql_sample_count DESC) AS sql_rank " + "FROM sql_data) tmp_sql " + "WHERE sql_rank = 1 AND sql_id IS NOT NULL AND LENGTH(sql_id) > 0) "))) { + LOG_WARN("append top sql topic text failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "SELECT ts.session_id AS SESSION_ID, " + "ts.total_sample_count AS TOTAL_SAMPLE_COUNT, " + "ts.program AS PROGRAM, " + "te.event AS EVENT, " + "te.event_sample_count AS EVENT_SAMPLE_COUNT, " + "te.wait_class AS WAIT_CLASS, " + "tsq.sql_id AS SQL_ID, " + "tsq.plan_hash AS PLAN_HASH, " + "tsq.sql_sample_count AS SQL_SAMPLE_COUNT, " + "tsq.sql_exec_count AS SQL_EXEC_COUNT " + "FROM top_session ts " + "LEFT JOIN top_event te ON ts.session_id = te.session_id " + "LEFT JOIN top_sql tsq ON ts.session_id = tsq.session_id " + "ORDER BY ts.total_sample_count DESC"))) { + LOG_WARN("append the main topic failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "SESSION_ID", session_id, int64_t); + int64_t total_sample_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TOTAL_SAMPLE_COUNT", total_sample_cnt, int64_t); + char program_char[64 + 1] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "PROGRAM", program_char, 64, tmp_real_str_len); + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + int64_t event_sample_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "EVENT_SAMPLE_COUNT", event_sample_cnt, int64_t); + char wait_class_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "WAIT_CLASS", wait_class_char, 64, tmp_real_str_len); + char sql_id[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); + EXTRACT_UINT_FIELD_FOR_ASH_STR(*result, "PLAN_HASH", plan_hash, int64_t); + int64_t sql_sample_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "SQL_SAMPLE_COUNT", sql_sample_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "SQL_EXEC_COUNT", sql_exec_cnt, int64_t); + + char active_radio_char[64] = ""; + calc_ratio(total_sample_cnt, num_samples, active_radio_char); + + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(total_sample_cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + + char event_percentage[64] = ""; + calc_ratio(event_sample_cnt, num_samples, event_percentage); + + char sql_percentage[64] = ""; + calc_ratio(sql_sample_cnt, num_samples, sql_percentage); + + if (OB_SUCC(ret)) { + const char *column_content[] = { + ASH_FIELD_CHAR(session_id), program_char, active_radio_char, avg_active_sessions_char, + event_char, wait_class_char, event_percentage, + sql_id, ASH_FIELD_CHAR(plan_hash), sql_percentage, ASH_FIELD_CHAR(sql_exec_cnt)}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 7, 7))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_top_group(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Groups"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top resource consumer groups"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Group Name: resource consumer group name"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Group Samples: num of sampled session activity records in the current resource group"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given resource group"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 10; + const int64_t column_widths[column_size] = {128, 13, 11, 20, 64, 11, 32, 11, 32, 11}; + const char *column_headers[column_size] = { + "Group Name", "Group Samples", "% Activity", "Avg Active Sessions", "Program", "% Program", "Module", "% Module", "Action", "% Action"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths, true))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + } else if (OB_FAIL(sql_string.append( + "WITH session_data AS (" + "SELECT tenant_id, group_id, COUNT(*) AS action_time, " + "CASE WHEN program IS NULL THEN 'UNDEFINED' ELSE program END AS program, " + "CASE WHEN module IS NULL THEN 'UNDEFINED' ELSE module END AS module, " + "CASE WHEN action IS NULL THEN 'UNDEFINED' ELSE action END AS action " + "FROM ("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + ") ash " + "GROUP BY ash.tenant_id, ash.group_id, ash.program, ash.module, ash.action " + "ORDER BY action_time DESC %s), ", + lib::is_oracle_mode() ? "FETCH FIRST 30 ROWS ONLY" : "LIMIT 30"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_action AS (" + "SELECT tenant_id, group_id, program, module, action, action_time, " + "ROW_NUMBER() OVER (PARTITION BY tenant_id, group_id, program, module ORDER BY action_time DESC) AS action_rank " + "FROM session_data), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_module AS (" + "SELECT tenant_id, group_id, program, module, module_time, " + "ROW_NUMBER() OVER (PARTITION BY tenant_id, group_id, program ORDER BY module_time DESC) AS module_rank " + "FROM (" + "SELECT tenant_id, group_id, program, module, " + "SUM(action_time) AS module_time " + "FROM top_action " + "GROUP BY tenant_id, group_id, program, module" + ") tmp_action" + "), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_program AS (" + "SELECT tenant_id, group_id, program, program_time, " + "ROW_NUMBER() OVER (PARTITION BY tenant_id, group_id ORDER BY program_time DESC) AS program_rank " + "FROM (" + "SELECT tenant_id, group_id, program, " + "SUM(module_time) AS program_time " + "FROM top_module " + "GROUP BY tenant_id, group_id, program" + ") tmp_program" + "), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_group AS (" + "SELECT tenant_id, group_id, SUM(program_time) AS group_time " + "FROM top_program " + "GROUP BY tenant_id, group_id) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "SELECT tg.tenant_id AS TENANT_ID, tg.group_id AS GROUP_ID, %s ," + "tp.program AS PROGRAM, %s , tp.program_rank AS PROGRAM_RANK, " + "tm.module AS MODULE, tm.module_time AS MODULE_TIME, tm.module_rank AS MODULE_RANK, " + "ta.action AS ACTION, ta.action_time AS ACTION_TIME, ta.action_rank AS ACTION_RANK " + "FROM top_action ta JOIN top_module tm " + "ON ta.tenant_id = tm.tenant_id AND ta.group_id = tm.group_id AND ta.program = tm.program AND ta.module = tm.module " + "JOIN top_program tp " + "ON ta.tenant_id = tp.tenant_id AND ta.group_id = tp.group_id AND ta.program = tp.program " + "JOIN top_group tg " + "ON ta.tenant_id = tg.tenant_id AND ta.group_id = tg.group_id " + "ORDER BY tg.group_time DESC, tp.program_rank, tm.module_rank, ta.action_rank" , lib::is_oracle_mode() + ? "tg.group_time as GROUP_TIME " + : "CAST(tg.group_time AS SIGNED) as GROUP_TIME ", + lib::is_oracle_mode() + ? " tp.program_time as PROGRAM_TIME " + : " CAST(tp.program_time AS SIGNED) as PROGRAM_TIME " + ))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + uint64_t tenant_id = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TENANT_ID", tenant_id, uint64_t); + uint64_t group_id = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "GROUP_ID", group_id, uint64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "GROUP_TIME", group_time, int64_t); + int64_t program_rank = 0; + EXTRACT_UINT_FIELD_FOR_ASH(*result, "PROGRAM_RANK", program_rank, int64_t); + int64_t module_rank = 0; + EXTRACT_UINT_FIELD_FOR_ASH(*result, "MODULE_RANK", module_rank, int64_t); + int64_t action_rank = 0; + EXTRACT_UINT_FIELD_FOR_ASH(*result, "ACTION_RANK", action_rank, int64_t); + char group_path[128] = ""; + char group_radio_char[64] = ""; + char avg_active_sessions_char[64] = ""; + if (OB_SUCC(ret) && 1 == program_rank && 1 == module_rank && 1 == action_rank) { + if (OB_ISNULL(GCTX.cgroup_ctrl_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.cgroup_ctrl_ is nullptr", K(ret)); + } else if(OB_FAIL(GCTX.cgroup_ctrl_->get_group_path(group_path, 128, tenant_id, group_id, false/*is_background*/, ""))) { + LOG_WARN("get group path failed", K(ret), K(tenant_id), K(group_id)); + } else { + group_path[127] = '\0'; + } + if (OB_SUCCESS != ret) { + ret = OB_SUCCESS; + snprintf(group_path, 128, "tenant:%ld/group:%ld", tenant_id, group_id); + } + calc_ratio(group_time, num_samples, group_radio_char); + calc_avg_avtive_sessions(group_time, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + } + if (program_rank > 1 || module_rank > 1 || action_rank > 1) { + group_time = 0; + ASH_FIELD_CHAR(group_time)[0] = '\0'; + group_path[0] = '\0'; + } + + tmp_real_str_len = 0; + char program_char[64] = ""; + int64_t program_time = 0; + char program_radio_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "PROGRAM", program_char, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH(*result, "PROGRAM_TIME", program_time, int64_t); + if (1 == module_rank && 1 == action_rank) { + calc_ratio(program_time, num_samples, program_radio_char); + } else { + program_char[0] = '\0'; + } + + tmp_real_str_len = 0; + char module_char[64] = ""; + int64_t module_time = 0; + char module_radio_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "MODULE", module_char, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH(*result, "MODULE_TIME", module_time, int64_t); + if (1 == action_rank) { + calc_ratio(module_time, num_samples, module_radio_char); + } else { + module_char[0] = '\0'; + } + + tmp_real_str_len = 0; + char action_char[64] = ""; + int64_t action_time = 0; + char action_radio_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "ACTION", action_char, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH(*result, "ACTION_TIME", action_time, int64_t); + calc_ratio(action_time, num_samples, action_radio_char); + if (OB_SUCC(ret)) { + const char *column_content[] = { + group_path, ASH_FIELD_CHAR(group_time), group_radio_char, avg_active_sessions_char, + program_char, program_radio_char, + module_char, module_radio_char, + action_char, action_radio_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_top_latches(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Latchs"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top latches"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Latch Wait Event: event that waiting for latch"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Event Count: num of sampled session activity records"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 4; + const int64_t column_widths[column_size] = {64, 13, 11, 20}; + const char *column_headers[column_size] = { + "Latch Wait Event", "Event Count", "% Activity", "Avg Active Sessions"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt("SELECT * FROM (SELECT %s, COUNT(*) AS CNT FROM (", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'ON CPU', EVENT) AS VARCHAR2(64)) AS EVENT" + : "CAST(IF (EVENT_NO = 0, 'ON CPU', EVENT) AS CHAR(64)) AS EVENT"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append( + ") tmp_ash where tmp_ash.event like 'latch: %' " + "GROUP BY tmp_ash.EVENT_NO, tmp_ash.EVENT, tmp_ash.WAIT_CLASS " + "having count(*) > 1 ORDER BY cnt DESC)"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" WHERE ROWNUM <= 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + + char event_radio_char[64] = ""; + calc_ratio(cnt, num_samples, event_radio_char); + + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + if (OB_SUCC(ret)) { + const char *column_content[] = { + event_char, ASH_FIELD_CHAR(cnt), event_radio_char, avg_active_sessions_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_activity_over_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Activity Over Time"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "this section lists time slot information during the analysis period."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Slot Begin Time: current slot's begin time. current slot end with next slot begin " + "time."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Event Name: comprise wait event and on cpu event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Event Count: num of sampled session activity records"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 6; + const int64_t column_widths[column_size] = {28, 64, 20, 13, 11, 20}; + const char *column_headers[column_size] = {"Slot Begin Time", "Event Name", "Wait Class", + "Event Count", "% Activity", "Avg Active Sessions"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } else if ( + OB_FAIL(sql_string.append_fmt( + "select * from (select TIMEKEY, EVENT, WAIT_CLASS, CNT, ROW_NUMBER() OVER (PARTITION " + "BY TIMEKEY ORDER BY cnt DESC) AS n from (SELECT TIMEKEY, %s, %s, COUNT(*) AS CNT " + "FROM (SELECT %s as TIMEKEY, EVENT_NO, EVENT, WAIT_CLASS from (", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'ON CPU', EVENT) AS VARCHAR2(64)) AS event" + : "CAST(IF (EVENT_NO = 0, 'ON CPU', EVENT) AS CHAR(64)) AS event", + lib::is_oracle_mode() + ? "CAST(DECODE(EVENT_NO, 0, 'NULL', WAIT_CLASS) AS VARCHAR2(64)) AS wait_class" + : "CAST(IF (EVENT_NO = 0, 'NULL', WAIT_CLASS) AS CHAR(64)) AS wait_class", + lib::is_oracle_mode() + ? "cast(to_date('19700101', 'YYYYMMDD') + (cast((cast(sample_time as DATE) - " + "DATE '1970-01-01') * 86400 as integer) - " + "MOD(cast((cast(sample_time as DATE) - DATE '1970-01-01') * 86400 as integer), " + "(5 * 60))) / 86400 as VARCHAR2(64))" + : "cast(from_unixtime(unix_timestamp(sample_time) - " + "unix_timestamp(sample_time) % (5 * 60)) as char(64))" /*5 minutes slot*/ + ))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL( - sql_string.append("SELECT SQL_ID, PLAN_ID, EVENT_CNT, EVENT, QUERY_SQL "))) { + sql_string.append(")) " + "top_event GROUP BY top_event.timekey, top_event.EVENT_NO, top_event.EVENT, top_event.WAIT_CLASS " + "having count(*) > 1 ORDER BY timekey)) where n " + "<= 5"))) { // top 10 row for each slot LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append("FROM (SELECT ash.*, SUBSTR(TRIM(REPLACE(QUERY_SQL, " - "CHAR(10), '''')), 1, 55) AS QUERY_SQL "))) { + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" and ROWNUM <= 50 "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(" FROM (SELECT SQL_ID, PLAN_ID, CAST(SUM("))) { + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 50 "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(") AS SIGNED INTEGER) EVENT_CNT, EVENT FROM ("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { - LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event WHERE wait_class_id != 100 GROUP BY " - "SQL_ID, PLAN_ID, EVENT) ash "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - "LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND " - "ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) LIMIT 100"))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); } else { + char prev_timekey_char[65] = ""; while (OB_SUCC(ret)) { if (OB_FAIL(result->next())) { if (OB_ITER_END == ret) { @@ -1390,45 +2693,42 @@ int ObDbmsWorkloadRepository::print_ash_top_sql_with_blocking_event( } } else { int64_t tmp_real_str_len = 0; - char sql_id[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); + char timekey_char[65] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "TIMEKEY", timekey_char, 64, tmp_real_str_len); + char event_char[65] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + char wait_class_char[65] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "WAIT_CLASS", wait_class_char, 64, tmp_real_str_len); - int64_t plan_id = 0; - char plan_id_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "PLAN_ID", plan_id, int64_t); - sprintf(plan_id_char, "%ld", plan_id); - - int64_t event_cnt = 0; - char event_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - sprintf(event_cnt_char, "%ld", event_cnt); - - tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); char event_radio_char[64] = ""; - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(100 * 100 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); + calc_ratio(cnt, num_samples, event_radio_char); - tmp_real_str_len = 0; - char query_sql[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( - *result, "QUERY_SQL", query_sql, 63, tmp_real_str_len); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, 5 * 60, /*5 mins*/ + avg_active_sessions_char); + if (0 == strncmp(prev_timekey_char, timekey_char, 65)) { + timekey_char[0] = '\0'; + } else { + MEMCPY(prev_timekey_char, timekey_char, sizeof(prev_timekey_char)); + } if (OB_SUCC(ret)) { - const char *column_content[] = { - sql_id, plan_id_char, event_cnt_char, event, event_radio_char, query_sql}; - if (OB_FAIL(format_row( - 6 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + const char *column_content[] = {timekey_char, event_char, wait_class_char, + ASH_FIELD_CHAR(cnt), event_radio_char, avg_active_sessions_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { LOG_WARN("failed to format row", K(ret)); } + with_color = !with_color; } } } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(6 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1438,43 +2738,95 @@ int ObDbmsWorkloadRepository::print_ash_top_sql_with_blocking_event( return ret; } -int ObDbmsWorkloadRepository::print_ash_sql_text_list( - const AshReportParams &ash_report_params, ObStringBuffer &buff) +int ObDbmsWorkloadRepository::print_top_sql_with_top_db_time( + const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, + ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top SQL with Top DB Time"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Complete List of SQL Text:\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "This Section lists the SQL statements that accounted for the highest percentages " + "of sampled session activity."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Plan Hash: Numeric representation of the current SQL plan."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Total Count: num of records during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Wait Event Count: num of records when session is on wait event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "On CPU Count: num of records when session is on cpu"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; const uint64_t tenant_id = MTL_ID(); + const int64_t column_size = 7; + const int64_t column_widths[column_size] = {40, 20, 18, 23, 19, 12, 64}; + const char *column_headers[column_size] = {"SQL ID", "Plan Hash", "Total Count", + "Wait Event Count", "On CPU Count", "% Activity", "SQL Text"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(sql_string.append( - "SELECT SQL_ID, PLAN_ID, SUBSTR(QUERY_SQL, 1 ,4000) AS QUERY_SQL FROM " - "(SELECT pc.SQL_ID SQL_ID, pc.PLAN_ID, pc.QUERY_SQL QUERY_SQL "))) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append("SELECT SQL_ID, PLAN_HASH, QUERY_SQL, CPU_CNT, " + "WAIT_CNT, CNT FROM (SELECT ash.*, "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - "FROM (SELECT SQL_ID, PLAN_ID, COUNT(1) EVENT_CNT FROM ("))) { + } else if (lib::is_oracle_mode() && + OB_FAIL(sql_string.append( + " SUBSTR(TRIM(REPLACE(pc.QUERY_SQL, CHR(10), '''')), 0, 55) QUERY_SQL "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && + OB_FAIL(sql_string.append( + " SUBSTR(TRIM(REPLACE(QUERY_SQL, CHAR(10), '''')), 1, 55) AS QUERY_SQL "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "FROM (SELECT SQL_ID, PLAN_HASH, %s, COUNT(*) AS cnt FROM (", + lib::is_oracle_mode() + ? "sum(decode(event_no, 0, 1, 0)) as cpu_cnt, " + "sum(decode(event_no, 0, 0, 1)) as wait_cnt" + : "cast(sum(if(event_no = 0, 1, 0)) as signed integer) as cpu_cnt, " + "cast(sum(if(event_no = 0, 0, 1)) as signed integer) as wait_cnt"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash "))) { + } else if (OB_FAIL(sql_string.append(" and plan_hash is not null) top_event GROUP BY SQL_ID, " + "PLAN_HASH having count(*) > 1) ash "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - "LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND " - "ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT " - "NULL " - "LIMIT 100"))) { + } else if (OB_FAIL( + sql_string.append_fmt("LEFT JOIN %s pc ON ash.sql_id = pc.sql_id AND " + "ash.plan_hash = pc.plan_hash ORDER BY cnt DESC) v1 ", + lib::is_oracle_mode() + ? "(SELECT * FROM (SELECT SQL_ID, PLAN_HASH, QUERY_SQL, ROW_NUMBER() " + "OVER (PARTITION BY SQL_ID, PLAN_HASH ORDER BY SQL_ID, PLAN_HASH) AS N FROM " + "SYS.GV$OB_SQLSTAT) WHERE N = 1)" + : "(SELECT distinct SQL_ID, PLAN_HASH, QUERY_SQL " + "FROM oceanbase.GV$OB_SQLSTAT)"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" WHERE ROWNUM <= 30 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 30 "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); @@ -1491,41 +2843,1111 @@ int ObDbmsWorkloadRepository::print_ash_sql_text_list( int64_t tmp_real_str_len = 0; char sql_id[64] = ""; EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(buff.append(" SQL ID: "))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(sql_id))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); + + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "WAIT_CNT", wait_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CPU_CNT", cpu_cnt, int64_t); + EXTRACT_UINT_FIELD_FOR_ASH_STR(*result, "PLAN_HASH", plan_hash, uint64_t); + + char activity_radio_char[64] = ""; + calc_ratio(cnt, num_samples, activity_radio_char); + + tmp_real_str_len = 0; + char query_sql[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "QUERY_SQL", query_sql, 63, tmp_real_str_len); + if (OB_SUCC(ret)) { + const char *column_content[] = {sql_id, ASH_FIELD_CHAR(plan_hash), + ASH_FIELD_CHAR(cnt), ASH_FIELD_CHAR(wait_cnt), ASH_FIELD_CHAR(cpu_cnt), + activity_radio_char, query_sql}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 0, 6))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_sql_with_top_wait_events( + const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, + ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top SQL with Top Events"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "This Section lists the SQL statements that accounted for the highest percentages " + "event."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Plan Hash: Numeric representation of the current SQL plan"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Active Samples: num of samples for top current SQL"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given SQL ID"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Sampled Executions: represents the number of times the current SQL execution has been sampled"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Top Event: top event name for current SQL plan"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Event: activity percentage for current SQL plan"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Top Operator/ExecPhase: top operator name or execution phase for current event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Operator/ExecPhase: activity percentage for given operator"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t tenant_id = MTL_ID(); + const int64_t column_size = 10; + const int64_t column_widths[column_size] = {40, 20, 14, 14, 14, 64, 14, 128, 14, 64}; + const char *column_headers[column_size] = { + "SQL ID", "Plan Hash", "Active Samples", "% Activity", "Sampled Executions", "Top Event", "% Event", "Top Operator/ExecPhase", "% Operator/ExecPhase", "SQL Text"}; + const char *tm_columns[] = {"IN_PARSE", + "IN_PL_PARSE", + "IN_PLAN_CACHE", + "IN_SQL_OPTIMIZE", + "IN_SQL_EXECUTION", + "IN_PX_EXECUTION", + "IN_SEQUENCE_LOAD", + "IN_COMMITTING", + "IN_STORAGE_READ", + "IN_STORAGE_WRITE", + "IN_REMOTE_DAS_EXECUTION", + "IN_FILTER_ROWS", + "IN_PLSQL_COMPILATION", + "IN_PLSQL_EXECUTION", + "IN_RPC_ENCODE", + "IN_RPC_DECODE", + "IN_CONNECTION_MGR"}; + int32_t tm_flags[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + ObArrayWrap tm_cols_wrap(tm_columns, 17); + ObArrayWrap tm_flags_wrap(tm_flags, 17); + HEAP_VARS_3((ObISQLClient::ReadResult, res), (ObSqlString, sql_string), (ObSqlString, tm_view)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "WITH session_data AS (" + "SELECT CASE WHEN (sql_id IS NULL AND trace_id IS NOT NULL) THEN 'UNDEFINED' ELSE sql_id END AS sql_id, " + "CASE WHEN (plan_hash IS NULL) THEN 0 ELSE plan_hash END AS plan_hash, " + "sql_plan_line_id, event_no, %s AS event, trace_id, time_model " + "FROM (", + lib::is_oracle_mode() ? "CAST(DECODE(event_no, 0, 'ON CPU', event) AS VARCHAR2(64))" + : "CAST(IF (event_no = 0, 'ON CPU', event) AS CHAR(64)) "))) { + LOG_WARN("append sql string failed", KR(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append( + ") tmp_ash), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_time_model_view_sql( + tm_view,"sql_id, plan_hash, event_no", tm_cols_wrap, tm_flags_wrap, "session_data", true))) { + LOG_WARN("append time model view sql failed", K(ret)); + } else if (OB_FAIL(tm_view.append(" GROUP BY sql_id, plan_hash, event_no"))) { + LOG_WARN("append sql string failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_exec_phase AS (" + "SELECT sql_id, plan_hash, event_no, phase_name, phase_cnt " + "FROM (" + "SELECT sql_id, plan_hash, event_no, phase_name, phase_cnt, " + "ROW_NUMBER() OVER(PARTITION BY sql_id, plan_hash, event_no ORDER BY phase_cnt DESC) AS phase_rank " + "FROM ("))) { + LOG_WARN("append sql string failed", K(ret)); + } else if (OB_FAIL(unpivot_time_model_column_sql(sql_string, "sql_id, plan_hash, event_no", tm_cols_wrap, tm_view.ptr()))) { + LOG_WARN("append unpivot timemodel column sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append(") tphr WHERE phase_cnt > 0) tep WHERE tep.phase_rank = 1), "))) { + LOG_WARN("unpivot time model column sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_operator AS (" + "SELECT sql_id, plan_hash, sql_plan_line_id, event_no, event, " + "COUNT(*) AS total_operator_samples, " + "ROW_NUMBER() OVER (PARTITION BY sd.sql_id, sd.plan_hash, sd.event_no ORDER BY COUNT(*) DESC) AS operator_rank " + "FROM session_data sd " + "GROUP BY sd.sql_id, sd.plan_hash, sd.sql_plan_line_id, sd.event_no, sd.event), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_event AS (" + "SELECT sql_id, plan_hash, event_no, event, " + "SUM(total_operator_samples) AS total_event_samples, " + "ROW_NUMBER() OVER (PARTITION BY sql_id, plan_hash " + "ORDER BY SUM(total_operator_samples) DESC) AS event_rank " + "FROM top_operator GROUP BY sql_id, plan_hash, event_no, event), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "top_plan AS (" + "SELECT sql_id, plan_hash, COUNT(*) AS total_plan_samples, COUNT(DISTINCT trace_id) AS exec_cnt " + "FROM session_data " + "GROUP BY sql_id, plan_hash " + "ORDER BY total_plan_samples DESC %s), ", + lib::is_oracle_mode() ? "FETCH FIRST 30 ROWS ONLY" : "LIMIT 30"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_ash AS (" + "SELECT sd.sql_id AS sql_id, sd.plan_hash AS plan_hash, " + "sd.sql_plan_line_id AS sql_plan_line_id, " + "sd.total_operator_samples AS total_operator_samples, " + "te.event_no AS event_no, " + "te.event AS event, " + "te.total_event_samples AS total_event_samples, " + "te.event_rank AS event_rank, " + "tp.total_plan_samples AS total_plan_samples, " + "tp.exec_cnt AS total_exec_cnt " + "FROM top_operator sd " + "JOIN top_event te " + "ON sd.sql_id = te.sql_id AND sd.plan_hash = te.plan_hash AND sd.event_no = te.event_no " + "JOIN top_plan tp " + "ON sd.sql_id = tp.sql_id AND sd.plan_hash = tp.plan_hash " + "WHERE te.event_rank <= 5 AND sd.operator_rank <= 1) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "SELECT CASE WHEN ash.event_rank > 1 THEN NULL ELSE ash.sql_id END AS SQL_ID, " + "CASE WHEN ash.event_rank > 1 THEN NULL ELSE ash.plan_hash END AS PLAN_HASH, " + "ash.event AS EVENT, " + "ash.event_rank AS EVENT_RANK, " + "ash.total_event_samples AS TOTAL_EVENT_SAMPLES, " + "CASE WHEN ash.sql_plan_line_id IS NULL THEN tep.phase_name ELSE sp.operator END AS OPERATOR, " + "CASE WHEN ash.sql_plan_line_id IS NULL THEN tep.phase_cnt " + "ELSE ash.total_operator_samples END AS TOTAL_OPERATOR_SAMPLES, " + "ash.total_plan_samples AS TOTAL_PLAN_SAMPLES, " + "CASE WHEN ash.event_rank > 1 THEN NULL ELSE ash.total_exec_cnt END AS TOTAL_EXEC_CNT, " + "CASE WHEN ash.event_rank > 1 THEN NULL ELSE pc.query_sql END AS QUERY_SQL " + "FROM top_ash ash " + "LEFT JOIN (" + "SELECT DISTINCT sql_id, plan_hash, %s AS query_sql " + "FROM %s) pc " + "ON ash.sql_id = pc.sql_id AND ash.plan_hash = pc.plan_hash " + "LEFT JOIN (" + "SELECT DISTINCT plan_hash, sql_id, id, operator " + "FROM %s) sp " + "ON ash.sql_id = sp.sql_id AND ash.plan_hash = sp.plan_hash AND ash.sql_plan_line_id = sp.id " + "LEFT JOIN top_exec_phase tep " + "ON ash.sql_id = tep.sql_id AND ash.plan_hash = tep.plan_hash AND ash.event_no = tep.event_no " + "ORDER BY ash.total_plan_samples DESC, ash.total_operator_samples DESC", + lib::is_oracle_mode() ? "CAST(SUBSTR(TRIM(REPLACE(query_sql, CHR(10), '''')), 0, 55) AS VARCHAR2(64))" //plan_hash, %s AS query_sql + : "CAST(SUBSTR(TRIM(REPLACE(query_sql, CHAR(10), '''')), 1, 55) AS CHAR(64))", + lib::is_oracle_mode() ? "sys.gv$ob_sqlstat" : "oceanbase.gv$ob_sqlstat", //FROM %s) pc + lib::is_oracle_mode() ? "sys.gv$ob_sql_plan" : "oceanbase.gv$ob_sql_plan"))) { //FROM %s) sp + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char sql_id[64] = ""; + uint64_t event_rank = 0; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_PLAN_SAMPLES", total_plan_samples, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_EXEC_CNT", total_exec_cnt, int64_t); + EXTRACT_UINT_FIELD_FOR_ASH_STR(*result, "PLAN_HASH", plan_hash, uint64_t); + EXTRACT_UINT_FIELD_FOR_ASH(*result, "EVENT_RANK", event_rank, uint64_t); + + char activity_radio_char[64] = ""; + calc_ratio(total_plan_samples, num_samples, activity_radio_char); + if (event_rank > 1) { + //When event_rank > 1, + //plan_hash and total_plan_samples correspond to default value strings, + //cleanup meaningless results. + ASH_FIELD_CHAR(total_plan_samples)[0] = '\0'; + total_plan_samples = 0; + ASH_FIELD_CHAR(total_exec_cnt)[0] = '\0'; + total_exec_cnt = 0; + ASH_FIELD_CHAR(plan_hash)[0] = '\0'; + plan_hash = 0; + activity_radio_char[0] = '\0'; } - int64_t plan_id = 0; - char plan_id_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "PLAN_ID", plan_id, int64_t); - sprintf(plan_id_char, "%ld", plan_id); - - if (OB_FAIL(ret)) { - } else if (OB_FAIL(buff.append(" PLAN ID: "))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(plan_id_char))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); + tmp_real_str_len = 0; + char operator_char[256] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "OPERATOR", operator_char, 255, tmp_real_str_len); + if (tmp_real_str_len <= 0) { + snprintf(operator_char, 256, "UNDEFINED"); } + int64_t total_operator_samples = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TOTAL_OPERATOR_SAMPLES", total_operator_samples, int64_t); + char operator_radio_char[64] = ""; + calc_ratio(total_operator_samples, num_samples, operator_radio_char); + + tmp_real_str_len = 0; + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "EVENT", event_char, 63, tmp_real_str_len); + int64_t total_event_samples = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TOTAL_EVENT_SAMPLES", total_event_samples, int64_t); + char event_radio_char[64] = ""; + calc_ratio(total_event_samples, num_samples, event_radio_char); + + tmp_real_str_len = 0; + char query_sql[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "QUERY_SQL", query_sql, 63, tmp_real_str_len); + if (event_rank <= 1 && tmp_real_str_len <= 0) { + snprintf(query_sql, 256, "UNDEFINED"); + } + + if (OB_SUCC(ret)) { + const char *column_content[] = { + sql_id, ASH_FIELD_CHAR(plan_hash), ASH_FIELD_CHAR(total_plan_samples), activity_radio_char, + ASH_FIELD_CHAR(total_exec_cnt), + event_char, event_radio_char, + operator_char, operator_radio_char, + query_sql}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 0, 9))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_sql_with_top_operator( + const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, + ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top SQL with Top Operator"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "This Section lists the SQL statements that accounted for the highest percentages " + "of sampled session activity with sql operator"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Plan Hash: Numeric representation of the current SQL plan"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Active Samples: num of samples for top current SQL"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Activity: activity percentage for given SQL ID"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Sampled Executions: represents the number of times the current SQL execution has been sampled"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Top Operator: top operator name for current SQL plan"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Operator: activity percentage for given operator"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Top Event: top event name for current operator"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "% Event: activity percentage for given event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t tenant_id = MTL_ID(); + const int64_t column_size = 10; + const int64_t column_widths[column_size] = {40, 20, 14, 14, 14, 128, 14, 64, 14, 64}; + const char *column_headers[column_size] = { + "SQL ID", "Plan Hash", "Active Samples", "% Activity", "Sampled Executions", "Top Operator", "% Operator", "Top Event", "% Event", "SQL Text"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "WITH session_data AS (" + "SELECT sql_id, plan_hash, sql_plan_line_id, event_no, %s AS event, trace_id " + "FROM (", + lib::is_oracle_mode() ? "CAST(DECODE(event_no, 0, 'ON CPU', event) AS VARCHAR2(64))" + : "CAST(IF (event_no = 0, 'ON CPU', event) AS CHAR(64)) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append( + ") t " + "WHERE t.sql_id IS NOT NULL AND t.plan_hash IS NOT NULL AND t.sql_plan_line_id IS NOT NULL), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_event AS (" + "SELECT sql_id, plan_hash, sql_plan_line_id, event_no, event, " + "COUNT(*) AS total_event_samples, " + "ROW_NUMBER() OVER (PARTITION BY sql_id, plan_hash, sql_plan_line_id ORDER BY COUNT(*) DESC) AS event_rank " + "FROM session_data sd " + "GROUP BY sd.sql_id, sd.plan_hash, sd.sql_plan_line_id, sd.event_no, sd.event), "))) { + LOG_WARN("append top event string failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_operator AS (" + "SELECT sql_id, plan_hash, sql_plan_line_id, " + "SUM(total_event_samples) AS total_operator_samples, " + "ROW_NUMBER() OVER (PARTITION BY sql_id, plan_hash " + "ORDER BY SUM(total_event_samples) DESC) AS operator_rank " + "FROM top_event GROUP BY sql_id, plan_hash, sql_plan_line_id), "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "top_plan AS (" + "SELECT sql_id, plan_hash, COUNT(*) AS total_plan_samples, COUNT(DISTINCT trace_id) AS total_exec_cnt " + "FROM session_data GROUP BY sql_id, plan_hash " + "ORDER BY total_plan_samples DESC %s), ", + lib::is_oracle_mode() ? "FETCH FIRST 30 ROWS ONLY" : "LIMIT 30"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "top_ash AS (" + "SELECT te.sql_id AS sql_id, te.plan_hash AS plan_hash, " + "te.sql_plan_line_id AS sql_plan_line_id, " + "te.event AS event, " + "te.total_event_samples AS total_event_samples, " + "tsp.total_operator_samples AS total_operator_samples, " + "tsp.operator_rank AS operator_rank, " + "tp.total_plan_samples AS total_plan_samples, " + "tp.total_exec_cnt AS total_exec_cnt " + "FROM top_event te " + "JOIN top_operator tsp " + "ON te.sql_id = tsp.sql_id AND te.plan_hash = tsp.plan_hash AND te.sql_plan_line_id = tsp.sql_plan_line_id " + "JOIN top_plan tp " + "ON te.sql_id = tp.sql_id AND te.plan_hash = tp.plan_hash " + "WHERE tsp.operator_rank <= 5 AND te.event_rank <= 1) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "SELECT CASE WHEN ash.operator_rank > 1 THEN NULL ELSE ash.sql_id END AS SQL_ID, " + "CASE WHEN ash.operator_rank > 1 THEN NULL ELSE ash.plan_hash END AS PLAN_HASH, " + "ash.event AS EVENT, " + "ash.operator_rank AS OPERATOR_RANK, " + "ash.total_event_samples AS TOTAL_EVENT_SAMPLES, " + "ash.total_operator_samples AS TOTAL_OPERATOR_SAMPLES, " + "ash.total_plan_samples AS TOTAL_PLAN_SAMPLES, " + "CASE WHEN ash.operator_rank > 1 THEN NULL ELSE ash.total_exec_cnt END AS TOTAL_EXEC_CNT, " + "sp.operator AS OPERATOR, " + "CASE WHEN ash.operator_rank > 1 THEN NULL ELSE pc.query_sql END AS QUERY_SQL " + "FROM top_ash ash " + "LEFT JOIN (" + "SELECT DISTINCT sql_id, plan_hash, %s AS query_sql " + "FROM %s) pc " + "ON ash.sql_id = pc.sql_id AND ash.plan_hash = pc.plan_hash " + "LEFT JOIN (" + "SELECT DISTINCT plan_hash, sql_id, id, operator " + "FROM %s) sp " + "ON ash.sql_id = sp.sql_id AND ash.plan_hash = sp.plan_hash AND ash.sql_plan_line_id = sp.id " + "ORDER BY ash.total_plan_samples DESC, ash.total_operator_samples DESC", + lib::is_oracle_mode() ? "CAST(SUBSTR(TRIM(REPLACE(query_sql, CHR(10), '''')), 0, 55) AS VARCHAR2(64))" //plan_hash, %s AS query_sql + : "CAST(SUBSTR(TRIM(REPLACE(query_sql, CHAR(10), '''')), 1, 55) AS CHAR(64))", + lib::is_oracle_mode() ? "sys.gv$ob_sqlstat" : "oceanbase.gv$ob_sqlstat", //FROM %s) pc + lib::is_oracle_mode() ? "sys.gv$ob_sql_plan" : "oceanbase.gv$ob_sql_plan"))) { //FROM %s) sp + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char sql_id[64] = ""; + uint64_t operator_rank = 0; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_PLAN_SAMPLES", total_plan_samples, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "TOTAL_EXEC_CNT", total_exec_cnt, int64_t); + EXTRACT_UINT_FIELD_FOR_ASH_STR(*result, "PLAN_HASH", plan_hash, uint64_t); + EXTRACT_UINT_FIELD_FOR_ASH(*result, "OPERATOR_RANK", operator_rank, uint64_t); + + char activity_radio_char[64] = ""; + calc_ratio(total_plan_samples, num_samples, activity_radio_char); + if (operator_rank > 1) { + //When operator_rank > 1, + //plan_hash and total_plan_samples correspond to default value strings, + //cleanup meaningless results. + ASH_FIELD_CHAR(total_plan_samples)[0] = '\0'; + total_plan_samples = 0; + ASH_FIELD_CHAR(total_exec_cnt)[0] = '\0'; + total_exec_cnt = 0; + ASH_FIELD_CHAR(plan_hash)[0] = '\0'; + plan_hash = 0; + activity_radio_char[0] = '\0'; + } + + tmp_real_str_len = 0; + char operator_char[256] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "OPERATOR", operator_char, 255, tmp_real_str_len); + if (tmp_real_str_len <= 0) { + snprintf(operator_char, 256, "UNDEFINED"); + } + int64_t total_operator_samples = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TOTAL_OPERATOR_SAMPLES", total_operator_samples, int64_t); + char operator_radio_char[64] = ""; + calc_ratio(total_operator_samples, num_samples, operator_radio_char); + + tmp_real_str_len = 0; + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "EVENT", event_char, 63, tmp_real_str_len); + int64_t total_event_samples = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "TOTAL_EVENT_SAMPLES", total_event_samples, int64_t); + char event_radio_char[64] = ""; + calc_ratio(total_event_samples, num_samples, event_radio_char); + + tmp_real_str_len = 0; + char query_sql[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "QUERY_SQL", query_sql, 63, tmp_real_str_len); + if (operator_rank <= 1 && tmp_real_str_len <= 0) { + snprintf(query_sql, 256, "UNDEFINED"); + } + + if (OB_SUCC(ret)) { + const char *column_content[] = { + sql_id, ASH_FIELD_CHAR(plan_hash), ASH_FIELD_CHAR(total_plan_samples), activity_radio_char, ASH_FIELD_CHAR(total_exec_cnt), + operator_char, operator_radio_char, + event_char, event_radio_char, + query_sql}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 0, 9))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_sql_command_type(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top SQL Statement Types"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "this section lists top sql statement type."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "SQL Statement Type: SQL statement types such as SELECT or UPDATE"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Total Count: num of records during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Wait Event Count: num of records when session is on wait event"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "On CPU Count: num of records when session is on cpu"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Avg Active Sessions: average active sessions during ash report analysis time " + "period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "% Activity: activity(cpu + wait) percentage for given tenant"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "Equivalent Client Load: equivalent client average active sessions " + "during ash report analysis time period"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 6; + const int64_t column_widths[column_size] = {45, 18, 23, 19, 20, 11}; + const char *column_headers[column_size] = {"SQL Statement Type", "Total Count", + "Wait Event Count", "On CPU Count", "Avg Active Sessions", "% Activity"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt("SELECT STMT_TYPE, COUNT(*) AS CNT, %s FROM (", + lib::is_oracle_mode() + ? "sum(decode(event_no, 0, 1, 0)) as CPU_CNT, " + "sum(decode(event_no, 0, 0, 1)) as WAIT_CNT" + : "cast(sum(if(event_no = 0, 1, 0)) as signed integer) as CPU_CNT, " + "cast(sum(if(event_no = 0, 0, 1)) as signed integer) as WAIT_CNT"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(" and STMT_TYPE is not null) top_event GROUP BY " + "STMT_TYPE ORDER BY cnt DESC"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "STMT_TYPE", stmt_type, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CPU_CNT", cpu_cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "WAIT_CNT", wait_cnt, int64_t); + + char activity_radio_char[64] = ""; + calc_ratio(cnt, num_samples, activity_radio_char); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); + + if (OB_SUCC(ret)) { + const char *column_content[] = { + ObResolverUtils::get_stmt_type_string(static_cast(stmt_type)) + .ptr(), + ASH_FIELD_CHAR(cnt), ASH_FIELD_CHAR(wait_cnt), ASH_FIELD_CHAR(cpu_cnt), + avg_active_sessions_char, activity_radio_char}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } + with_color = !with_color; + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_plsql(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + uint64_t data_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(MTL_ID(), data_version))) { + LOG_WARN("get_min_data_version failed", K(ret), K(MTL_ID())); + } else if (data_version < DATA_VERSION_4_2_2_0 || + (DATA_VERSION_4_3_0_0 <= data_version && data_version < DATA_VERSION_4_3_5_0)) { + // do not support. + } else if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top PL/SQL Procedures"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "\"PL/SQL Entry Subprogram\" represents the application's top-level " + "entry-point(procedure, function, trigger, package initialization) into " + "PL/SQL."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "\"PL/SQL Current Subprogram\" is the pl/sql subprogram being executed at the " + "point of sampling . If the value is \"SQL\", it represents the percentage of " + "time spent executing SQL for the particular plsql entry subprogram."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "\"PL/SQL Entry Subprogram\" represents the application's top-level subprogram " + "name"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + const uint64_t tenant_id = MTL_ID(); + const int64_t column_size = 3; + const int64_t column_widths[column_size] = {60, 60, 20}; + const char *column_headers[column_size] = { + "PLSQL Entry Subprogram", "PLSQL Current Subprogram", "% Activity"}; + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(sql_string.append( + "SELECT OBJ_OWNER, OBJ_NAME, PLSQL_ENTRY_SUBPROGRAM_NAME, " + "PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, ENTRY_CNT " + "FROM (SELECT ash.*, obj.OWNER OBJ_OWNER, obj.OBJECT_NAME OBJ_NAME "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + "FROM (SELECT PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, " + "PLSQL_ENTRY_SUBPROGRAM_NAME, COUNT(1) AS ENTRY_CNT FROM (SELECT * FROM ("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(") WHERE PLSQL_ENTRY_OBJECT_ID > 0 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append( + ") top_event GROUP BY PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, " + "PLSQL_ENTRY_SUBPROGRAM_NAME) ash "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt( + "LEFT JOIN (select database_name owner, routine_name object_name, routine_id " + "object_id from %s db, %s r where r.database_id = db.database_id " + "union select database_name owner, package_name object_name, package_id " + "object_id from %s db, %s p where p.database_id = db.database_id) obj " + " ON ash.plsql_entry_object_id = obj.object_id " + "ORDER BY ENTRY_CNT DESC) v1 ", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT" + : "oceanbase.__all_database", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT" + : "oceanbase.__all_routine", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT" + : "oceanbase.__all_database", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT" + : "oceanbase.__all_package"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" WHERE ROWNUM <= 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char obj_owner[common::OB_MAX_DATABASE_NAME_LENGTH + 1] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "OBJ_OWNER", obj_owner, + common::OB_MAX_DATABASE_NAME_LENGTH, tmp_real_str_len); + + tmp_real_str_len = 0; + char obj_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "OBJ_NAME", obj_name, common::OB_MAX_ROUTINE_NAME_LENGTH, tmp_real_str_len); + + tmp_real_str_len = 0; + char subpro_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = "\0"; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "PLSQL_ENTRY_SUBPROGRAM_NAME", subpro_name, + common::OB_MAX_ROUTINE_NAME_LENGTH, tmp_real_str_len); + + int64_t plsql_entry_object_id = 0; + char plsql_entry_object_id_char[64] = ""; + EXTRACT_INT_FIELD_FOR_ASH(*result, "PLSQL_ENTRY_OBJECT_ID", plsql_entry_object_id, int64_t); + sprintf(plsql_entry_object_id_char, "%ld", plsql_entry_object_id); + + int64_t plsql_entry_subprogram_id = 0; + char plsql_entry_subprogram_id_char[64] = ""; + EXTRACT_INT_FIELD_FOR_ASH( + *result, "PLSQL_ENTRY_SUBPROGRAM_ID", plsql_entry_subprogram_id, int64_t); + sprintf(plsql_entry_subprogram_id_char, "%ld", plsql_entry_subprogram_id); + int64_t event_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*result, "ENTRY_CNT", event_cnt, int64_t); + + char entry_activity[64] = ""; + double entry_act = static_cast(event_cnt) / num_events; + entry_act = round(100 * 100 * entry_act) / 100; + sprintf(entry_activity, "%.2f%%", entry_act); + + char pl_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = ""; + if ('\0' == subpro_name[0]) { + sprintf(pl_name, "%s.%s", obj_owner, obj_name); + } else { + sprintf(pl_name, "%s.%s.%s", obj_owner, obj_name, subpro_name); + } + + if (OB_SUCC(ret)) { + const char *column_content[] = {pl_name, "-", entry_activity}; + if (OB_FAIL(print_section_column_row( + ash_report_params, buff, column_size, column_content, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } + } + + if (OB_SUCC(ret)) { + HEAP_VARS_2((ObISQLClient::ReadResult, sub_res), (ObSqlString, sub_sql_string)) + { + ObMySQLResult *sub_result = nullptr; + if (OB_FAIL(sub_sql_string.append( + "SELECT OBJ_OWNER, OBJ_NAME, PLSQL_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, " + "PLSQL_SUBPROGRAM_ID, SUB_CNT " + "FROM (SELECT ash.*, obj.OWNER OBJ_OWNER, obj.OBJECT_NAME OBJ_NAME "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append( + " FROM (SELECT PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, " + "PLSQL_SUBPROGRAM_NAME, COUNT(1) AS SUB_CNT FROM (SELECT * FROM " + "("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sub_sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(") WHERE PLSQL_ENTRY_OBJECT_ID = "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(plsql_entry_object_id_char))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(" AND PLSQL_ENTRY_SUBPROGRAM_ID = "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(plsql_entry_subprogram_id_char))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && + OB_FAIL(sql_string.append(" AND PLSQL_OBJECT_ID > 0 AND ((time_model & " + "4096) > 0 OR (time_model & 2048) > 0 ) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && + OB_FAIL( + sql_string.append(" AND PLSQL_OBJECT_ID > 0 AND (BITAND(TIME_MODEL, " + "4096) > 0 OR BITAND(TIME_MODEL, 2048) > 0) "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append( + ") top_event GROUP BY PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, " + "PLSQL_SUBPROGRAM_NAME) ash "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append_fmt( + " LEFT JOIN " + " (select database_name owner, routine_name object_name, routine_id " + "object_id from %s db, %s r where r.database_id = db.database_id " + "union select database_name owner, package_name object_name, " + "package_id object_id from %s db, %s p where p.database_id = " + "db.database_id) obj " + " ON ash.plsql_object_id = obj.object_id ORDER BY SUB_CNT DESC) v1 ", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT" + : "oceanbase.__all_database", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT" + : "oceanbase.__all_routine", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT" + : "oceanbase.__all_database", + lib::is_oracle_mode() ? "SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT" + : "oceanbase.__all_package"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && + OB_FAIL(sql_string.append(" WHERE ROWNUM <= 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(sub_res, tenant_id, sub_sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(sub_result = sub_res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(sub_result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char sub_obj_owner[common::OB_MAX_DATABASE_NAME_LENGTH + 1] = "\0"; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*sub_result, "OBJ_OWNER", sub_obj_owner, + common::OB_MAX_DATABASE_NAME_LENGTH, tmp_real_str_len); + + tmp_real_str_len = 0; + char sub_obj_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = "\0"; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*sub_result, "OBJ_NAME", sub_obj_name, + common::OB_MAX_ROUTINE_NAME_LENGTH, tmp_real_str_len); + + tmp_real_str_len = 0; + char subpro_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = "\0"; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*sub_result, "PLSQL_SUBPROGRAM_NAME", + subpro_name, common::OB_MAX_ROUTINE_NAME_LENGTH, tmp_real_str_len); + int64_t plsql_subprogram_id = 0; + char plsql_subprogram_id_char[64] = ""; + EXTRACT_INT_FIELD_FOR_ASH( + *sub_result, "PLSQL_SUBPROGRAM_ID", plsql_subprogram_id, int64_t); + sprintf(plsql_subprogram_id_char, "%ld", plsql_subprogram_id); + int64_t sub_event_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*sub_result, "SUB_CNT", sub_event_cnt, int64_t); + + char sub_activity[64] = ""; + double sub_act = static_cast(sub_event_cnt) / num_events; + sub_act = round(100 * 100 * sub_act) / 100; + sprintf(sub_activity, "%.2f%%", sub_act); + + char sub_pl_name[common::OB_MAX_ROUTINE_NAME_LENGTH + 1] = "\0"; + if ('\0' == subpro_name[0]) { + sprintf(sub_pl_name, "%s.%s", obj_owner, obj_name); + } else { + sprintf(sub_pl_name, "%s.%s.%s", obj_owner, obj_name, subpro_name); + } + + if (OB_SUCC(ret) && sub_event_cnt > 0) { + const char *column_content[] = {"-", sub_pl_name, sub_activity}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + if (OB_SUCC(ret)) { + sub_sql_string.reset(); + if (OB_FAIL(sub_sql_string.append(" SELECT COUNT(1) AS SQL_CNT FROM ("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL( + append_fmt_ash_view_sql(ash_report_params, sub_sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(") WHERE PLSQL_ENTRY_OBJECT_ID = "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(plsql_entry_object_id_char))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL( + sub_sql_string.append(" AND PLSQL_ENTRY_SUBPROGRAM_ID = "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sub_sql_string.append(plsql_entry_subprogram_id_char))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && + OB_FAIL( + sql_string.append(" AND (time_model & 16) > 0 AND (time_model & " + "4096) = 0 AND (time_model & 2048) = 0 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && + OB_FAIL(sql_string.append( + " AND BITAND(TIME_MODEL, 16) > 0 AND BITAND(TIME_MODEL, 4096) = " + "0 AND BITAND(TIME_MODEL, 4096) = 0 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(sub_res, tenant_id, sub_sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(sub_result = sub_res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + if (OB_FAIL(sub_result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t sql_event_cnt = 0; + EXTRACT_INT_FIELD_FOR_ASH(*sub_result, "SQL_CNT", sql_event_cnt, int64_t); + + if (sql_event_cnt > 0) { + char sql_activity[64] = ""; + double sql_act = static_cast(sql_event_cnt) / num_events; + sql_act = round(100 * 100 * sql_act) / 100; + sprintf(sql_activity, "%.2f%%", sql_act); + if (OB_SUCC(ret)) { + const char *column_content[] = {"-", "SQL", sql_activity}; + if (OB_FAIL(print_section_column_row(ash_report_params, buff, + column_size, column_content, column_widths, true))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + } + } + } + } + } + } // end while + + if (OB_SUCC(ret)) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_sql_text(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + const int64_t column_size = 2; + const int64_t column_widths[column_size] = {64, 64}; + const char *column_headers[column_size] = {"SQL ID", "SQL Text"}; + + bool with_color = true; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy_ is nullptr", K(ret)); + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Complete List of SQL Text"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else { + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + const uint64_t tenant_id = MTL_ID(); + HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) + { + ObMySQLResult *result = nullptr; + if (OB_FAIL(sql_string.append("SELECT SQL_ID, SUBSTR(QUERY_SQL, 1 ,4000) AS QUERY_SQL FROM " + "(SELECT pc.SQL_ID SQL_ID, pc.QUERY_SQL QUERY_SQL "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append("FROM (SELECT SQL_ID, COUNT(*) AS CNT FROM ("))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { + LOG_WARN("failed to append fmt ash view sql", K(ret)); + } else if (OB_FAIL(sql_string.append(" and sql_id is not null) top_event GROUP BY SQL_ID " + "ORDER BY CNT DESC) ash "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_string.append_fmt("LEFT JOIN %s pc ON ash.sql_id = pc.sql_id ORDER BY " + "cnt DESC) WHERE QUERY_SQL is not null ", + lib::is_oracle_mode() + ? "(SELECT * FROM (SELECT SQL_ID, QUERY_SQL, ROW_NUMBER() " + "OVER (PARTITION BY SQL_ID ORDER BY SQL_ID) AS N FROM " + "SYS.GV$OB_SQLSTAT) WHERE N = 1)" + : "(SELECT distinct SQL_ID, QUERY_SQL FROM oceanbase.GV$OB_SQLSTAT)"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" AND ROWNUM <= 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" LIMIT 50 "))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { + LOG_WARN("failed to execute sql", KR(ret), K(tenant_id), K(sql_string)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + } else { + if (OB_SUCC(ret) && ash_report_params.is_html) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + int64_t tmp_real_str_len = 0; + char sql_id[65] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SQL_ID", sql_id, 64, tmp_real_str_len); HEAP_VAR(char[4005], sql_text) { sql_text[0] = '\0'; EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( *result, "QUERY_SQL", sql_text, 4000, tmp_real_str_len); - if (OB_FAIL(ret)) { - } else if (OB_FAIL(buff.append("SQL Text: "))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(sql_text))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); + if (!ash_report_params.is_html) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(buff.append(" SQL ID: "))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(buff.append(sql_id))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(buff.append("SQL Text: "))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(buff.append(sql_text))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } else { + const char *column_content[] = {sql_id, sql_text}; + if (OB_FAIL(print_sqltext_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color))) { + LOG_WARN("failed to format row", K(ret)); + } else { + with_color = !with_color; + } } } @@ -1538,71 +3960,644 @@ int ObDbmsWorkloadRepository::print_ash_sql_text_list( } // end while } } + if (OB_SUCC(ret) && ash_report_params.is_html) { + if (OB_FAIL(print_section_column_end(ash_report_params, buff, column_size, column_widths))) { + LOG_WARN("failed to format row", K(ret)); + } + } } return ret; } -int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams &ash_report_params, - const int64_t num_samples, const int64_t num_events, const int64_t dur_elapsed_time, - ObStringBuffer &buff) +inline int cast_otimestamp_mydatetime(const ObObj &in, int64_t &out, + const ObDbmsWorkloadRepository::AshReportParams &ash_report_params) +{ + int ret = OB_SUCCESS; + int64_t dt_value = 0; + int64_t utc_value = 0; + if (OB_FAIL(ObTimeConverter::otimestamp_to_odate( + in.get_type(), in.get_otimestamp_value(), ash_report_params.tz_info, dt_value))) { + LOG_WARN("fail to timestamp_tz_to_timestamp", K(ret), K(in)); + } else if (OB_FAIL(ObTimeConverter::datetime_to_timestamp( + dt_value, ash_report_params.tz_info, utc_value))) { + LOG_WARN("failed to convert datetime to timestamp", K(ret)); + } else { + out = utc_value; + } + return ret; +} + +int ObDbmsWorkloadRepository::process_ash_report_params( + const uint64_t data_version, const sql::ParamStore ¶ms, AshReportParams &ash_report_params) +{ + int ret = OB_SUCCESS; + if (data_version < DATA_VERSION_4_3_0_0) { + // v4.2 + if ((5 == params.count() && data_version < MOCK_DATA_VERSION_4_2_3_0) || + (7 == params.count() && data_version >= MOCK_DATA_VERSION_4_2_3_0 && data_version < MOCK_DATA_VERSION_4_2_4_0) || + (9 == params.count() && data_version >= MOCK_DATA_VERSION_4_2_4_0)) { + //do nothing + } else { + ret = OB_INVALID_ARGUMENT_NUM; + LOG_WARN("parameters number is wrong", K(ret), K(params.count()), K(data_version)); + } + } else { + // v4.3 + if ((5 == params.count() && data_version < DATA_VERSION_4_3_5_0) || + (9 == params.count() && data_version >= DATA_VERSION_4_3_5_0)) { + //do nothing + } else { + ret = OB_INVALID_ARGUMENT_NUM; + LOG_WARN("parameters number is wrong", K(ret), K(params.count()), K(data_version)); + } + } + + if (OB_SUCC(ret)) { + if (params.at(0).is_null()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("first parameters is null", K(ret), K(params.at(0))); + } else if (params.at(1).is_null()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("second parameters is null", K(ret), K(params.at(1))); + } else if (OB_FAIL(params.at(2).get_string(ash_report_params.sql_id))) { + LOG_WARN("failed to get sql id from params", K(ret), K(params.at(2))); + } else if (OB_FAIL(params.at(3).get_string(ash_report_params.trace_id))) { + LOG_WARN("failed to get trace id from params", K(ret), K(params.at(3))); + } else if (OB_FAIL(params.at(4).get_string(ash_report_params.wait_class))) { + LOG_WARN("failed to get wait class from params", K(ret), K(params.at(4))); + } else { + + if (lib::is_oracle_mode()) { + if (OB_FAIL(cast_otimestamp_mydatetime( + params.at(0), ash_report_params.ash_begin_time, ash_report_params))) { + LOG_WARN("failed to convert otimestamp", K(ret)); + } else if (OB_FAIL(cast_otimestamp_mydatetime( + params.at(1), ash_report_params.ash_end_time, ash_report_params))) { + LOG_WARN("failed to convert otimestamp", K(ret)); + } + } else { + ash_report_params.ash_begin_time = params.at(0).get_timestamp(); + ash_report_params.ash_end_time = params.at(1).get_timestamp(); + } + + ash_report_params.user_input_ash_begin_time = ash_report_params.ash_begin_time; + ash_report_params.user_input_ash_end_time = ash_report_params.ash_end_time; + + if ((7 >= params.count() && 5 < params.count()) && + ((data_version >= MOCK_DATA_VERSION_4_2_3_0 && data_version < DATA_VERSION_4_3_0_0) || + data_version >= DATA_VERSION_4_3_5_0)) { + if (OB_FAIL(params.at(5).get_string(ash_report_params.svr_ip))) { + LOG_WARN("failed to get svr_ip from params", K(ret), K(params.at(5))); + } + if (OB_SUCC(ret) && !params.at(6).is_null()) { + if (lib::is_oracle_mode()) { + if (!params.at(6).get_number().is_valid_int64(ash_report_params.port)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cast svr prot to int_64 fail", K(ret)); + } + } else { + ash_report_params.port = params.at(6).get_int(); + } + } else { + ash_report_params.port = -1; + } + } + if (OB_FAIL(ret)) { + } else if (9 == params.count() && data_version >= MOCK_DATA_VERSION_4_2_4_0) { + ObString tmp; + if (OB_FAIL(params.at(8).get_string(tmp))) { + LOG_WARN("failed to get report_type from params", K(ret), K(params.at(8))); + } else if (0 == strncmp("text", tmp.ptr(), 4)) { + ash_report_params.is_html = false; + } else { + ash_report_params.is_html = true; + } + if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && !params.at(7).is_null()) { + if (lib::is_oracle_mode()) { + if (!params.at(7).get_number().is_valid_int64(ash_report_params.tenant_id)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cast svr prot to int_64 fail", K(ret)); + } + } else { + ash_report_params.tenant_id = params.at(7).get_int(); + } + + if (MTL_ID() != OB_SYS_TENANT_ID && ash_report_params.tenant_id != MTL_ID()) { + ret = OB_OP_NOT_ALLOW; + LOG_WARN("User tenants cannot view other tenants' ASH Reports", KR(ret), K(ash_report_params.tenant_id), K(MTL_ID())); + LOG_USER_ERROR(OB_OP_NOT_ALLOW, "User tenants cannot view other tenants' ASH Reports"); + } + } else { + ash_report_params.tenant_id = 0; + } + } + } + } + } else { + ret = OB_INVALID_ARGUMENT_NUM; + LOG_WARN("parameters number is wrong", K(ret), K(params.count()), K(data_version), + K(DATA_VERSION_4_2_2_0)); + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_report_header( + const AshReportParams &ash_report_params, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("ASH Report \ + \n \ + \ + \ +

    \ + ASH Report \ +

    "))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } else { + if (OB_FAIL(buff.append("\nASH Report\n\n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_section_header( + const AshReportParams &ash_report_params, ObStringBuffer &buff, const char *str) +{ + int ret = OB_SUCCESS; + ash_report_params.section_cnt_ ++; + SMART_VAR(ObSqlString, temp_string) + { + if (ash_report_params.is_html) { + if (OB_FAIL(temp_string.append_fmt("\ +

    %s

    ", + str, str))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL(temp_string.append_fmt("\n%s:\n", str))) { + LOG_WARN("failed to format string", K(ret)); + } + } + if (OB_SUCC(ret) && OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_section_column_header(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool need_merge_table /*=false*/) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + SMART_VAR(ObSqlString, temp_string) + { + if (OB_FAIL(temp_string.append_fmt("", + need_merge_table ? "merge_" : "", ash_report_params.section_cnt_))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + for (int i = 0; i < column_size && OB_SUCC(ret); i++) { + if (OB_FAIL(temp_string.append_fmt( + "", column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(""))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + } else { + if (OB_FAIL(print_text_table_frame(column_size, column_widths, buff))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(format_row(column_size, column_contents, column_widths, " ", "|", buff))) { + LOG_WARN("failed to format row", K(ret)); + } else if (OB_FAIL(print_text_table_frame(column_size, column_widths, buff))) { + LOG_WARN("failed to format row", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], const int64_t column_widths[], bool with_color) +{ + int ret = OB_SUCCESS; + const char *color_class = with_color ? "ash_htmlc" : "ash_htmlnc"; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append(""))) { + LOG_WARN("failed to append string into buff", K(ret)); + } else { + SMART_VAR(ObSqlString, temp_string) + { + for (int i = 0; i < column_size && OB_SUCC(ret); i++) { + if (i == 0) { + if (OB_FAIL(temp_string.append_fmt("", + color_class, column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL(temp_string.append_fmt("", + color_class, column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + } else { + if (OB_FAIL(format_row( + column_size, column_contents, column_widths, " ", "|", buff))) { + LOG_WARN("failed to format row", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_sql_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool with_color, int sql_id_column, int query_column) +{ + int ret = OB_SUCCESS; + const char *color_class = with_color ? "ash_htmlc" : "ash_htmlnc"; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append(""))) { + LOG_WARN("failed to append string into buff", K(ret)); + } else { + SMART_VAR(ObSqlString, temp_string) + { + for (int i = 0; i < column_size && OB_SUCC(ret); i++) { + if (column_contents[query_column][0] != '\0' && i == sql_id_column) { + if (i == 0) { + if (OB_FAIL(temp_string.append_fmt("", + color_class, column_contents[i], column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL( + temp_string.append_fmt("", + color_class, column_contents[i], column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } + } else { + if (i == 0) { + if (OB_FAIL(temp_string.append_fmt( + "", color_class, column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL(temp_string.append_fmt( + "", color_class, column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + } else { + if (OB_FAIL(format_row( + column_size, column_contents, column_widths, " ", "|", buff))) { + LOG_WARN("failed to format row", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_sqltext_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool with_color) +{ + int ret = OB_SUCCESS; + const char *color_class = with_color ? "ash_htmlc" : "ash_htmlnc"; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append(""))) { + LOG_WARN("failed to append string into buff", K(ret)); + } else { + SMART_VAR(ObSqlString, temp_string) + { + for (int i = 0; i < column_size && OB_SUCC(ret); i++) { + if (i == 0) { + if (OB_FAIL(temp_string.append_fmt( + "\n", + color_class, column_contents[i], column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL(temp_string.append_fmt( + "\n", color_class, column_contents[i]))) { + LOG_WARN("failed to format string", K(ret)); + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + } else { + if (OB_FAIL(format_row( + column_size, column_contents, column_widths, " ", "|", buff))) { + LOG_WARN("failed to format row", K(ret)); + } + } + return ret; +} + + +int ObDbmsWorkloadRepository::print_section_column_end(const AshReportParams &ash_report_params, ObStringBuffer &buff, const int64_t column_size, const int64_t column_widths[]) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("
    %s
    %s%s
    %s%s%s%s
    %s%s

    \n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } else { + if (OB_FAIL(print_text_table_frame(column_size, column_widths, buff))) { + LOG_WARN("failed to format row", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_ash_report_end( + const AshReportParams &ash_report_params, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("End of Report"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_text_table_frame(const int64_t column_size, const int64_t column_widths[], ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(buff.append("+"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < column_size; i++) { + if (OB_FAIL(lpad("-", column_widths[i], "-", buff))) { + LOG_WARN("failed to calc lpad ", K(i), K(ret)); + } else if (OB_FAIL(buff.append("+"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append("\n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_section_explaination_begin( + const AshReportParams &ash_report_params, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("

      "))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } else { + // do noting + } + return ret; +} + +int ObDbmsWorkloadRepository::print_section_explaination_end( + const AshReportParams &ash_report_params, ObStringBuffer &buff) +{ + int ret = OB_SUCCESS; + if (ash_report_params.is_html) { + if (OB_FAIL(buff.append("
    \n"))) { + LOG_WARN("failed to append string into buff", K(ret)); + } + } else { + // do noting + } + return ret; +} + +int ObDbmsWorkloadRepository::insert_section_explaination_line( + const AshReportParams &ash_report_params, ObStringBuffer &buff, const char *str) +{ + int ret = OB_SUCCESS; + ash_report_params.section_cnt_ ++; + SMART_VAR(ObSqlString, temp_string) + { + if (ash_report_params.is_html) { + if (OB_FAIL(temp_string.append_fmt( + "
  • %s
  • \n", str))) { + LOG_WARN("failed to format string", K(ret)); + } + } else { + if (OB_FAIL(temp_string.append_fmt(" - %s\n", str))) { + LOG_WARN("failed to format string", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(buff.append(temp_string.ptr(), temp_string.length()))) { + LOG_WARN("failed to push string into buff", K(ret)); + } + } + } + return ret; +} + +int ObDbmsWorkloadRepository::print_top_blocking_session(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) { int ret = OB_SUCCESS; if (OB_ISNULL(GCTX.sql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { + } else if (OB_FAIL(print_section_header(ash_report_params, buff, "Top Blocking Sessions"))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top Sessions:\n"))) { + } else if (OB_FAIL(print_section_explaination_begin(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - ''# Samples Active'' shows the number of ASH samples in which " - "the blocking session was found active.\n"))) { + } else if (OB_FAIL(insert_section_explaination_line( + ash_report_params, buff, "Blocking session activity percentages are calculated with respect to waits on enqueues, latches and \"buffer busy\" only."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "'% Activity' represents the load on the database caused by a particular blocking session"))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(insert_section_explaination_line(ash_report_params, buff, + "'# Avg Active Sessions' shows the number of ASH samples in which the blocking session was found active."))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { + LOG_WARN("failed to push string into buff", K(ret)); + } else if (OB_FAIL(print_section_explaination_end(ash_report_params, buff))) { LOG_WARN("failed to push string into buff", K(ret)); } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - - const char *table_top[] = {"-", "-", "-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {20, 22, 40, 12, 30, 20, 30}; - const char *column_headers[] = { - "Sid", "% Activity", "Event", "Event Count", "% Event", "User", "# Samples Active"}; + ObOracleSqlProxy oracle_proxy(*(static_cast(GCTX.sql_proxy_))); + ObCommonSqlProxy *sql_proxy = + lib::is_oracle_mode() ? &oracle_proxy : static_cast(GCTX.sql_proxy_); + bool with_color = true; + const uint64_t request_tenant_id = MTL_ID(); + const int64_t column_size = 7; + const int64_t column_widths[column_size] = {20, 64, 20, 64, 13, 11, 20}; + const char *column_headers[column_size] = {"Blocking Session ID", "Event Name", "Holder TX ID", "Holder SQL ID","Event Count", "% Activity", "Avg Active Sessions"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(print_section_column_header( + ash_report_params, buff, column_size, column_headers, column_widths))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 7 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append( - "SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, user_name USER_NAME "))) { + } else if (OB_FAIL(sql_string.append("SELECT * FROM ( SELECT "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - " FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, CAST(SUM("))) { + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append(" (SELECT SQL_ID FROM ( SELECT SQL_ID FROM SYS.GV$OB_SQL_AUDIT WHERE SID = blocking_session_id and tx_id = holder_tx_id and SEQ_NUM <= holder_data_seq order by SEQ_NUM desc ) WHERE ROWNUM <= 1) AS HOLDER_SQL_ID, "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append(" (SELECT SQL_ID FROM GV$OB_SQL_AUDIT WHERE SID = blocking_session_id and tx_id = holder_tx_id and SEQ_NUM <= holder_data_seq order by SEQ_NUM desc limit 1) AS HOLDER_SQL_ID, "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - ")AS SIGNED INTEGER) EVENT_CNT, COUNT(1) SAMPLE_CNT FROM ("))) { + } else if (OB_FAIL(sql_string.append( " BLOCKING_SESSION_ID, EVENT, HOLDER_TX_ID, CNT FROM ( SELECT blocking_session_id, event, p1 as holder_tx_id, p2 as holder_data_seq, COUNT(*) AS CNT FROM ( "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL(sql_string.append( - ") top_event GROUP BY SESSION_ID, USER_ID, EVENT "))) { + " and blocking_session_id != 0 and event_id = 14003) top_event " + "GROUP BY top_event.blocking_session_id, top_event.event, top_event.p1, top_event.p2 " + "having count(*) >= 1) "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt( - "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { + } else if (lib::is_oracle_mode() && OB_FAIL(sql_string.append("ORDER BY CNT DESC) WHERE ROWNUM <= 30 "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { + } else if (!lib::is_oracle_mode() && OB_FAIL(sql_string.append("ORDER BY CNT DESC LIMIT 30) "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); + } else if (OB_FAIL(sql_proxy->read(res, request_tenant_id, sql_string.ptr()))) { + LOG_WARN("falied to execute sql", KR(ret), K(request_tenant_id), K(sql_string)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); + LOG_WARN("fail to get mysql result", KR(ret), K(request_tenant_id), K(sql_string)); } else { while (OB_SUCC(ret)) { if (OB_FAIL(result->next())) { @@ -1613,55 +4608,40 @@ int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams & LOG_WARN("fail to get next row", KR(ret)); } } else { - int64_t session_id = 0; - char session_id_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SESSION_ID", session_id, int64_t); - sprintf(session_id_char, "%ld", session_id); - - int64_t sample_cnt = 0; - char sample_radio_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SAMPLE_CNT", sample_cnt, int64_t); - double sample_radio = static_cast(sample_cnt) / num_samples; - sample_radio = round(100 * 100 * sample_radio) / 100; - sprintf(sample_radio_char, "%.2f%%", sample_radio); - int64_t tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); + char event_char[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event_char, 64, tmp_real_str_len); + char sql_id[64] = ""; + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "HOLDER_SQL_ID", sql_id, 64, tmp_real_str_len); + + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "BLOCKING_SESSION_ID", blocking_session_id, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "CNT", cnt, int64_t); + EXTRACT_INT_FIELD_FOR_ASH_STR(*result, "HOLDER_TX_ID", holder_tx_id, int64_t); + - int64_t event_cnt = 0; - char event_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - sprintf(event_cnt_char, "%ld", event_cnt); char event_radio_char[64] = ""; - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(100 * 100 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); - - tmp_real_str_len = 0; - char user_name[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "USER_NAME", user_name, 64, tmp_real_str_len); - - char sample_active_char[64] = ""; - double sample_active_radio = static_cast(event_cnt) / dur_elapsed_time; - sample_active_radio = round(100 * 100 * sample_active_radio) / 100; - sprintf(sample_active_char, "%ld/%ld[%.2f%%]", event_cnt, dur_elapsed_time, - sample_active_radio); + calc_ratio(cnt, num_samples, event_radio_char); + char avg_active_sessions_char[64] = ""; + calc_avg_avtive_sessions(cnt, + (ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000, + avg_active_sessions_char); if (OB_SUCC(ret)) { - const char *column_content[] = {session_id_char, sample_radio_char, event, - event_cnt_char, event_radio_char, user_name, sample_active_char}; - if (OB_FAIL(format_row( - 7 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + const char *column_content[] = {ASH_FIELD_CHAR(blocking_session_id), event_char, + ASH_FIELD_CHAR(holder_tx_id), sql_id, ASH_FIELD_CHAR(cnt), event_radio_char, + avg_active_sessions_char}; + if (OB_FAIL(print_sql_section_column_row(ash_report_params, buff, column_size, + column_content, column_widths, with_color, 3, 3))) { LOG_WARN("failed to format row", K(ret)); } + with_color = !with_color; } } } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL( + print_section_column_end(ash_report_params, buff, column_size, column_widths))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1671,323 +4651,5 @@ int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams & return ret; } -int ObDbmsWorkloadRepository::print_ash_top_blocking_session_info( - const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, - const int64_t dur_elapsed_time, ObStringBuffer &buff) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(GCTX.sql_proxy_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top Blocking Sessions:\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - Blocking session activity percentages are calculated with " - "respect to waits on latches and locks only. \n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append(" - ''# Samples Active'' shows the number of ASH samples in which " - "the session was found waiting" - " for that particular event. The percentage shown in this column " - "is calculated with respect to wall time.\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {20, 22, 40, 12, 30, 20, 30}; - const char *column_headers[] = {"Blocking Sid", "% Activity", "Event Caused", "Event Count", - "% Event", "User", "# Samples Active"}; - HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) - { - ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 7 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append( - "SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, user_name USER_NAME "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - " FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, CAST(SUM("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append(FILTER_EVENT_STR))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - ")AS SIGNED INTEGER) AS EVENT_CNT, COUNT(1) SAMPLE_CNT FROM ("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { - LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(" ) top_event WHERE wait_class_id != 100 GROUP BY " - "SESSION_ID, USER_ID, EVENT "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt( - "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); - } else if (OB_ISNULL(result = res.get_result())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); - } else { - while (OB_SUCC(ret)) { - if (OB_FAIL(result->next())) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - break; - } else { - LOG_WARN("fail to get next row", KR(ret)); - } - } else { - int64_t session_id = 0; - char session_id_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SESSION_ID", session_id, int64_t); - sprintf(session_id_char, "%ld", session_id); - - int64_t sample_cnt = 0; - char sample_radio_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SAMPLE_CNT", sample_cnt, int64_t); - double sample_radio = static_cast(sample_cnt) / num_samples; - sample_radio = round(100 * 100 * sample_radio) / 100; - sprintf(sample_radio_char, "%.2f%%", sample_radio); - - int64_t tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); - - int64_t event_cnt = 0; - char event_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); - sprintf(event_cnt_char, "%ld", event_cnt); - char event_radio_char[64] = ""; - double event_radio = static_cast(event_cnt) / num_events; - event_radio = round(100 * 100 * event_radio) / 100; - sprintf(event_radio_char, "%.2f%%", event_radio); - - tmp_real_str_len = 0; - char user_name[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "USER_NAME", user_name, 64, tmp_real_str_len); - - char sample_active_char[64] = ""; - double sample_active_radio = static_cast(event_cnt) / dur_elapsed_time; - sample_active_radio = round(100 * 100 * sample_active_radio) / 100; - sprintf(sample_active_char, "%ld/%ld[%.2f%%]", event_cnt, dur_elapsed_time, - sample_active_radio); - - if (OB_SUCC(ret)) { - const char *column_content[] = {session_id_char, sample_radio_char, event, - event_cnt_char, event_radio_char, user_name, sample_active_char}; - if (OB_FAIL(format_row( - 7 /*column_size*/, column_content, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } // end while - - if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(7 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } - } - return ret; -} - -int ObDbmsWorkloadRepository::print_ash_top_latches_info( - const AshReportParams &ash_report_params, const int64_t num_samples, ObStringBuffer &buff) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(GCTX.sql_proxy_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Top latches:\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - - const char *table_top[] = {"-", "-", "-"}; - const int64_t column_widths[] = {40, 20, 20}; - const char *column_headers[] = {"Latch", "Sampled Count", "% Activity"}; - HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) - { - ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row( - 3 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append( - "SELECT * FROM (SELECT EVENT, COUNT(1) SAMPLE_CNT FROM ("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { - LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(" ) top_event WHERE wait_class_id = 104 AND" - " SUBSTR(event, 1, 6) = 'latch:' "))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT " - "ORDER BY SAMPLE_CNT DESC) LIMIT 100"))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), - K(sql_string)); - } else if (OB_ISNULL(result = res.get_result())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); - } else { - while (OB_SUCC(ret)) { - if (OB_FAIL(result->next())) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - break; - } else { - LOG_WARN("fail to get next row", KR(ret)); - } - } else { - int64_t tmp_real_str_len = 0; - char event[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); - int64_t sample_cnt = 0; - char sample_cnt_char[64] = ""; - char sample_radio_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SAMPLE_CNT", sample_cnt, int64_t); - sprintf(sample_cnt_char, "%ld", sample_cnt); - - double sample_radio = static_cast(sample_cnt) / num_samples; - sample_radio = round(100 * 100 * sample_radio) / 100; - sprintf(sample_radio_char, "%.2f%%", sample_radio); - - if (OB_SUCC(ret)) { - const char *column_content[] = {event, sample_cnt_char, sample_radio_char}; - if (OB_FAIL(format_row( - 3 /*column_size*/, column_content, column_widths, " ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } // end while - - if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } - } - return ret; -} -int ObDbmsWorkloadRepository::print_ash_node_load( - const AshReportParams &ash_report_params, - ObStringBuffer &buff) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(GCTX.sql_proxy_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sql_proxy_ is nullptr", K(ret)); - } else if (OB_FAIL(buff.append("\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else if (OB_FAIL(buff.append("## Node Load:\n"))) { - LOG_WARN("failed to push string into buff", K(ret)); - } else { - common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; - const uint64_t tenant_id = MTL_ID(); - - const char* table_top[] = {"-", "-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 20, 20, 20, 30}; - const char* column_headers[] = {"SVR IP", "SVR PORT", "Sampled Count", "Idle Wait Count", "Load"}; - - double duration = static_cast(ash_report_params.ash_end_time - ash_report_params.ash_begin_time) / 1000000; - HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { - ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(5/*column_size*/, table_top,column_widths,"-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(5/*column_size*/, column_headers,column_widths," ", "|",buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(5/*column_size*/, table_top,column_widths,"-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(sql_string.append("SELECT SVR_IP, SVR_PORT, count(1) AS SAMPLE_CNT , " - " CAST(SUM(CASE WHEN wait_class_id = 106 " - " THEN 1 ELSE 0 END) AS SIGNED INTEGER) AS IDLE_WAIT_CNT" - " FROM ("))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { - LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(" ) top_event GROUP BY SVR_IP, SVR_PORT"))) { - LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { - LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), K(sql_string)); - } else if (OB_ISNULL(result = res.get_result())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql_string)); - } else { - while (OB_SUCC(ret)) { - if (OB_FAIL(result->next())) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - break; - } else { - LOG_WARN("fail to get next row", KR(ret)); - } - } else { - int64_t tmp_real_str_len = 0; - char svr_ip[64] = ""; - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "SVR_IP", svr_ip, 64, tmp_real_str_len); - - int64_t svr_port = 0; - char svr_port_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SVR_PORT", svr_port, int64_t); - sprintf(svr_port_char, "%ld", svr_port); - - int64_t sample_cnt = 0; - char sample_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "SAMPLE_CNT", sample_cnt, int64_t); - sprintf(sample_cnt_char, "%ld", sample_cnt); - - int64_t idle_cnt = 0; - char idle_cnt_char[64] = ""; - EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "IDLE_WAIT_CNT", idle_cnt, int64_t); - sprintf(idle_cnt_char, "%ld", idle_cnt); - - double load = static_cast(sample_cnt-idle_cnt) / duration; - char load_char[64] = ""; - sprintf(load_char, "%.2f", load); - - if (OB_SUCC(ret)) { - const char* column_content[] = {svr_ip, svr_port_char, sample_cnt_char, idle_cnt_char, load_char}; - if (OB_FAIL(format_row(5/*column_size*/, column_content, column_widths," ", "|", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } // end while - - if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(5/*column_size*/, table_top,column_widths,"-", "+", buff))) { - LOG_WARN("failed to format row", K(ret)); - } - } - } - } - } - return ret; -} - - } // namespace pl -} // namespace oceanbase \ No newline at end of file +} // namespace oceanbase diff --git a/src/pl/sys_package/ob_dbms_workload_repository.h b/src/pl/sys_package/ob_dbms_workload_repository.h index e9e9033c8c..d949b9acfe 100644 --- a/src/pl/sys_package/ob_dbms_workload_repository.h +++ b/src/pl/sys_package/ob_dbms_workload_repository.h @@ -24,11 +24,34 @@ class ObDbmsWorkloadRepository public: struct AshReportParams { + AshReportParams(const common::ObTimeZoneInfo *tz_info) + : ash_begin_time(0), + ash_end_time(0), + sql_id(), + trace_id(), + wait_class(), + svr_ip(), + port(-1), + tenant_id(0), + tz_info(tz_info), + is_html(false), + user_input_ash_begin_time(0), + user_input_ash_end_time(0), + section_cnt_(0) + {} int64_t ash_begin_time; int64_t ash_end_time; ObString sql_id; ObString trace_id; ObString wait_class; + ObString svr_ip; + int64_t port; + int64_t tenant_id; + const common::ObTimeZoneInfo *tz_info; + bool is_html; + int64_t user_input_ash_begin_time; + int64_t user_input_ash_end_time; + mutable int64_t section_cnt_; }; public: @@ -46,14 +69,27 @@ public: static int lpad(const char *src, const int64_t size, const char *pad, ObStringBuffer &buff); static int format_row(const int64_t column_size, const char *column_contents[], const int64_t column_widths[], const char *pad, const char *sep, ObStringBuffer &buff); + static int print_text_table_frame(const int64_t column_size, const int64_t column_widths[], ObStringBuffer &buff); static bool phase_cmp_func( const std::pair &a, const std::pair &b) { return a.second > b.second; // Sort in descending order based on the value of int64_t. } - static int usec_to_string(const int64_t usec, char *buf, int64_t buf_len, int64_t &pos); + static int usec_to_string(const common::ObTimeZoneInfo *tz_info, + const int64_t usec, char *buf, int64_t buf_len, int64_t &pos); static int append_fmt_ash_view_sql( const AshReportParams &ash_report_params, ObSqlString &sql_string); + static bool is_single_identifier(const char *sql_str); + static int append_time_model_view_sql(common::ObSqlString &sql_string, + const char *select_lists, + const common::ObArrayWrap &timemodel_columns, + const common::ObArrayWrap &timemodel_fields, + const char *source_table, + bool with_sum); + static int unpivot_time_model_column_sql(common::ObSqlString &sql_string, + const char *select_lists, + const common::ObArrayWrap &timemodel_columns, + const char *source_table); static int get_ash_begin_and_end_time( const AshReportParams &ash_report_params, int64_t &ash_begin_time, int64_t &ash_end_time); static int get_ash_num_samples_and_events( @@ -61,31 +97,64 @@ public: static int print_ash_summary_info(const AshReportParams &ash_report_params, const int64_t l_btime, const int64_t l_etime, int64_t &dur_elapsed_time, int64_t &num_samples, int64_t &num_events, ObStringBuffer &buff, bool &no_data); - static int print_ash_top_user_event_info(const AshReportParams &ash_report_params, + static int print_ash_top_active_tenants(const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); - static int print_ash_top_events_and_value(const AshReportParams &ash_report_params, + static int print_ash_top_node_load(const AshReportParams &ash_report_params, const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); - static int print_ash_top_exec_phase(const AshReportParams &ash_report_params, - const int64_t num_samples, const int64_t dur_elapsed_time, ObStringBuffer &buff); - static int print_ash_top_sql_with_event( - const AshReportParams &ash_report_params, const int64_t num_events, ObStringBuffer &buff); - static int print_ash_top_sql_with_blocking_event( - const AshReportParams &ash_report_params, const int64_t num_events, ObStringBuffer &buff); - static int print_ash_sql_text_list( - const AshReportParams &ash_report_params, ObStringBuffer &buff); - static int print_ash_top_session_info(const AshReportParams &ash_report_params, - const int64_t num_samples, const int64_t num_events, const int64_t dur_elapsed_time, - ObStringBuffer &buff); - static int print_ash_top_blocking_session_info(const AshReportParams &ash_report_params, - const int64_t num_samples, const int64_t num_events, const int64_t dur_elapsed_time, - ObStringBuffer &buff); - static int print_ash_top_latches_info( - const AshReportParams &ash_report_params, const int64_t num_samples, ObStringBuffer &buff); - static int print_ash_node_load( - const AshReportParams &ash_report_params, ObStringBuffer &buff); + static int print_ash_foreground_db_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_top_execution_phase(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_background_db_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_top_sessions(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_top_group(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_top_latches(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_activity_over_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_sql_with_top_db_time(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff) + __attribute__((deprecated)); + static int print_top_sql_with_top_wait_events(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_sql_command_type(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_sql_with_top_operator(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_plsql(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_sql_text(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_top_blocking_session(const AshReportParams &ash_report_params, + const int64_t num_samples, const int64_t num_events, ObStringBuffer &buff); + static int print_ash_report_header(const AshReportParams &ash_report_params, ObStringBuffer &buff); + static int print_section_header(const AshReportParams &ash_report_params, ObStringBuffer &buff, const char *str); + static int print_subsection_header(const AshReportParams &ash_report_params, ObStringBuffer &buff, const char *str); + static int print_section_column_header(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool need_merge_table = false); + static int print_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool with_color = true); + static int print_sql_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool with_color, int sql_id_column, int query_column); + static int print_sqltext_section_column_row(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const char *column_contents[], + const int64_t column_widths[], bool with_color = true); + static int print_section_column_end(const AshReportParams &ash_report_params, + ObStringBuffer &buff, const int64_t column_size, const int64_t column_widths[]); + static int print_ash_report_end(const AshReportParams &ash_report_params, ObStringBuffer &buff); + static int print_section_explaination_begin(const AshReportParams &ash_report_params, ObStringBuffer &buff); + static int print_section_explaination_end(const AshReportParams &ash_report_params, ObStringBuffer &buff); + static int insert_section_explaination_line(const AshReportParams &ash_report_params, ObStringBuffer &buff, const char *str); private: static int check_snapshot_task_success_for_snap_id(int64_t snap_id, bool &is_all_success); static int check_drop_task_success_for_snap_id_range(const int64_t low_snap_id, const int64_t high_snap_id, bool &is_all_success); + static int process_ash_report_params(const uint64_t data_version, const sql::ParamStore ¶ms, AshReportParams &ash_report_params); }; } // end pl diff --git a/src/rootserver/backup/ob_backup_base_service.cpp b/src/rootserver/backup/ob_backup_base_service.cpp index ce4fdba593..0c4d51367a 100644 --- a/src/rootserver/backup/ob_backup_base_service.cpp +++ b/src/rootserver/backup/ob_backup_base_service.cpp @@ -132,6 +132,7 @@ void ObBackupBaseService::idle() if (has_set_stop() || wakeup_cnt_ > 0) { wakeup_cnt_ = 0; } else { + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait_us(interval_idle_time_us_); } } diff --git a/src/rootserver/ddl_task/ob_index_build_task.cpp b/src/rootserver/ddl_task/ob_index_build_task.cpp index 7361e0e132..e0de7d0a81 100755 --- a/src/rootserver/ddl_task/ob_index_build_task.cpp +++ b/src/rootserver/ddl_task/ob_index_build_task.cpp @@ -166,6 +166,7 @@ int ObIndexSSTableBuildTask::process() DEBUG_SYNC(BEFORE_INDEX_SSTABLE_BUILD_TASK_SEND_SQL); ObTimeoutCtx timeout_ctx; const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout(); + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::RS_CREATE_INDEX_BUILD_REPLICA); add_event_info(ret, "index sstable build task send innersql"); LOG_INFO("execute sql" , K(sql_string), K(data_table_id_), K(tenant_id_), K(DDL_INNER_SQL_EXECUTE_TIMEOUT), "ddl_event_info", ObDDLEventInfo()); if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) { diff --git a/src/rootserver/freeze/ob_freeze_reentrant_thread.cpp b/src/rootserver/freeze/ob_freeze_reentrant_thread.cpp index 6234ac2eac..0140c4dcb1 100644 --- a/src/rootserver/freeze/ob_freeze_reentrant_thread.cpp +++ b/src/rootserver/freeze/ob_freeze_reentrant_thread.cpp @@ -64,14 +64,14 @@ int ObFreezeReentrantThread::try_idle( if (is_paused()) { LOG_INFO("this thread is paused", KR(ret), K(idle_time_us), "epoch", get_epoch()); while (!stop_ && is_paused()) { - get_cond().wait(idle_time_us / 1000); + idle_wait(idle_time_us / 1000); // if in paused state, we also need to update run_ts. otherwise, the checker may // mark this thread as hang. update_last_run_timestamp(); } LOG_INFO("this thread is not paused", KR(ret), K(idle_time_us), "epoch", get_epoch()); } else { - get_cond().wait(idle_time_us / 1000); + idle_wait(idle_time_us / 1000); } } return ret; diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 88c3ed2e98..3b4186354d 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -32905,7 +32905,7 @@ int ObDDLService::refresh_schema(uint64_t tenant_id, int64_t *publish_schema_ver LOG_DBA_ERROR(OB_ERR_REFRESH_SCHEMA_TOO_LONG, "msg", "refresh schema failed", KR(ret), K(refresh_count)); } - ob_usleep(REFRESH_SCHEMA_INTERVAL_US); + ob_usleep(REFRESH_SCHEMA_INTERVAL_US); } } // end while if (OB_SUCC(ret) && !stopped_) { diff --git a/src/rootserver/ob_disaster_recovery_task_mgr.cpp b/src/rootserver/ob_disaster_recovery_task_mgr.cpp index ef3c6e8341..c1d0cf8f47 100644 --- a/src/rootserver/ob_disaster_recovery_task_mgr.cpp +++ b/src/rootserver/ob_disaster_recovery_task_mgr.cpp @@ -592,9 +592,7 @@ int ObDRTaskMgr::init( ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", KR(ret), K(server), KP(rpc_proxy), KP(sql_proxy), KP(schema_service)); - } else if (OB_FAIL(cond_.init(ObWaitEventIds::REBALANCE_TASK_MGR_COND_WAIT))) { - LOG_WARN("fail to init cond", KR(ret)); - } else if (OB_FAIL(create(thread_count, "DRTaskMgr"))) { + } else if (OB_FAIL(create(thread_count, "DRTaskMgr", ObWaitEventIds::REBALANCE_TASK_MGR_COND_WAIT))) { LOG_WARN("fail to create disaster recovery task mgr", KR(ret)); } else { config_ = &config; @@ -647,8 +645,8 @@ void ObDRTaskMgr::stop() stopped_ = true; ObRsReentrantThread::stop(); disaster_recovery_task_table_updater_.stop(); - ObThreadCondGuard guard(cond_); - cond_.broadcast(); + ObThreadCondGuard guard(get_cond()); + get_cond().broadcast(); for (int64_t i = 0; i < static_cast(ObDRTaskPriority::MAX_PRI); ++i) { queues_[i].reuse(); } @@ -700,7 +698,7 @@ void ObDRTaskMgr::run3() } else if (server_info.is_permanent_offline()) { // dest server permanent offline, do not execute this task, just clean it LOG_INFO("[DRTASK_NOTICE] dest server is permanent offline, task can not execute", K(dst_server), K(server_info)); - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); if (OB_SUCCESS != (tmp_ret = async_add_cleaning_task_to_updater( task->get_task_id(), task->get_task_key(), @@ -746,7 +744,7 @@ int ObDRTaskMgr::add_task_in_queue_and_execute(ObDRTask &task) ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid dr task", KR(ret), K(task)); } else { - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); bool is_conflict = false; ObDRTaskQueue &queue = task.is_high_priority_task() ? high_task_queue_ : low_task_queue_; if (OB_UNLIKELY(queue.task_cnt() >= TASK_QUEUE_LIMIT)) { @@ -783,7 +781,7 @@ int ObDRTaskMgr::add_task( ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid dr task", KR(ret), K(task)); } else { - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); ObDRTaskQueue &queue = task.is_high_priority_task() ? high_task_queue_ : low_task_queue_; bool is_conflict = false; if (OB_UNLIKELY(queue.task_cnt() >= TASK_QUEUE_LIMIT)) { @@ -797,7 +795,7 @@ int ObDRTaskMgr::add_task( } else if (OB_FAIL(queue.do_push_task_in_wait_list(*this, task))) { LOG_WARN("fail to push task", KR(ret), K(task)); } else { - cond_.broadcast(); + get_cond().broadcast(); LOG_INFO("[DRTASK_NOTICE] add task to disaster recovery task mgr finish", KR(ret), K(task)); } } @@ -813,7 +811,7 @@ int ObDRTaskMgr::deal_with_task_reply( } else { int tmp_ret = OB_SUCCESS; ObDRTask *task = nullptr; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); if (OB_SUCCESS != (tmp_ret = get_task_by_id_(reply.task_id_, task))) { if (OB_ENTRY_NOT_EXIST == tmp_ret) { // task not exist, try record this reply result @@ -889,7 +887,7 @@ int ObDRTaskMgr::do_cleaning( const ObDRTaskRetComment &ret_comment) { int ret = OB_SUCCESS; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); if (OB_FAIL(check_inner_stat_())) { LOG_WARN("fail to check inner stat", KR(ret), K_(inited), K_(stopped), K_(loaded)); } else { @@ -935,7 +933,7 @@ int ObDRTaskMgr::get_all_task_count( if (OB_FAIL(check_inner_stat_())) { LOG_WARN("not init", KR(ret), K_(inited), K_(loaded), K_(stopped)); } else { - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); high_wait_cnt = get_high_priority_queue_().get_wait_list().get_size(); high_schedule_cnt = get_high_priority_queue_().get_schedule_list().get_size(); low_wait_cnt = get_low_priority_queue_().get_wait_list().get_size(); @@ -995,7 +993,7 @@ int ObDRTaskMgr::load_task_to_schedule_list_() { int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); ObArray tenant_id_array; if (OB_UNLIKELY(!inited_ || stopped_)) { @@ -1175,13 +1173,13 @@ int ObDRTaskMgr::persist_task_info_( } int ObDRTaskMgr::try_dump_statistic_( - int64_t &last_dump_ts) const + int64_t &last_dump_ts) { int ret = OB_SUCCESS; if (OB_FAIL(check_inner_stat_())) { LOG_WARN("fail to check inner stat", KR(ret), K_(inited), K_(stopped), K_(loaded)); } else { - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); const int64_t now = ObTimeUtility::current_time(); if (now > last_dump_ts + config_->balancer_log_interval) { last_dump_ts = now; @@ -1225,7 +1223,7 @@ int ObDRTaskMgr::try_clean_and_cancel_task_in_schedule_list_( int64_t wait = 0; int64_t schedule = 0; DEBUG_SYNC(BEFORE_CHECK_CLEAN_AND_CANCEL_DRTASK); // need before cond guard - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); if (OB_FAIL(inner_get_task_cnt_(wait, schedule))) { LOG_WARN("fail to get task cnt", KR(ret)); } else if (schedule <= 0) { @@ -1285,7 +1283,7 @@ int ObDRTaskMgr::try_pop_task( ObDRTask *&task) { int ret = OB_SUCCESS; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); int64_t wait_cnt = 0; int64_t in_schedule_cnt = 0; ObDRTask *my_task = nullptr; @@ -1321,7 +1319,8 @@ int ObDRTaskMgr::try_pop_task( } } else { int64_t now = ObTimeUtility::current_time(); - cond_.wait(get_schedule_interval()); + idle_wait(get_schedule_interval()); + } if (OB_SUCC(ret) && OB_NOT_NULL(task)) { LOG_INFO("[DRTASK_NOTICE] success to pop a task", KPC(task), @@ -1408,7 +1407,7 @@ int ObDRTaskMgr::execute_task( // (1) use rwlock instead of threadcond // (2) deal with block in status (void)log_task_result(task, ret, ret_comment); - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); const bool data_in_limit = (OB_REACH_SERVER_DATA_COPY_IN_CONCURRENCY_LIMIT == ret); if (OB_SUCCESS != async_add_cleaning_task_to_updater( task.get_task_id(), diff --git a/src/rootserver/ob_disaster_recovery_task_mgr.h b/src/rootserver/ob_disaster_recovery_task_mgr.h index f3c0dff278..ce78307b78 100644 --- a/src/rootserver/ob_disaster_recovery_task_mgr.h +++ b/src/rootserver/ob_disaster_recovery_task_mgr.h @@ -213,7 +213,6 @@ public: stopped_(true), loaded_(false), config_(nullptr), - cond_(), queues_(), high_task_queue_(queues_[0]), low_task_queue_(queues_[1]), @@ -384,7 +383,7 @@ private: // try to log inmemory task infos according to balancer_log_interval // @param [in] last_dump_ts, last time do logging int try_dump_statistic_( - int64_t &last_dump_ts) const; + int64_t &last_dump_ts); int inner_dump_statistic_() const; // try to deal with those tasks not in scheduling int try_clean_and_cancel_task_in_schedule_list_( @@ -428,7 +427,6 @@ private: /* has waiting task but cannot be scheduled, * since mgr reaches server_data_copy_[in/out]_concurrency */ - mutable common::ObThreadCond cond_; ObDRTaskQueue queues_[static_cast(ObDRTaskPriority::MAX_PRI)]; ObDRTaskQueue &high_task_queue_; // queues_[0] ObDRTaskQueue &low_task_queue_; // queues_[1] diff --git a/src/rootserver/ob_empty_server_checker.cpp b/src/rootserver/ob_empty_server_checker.cpp index cc0fbc41f6..49591e3c23 100644 --- a/src/rootserver/ob_empty_server_checker.cpp +++ b/src/rootserver/ob_empty_server_checker.cpp @@ -56,9 +56,7 @@ int ObEmptyServerChecker::init( if (inited_) { ret = OB_INIT_TWICE; LOG_WARN("init twice", K(ret)); - } else if (OB_FAIL(cond_.init(ObWaitEventIds::EMPTY_SERVER_CHECK_COND_WAIT))) { - LOG_WARN("fail to init thread cond, ", K(ret)); - } else if (OB_FAIL(create(empty_server_checker_thread_cnt, "EmptSvrCheck"))) { + } else if (OB_FAIL(create(empty_server_checker_thread_cnt, "EmptSvrCheck", ObWaitEventIds::EMPTY_SERVER_CHECK_COND_WAIT))) { LOG_WARN("create empty server checker thread failed", K(ret), K(empty_server_checker_thread_cnt)); } else { @@ -85,7 +83,7 @@ void ObEmptyServerChecker::run3() int64_t wait_time_ms = 0; while (!stop_) { ret = OB_SUCCESS; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); wait_time_ms = 10 * 1000;//10s if (OB_FAIL(try_delete_server_())) { LOG_WARN("failed to delete server", KR(ret)); @@ -93,7 +91,7 @@ void ObEmptyServerChecker::run3() if (OB_SUCC(ret) && !stop_ && !need_check_) { wait_time_ms = 100; } - if (OB_SUCCESS != cond_.wait(wait_time_ms)) { + if (OB_SUCCESS != idle_wait(wait_time_ms)) { LOG_DEBUG("wait timeout", K(wait_time_ms)); } } @@ -168,7 +166,7 @@ void ObEmptyServerChecker::wakeup() ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); } else { - cond_.broadcast(); + get_cond().broadcast(); } } @@ -180,8 +178,8 @@ void ObEmptyServerChecker::stop() LOG_WARN("not init", K(ret)); } else { ObRsReentrantThread::stop(); - ObThreadCondGuard guard(cond_); - cond_.broadcast(); + ObThreadCondGuard guard(get_cond()); + get_cond().broadcast(); } } diff --git a/src/rootserver/ob_empty_server_checker.h b/src/rootserver/ob_empty_server_checker.h index a566c70d49..49e7620c34 100644 --- a/src/rootserver/ob_empty_server_checker.h +++ b/src/rootserver/ob_empty_server_checker.h @@ -44,7 +44,6 @@ class ObEmptyServerChecker : public ObRsReentrantThread { public: ObEmptyServerChecker(): inited_(false), - cond_(), need_check_(true), empty_servers_(), server_mgr_(NULL), @@ -88,7 +87,6 @@ private: private: bool inited_; - common::ObThreadCond cond_; bool need_check_; common::ObArray empty_servers_; ObServerManager *server_mgr_; diff --git a/src/rootserver/ob_lost_replica_checker.cpp b/src/rootserver/ob_lost_replica_checker.cpp index b28a441581..76967f231a 100644 --- a/src/rootserver/ob_lost_replica_checker.cpp +++ b/src/rootserver/ob_lost_replica_checker.cpp @@ -37,7 +37,7 @@ namespace rootserver { ObLostReplicaChecker::ObLostReplicaChecker() - : inited_(false), cond_(), + : inited_(false), lst_operator_(NULL), schema_service_(NULL) { @@ -72,9 +72,7 @@ int ObLostReplicaChecker::init(ObLSTableOperator &lst_operator, ObMultiVersionSc if (inited_) { ret = OB_INIT_TWICE; LOG_WARN("init twice", K(ret)); - } else if (OB_FAIL(cond_.init(ObWaitEventIds::THREAD_IDLING_COND_WAIT))) { - LOG_WARN("fail to init thread cond, ", K(ret)); - } else if (OB_FAIL(create(thread_cnt, "LostRepCheck"))) { + } else if (OB_FAIL(create(thread_cnt, "LostRepCheck", ObWaitEventIds::THREAD_IDLING_COND_WAIT))) { LOG_WARN("create empty server checker thread failed", K(ret), K(thread_cnt)); } else { lst_operator_ = &lst_operator; @@ -95,11 +93,11 @@ void ObLostReplicaChecker::run3() const int64_t wait_time_ms = 10 * 1000;//10s; while (!stop_) { ret = OB_SUCCESS; - ObThreadCondGuard guard(cond_); + ObThreadCondGuard guard(get_cond()); if (OB_FAIL(check_lost_replicas())) { LOG_WARN("failed to check lost replica", KR(ret)); } - if (OB_SUCCESS != cond_.wait(wait_time_ms)) { + if (OB_SUCCESS != idle_wait(wait_time_ms)) { LOG_DEBUG("wait timeout", K(wait_time_ms)); } } @@ -316,7 +314,7 @@ void ObLostReplicaChecker::wakeup() ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); } else { - cond_.broadcast(); + get_cond().broadcast(); } } @@ -328,8 +326,8 @@ void ObLostReplicaChecker::stop() LOG_WARN("not init", K(ret)); } else { ObRsReentrantThread::stop(); - ObThreadCondGuard guard(cond_); - cond_.broadcast(); + ObThreadCondGuard guard(get_cond()); + get_cond().broadcast(); } } diff --git a/src/rootserver/ob_lost_replica_checker.h b/src/rootserver/ob_lost_replica_checker.h index 8e3ffa2e7c..565c781d44 100644 --- a/src/rootserver/ob_lost_replica_checker.h +++ b/src/rootserver/ob_lost_replica_checker.h @@ -62,7 +62,6 @@ private: private: bool inited_; - common::ObThreadCond cond_; share::ObLSTableOperator *lst_operator_; share::schema::ObMultiVersionSchemaService *schema_service_; private: diff --git a/src/rootserver/ob_ls_recovery_reportor.cpp b/src/rootserver/ob_ls_recovery_reportor.cpp index 2fb131a78d..ec0c9017ad 100755 --- a/src/rootserver/ob_ls_recovery_reportor.cpp +++ b/src/rootserver/ob_ls_recovery_reportor.cpp @@ -181,7 +181,7 @@ void ObLSRecoveryReportor::idle_some_time_() } else if (!is_primary_normal_status) { idle_target_cnt = 1; } - get_cond().wait_us(IDLE_TIME); + idle_wait_us(IDLE_TIME); } } diff --git a/src/rootserver/ob_root_inspection.cpp b/src/rootserver/ob_root_inspection.cpp index cadd67e751..5a8c9e3887 100755 --- a/src/rootserver/ob_root_inspection.cpp +++ b/src/rootserver/ob_root_inspection.cpp @@ -1424,6 +1424,7 @@ int ObRootInspection::check_sys_view_( SMART_VAR(ObMySQLProxy::MySQLResult, res) { common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::RS_CHECK_SYS_VIEW_EXPANSION); // case 0: check expansion of sys view definition if (is_oracle) { if (OB_FAIL(sql.assign_fmt("SELECT FIELD FROM \"%s\".\"%s\" WHERE TABLE_ID = %lu", diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index aed8578fa4..7050e65fe8 100644 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -6159,7 +6159,6 @@ int ObRootService::do_restart() FLOG_INFO("root_inspection_ started"); int64_t now = ObTimeUtility::current_time(); core_meta_table_version_ = now; - EVENT_SET(RS_START_SERVICE_TIME, now); // reset fail count for self checker and print log. reset_fail_count(); } diff --git a/src/rootserver/ob_rs_reentrant_thread.cpp b/src/rootserver/ob_rs_reentrant_thread.cpp index 7129581bda..196a3e406f 100644 --- a/src/rootserver/ob_rs_reentrant_thread.cpp +++ b/src/rootserver/ob_rs_reentrant_thread.cpp @@ -73,7 +73,7 @@ void ObRsReentrantThread::wait() } } -int ObRsReentrantThread::create(const int64_t thread_cnt, const char* thread_name) +int ObRsReentrantThread::create(const int64_t thread_cnt, const char* thread_name, const int64_t wait_event_id) { int ret = OB_SUCCESS; bool added = false; @@ -85,7 +85,7 @@ int ObRsReentrantThread::create(const int64_t thread_cnt, const char* thread_nam } } - if (FAILEDx(share::ObReentrantThread::create(thread_cnt, thread_name))) { + if (FAILEDx(share::ObReentrantThread::create(thread_cnt, thread_name, wait_event_id))) { LOG_WARN("fail to create reentraint thread", KR(ret), K(thread_name)); } else if (last_run_timestamp_ != -1) { LOG_INFO("rs_monitor_check : reentrant thread check register success", K(thread_name)); @@ -140,6 +140,7 @@ void ObRsReentrantThread::check_alert(const ObRsReentrantThread &thread) } } + CheckThreadSet::CheckThreadSet() : arr_(), rwlock_(ObLatchIds::THREAD_HANG_CHECKER_LOCK) { diff --git a/src/rootserver/ob_rs_reentrant_thread.h b/src/rootserver/ob_rs_reentrant_thread.h index 868fb1488d..5af1dfe294 100644 --- a/src/rootserver/ob_rs_reentrant_thread.h +++ b/src/rootserver/ob_rs_reentrant_thread.h @@ -56,7 +56,8 @@ public: int64_t get_last_run_timestamp() const; void update_last_run_timestamp(); - int create(const int64_t thread_cnt, const char* name = nullptr); + int create(const int64_t thread_cnt, const char* name = nullptr, + const int64_t wait_event_id = ObWaitEventIds::REENTRANT_THREAD_COND_WAIT); int destroy(); int start(); void stop(); diff --git a/src/rootserver/ob_rs_thread_checker.cpp b/src/rootserver/ob_rs_thread_checker.cpp index e32dfe29dc..f951939534 100644 --- a/src/rootserver/ob_rs_thread_checker.cpp +++ b/src/rootserver/ob_rs_thread_checker.cpp @@ -57,7 +57,7 @@ void ObRsThreadChecker::run3() while (!stop_) { ObRsReentrantThread::check_thread_set_.loop_operation(ObRsReentrantThread::check_alert); if (!stop_) { - get_cond().wait(CHECK_TIMEVAL_US / 1000); + idle_wait(CHECK_TIMEVAL_US / 1000); } } } diff --git a/src/rootserver/ob_tenant_info_loader.cpp b/src/rootserver/ob_tenant_info_loader.cpp index 9ed9ffd003..93c62f61c7 100644 --- a/src/rootserver/ob_tenant_info_loader.cpp +++ b/src/rootserver/ob_tenant_info_loader.cpp @@ -189,7 +189,7 @@ void ObTenantInfoLoader::run2() const int64_t idle_time = max(10 * 1000, refresh_time_interval_us - cost_time_us - cost_time_us_service_name); //At least sleep 10ms, allowing the thread to release the lock if (!stop_) { - get_cond().wait_us(idle_time); + idle_wait_us(idle_time); } }//end while } diff --git a/src/rootserver/ob_tenant_thread_helper.cpp b/src/rootserver/ob_tenant_thread_helper.cpp index 92c79bead3..4ef59192e2 100755 --- a/src/rootserver/ob_tenant_thread_helper.cpp +++ b/src/rootserver/ob_tenant_thread_helper.cpp @@ -31,7 +31,7 @@ #include "share/scn.h"//SCN #include "ob_tenant_info_loader.h" // ObTenantInfoLoader - +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -249,6 +249,7 @@ void ObTenantThreadHelper::run1() { void ObTenantThreadHelper::idle(const int64_t idle_time_us) { ObThreadCondGuard guard(thread_cond_); + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait_us(idle_time_us); } diff --git a/src/rootserver/ob_thread_idling.cpp b/src/rootserver/ob_thread_idling.cpp index 15df0eb117..a07e028bc0 100644 --- a/src/rootserver/ob_thread_idling.cpp +++ b/src/rootserver/ob_thread_idling.cpp @@ -63,6 +63,7 @@ int ObThreadIdling::idle(const int64_t max_idle_time_us) break; } wait_time_ms = std::min(1000l, wait_time_ms); + ObBKGDSessInActiveGuard inactive_guard; if (OB_FAIL(cond_.wait(static_cast(wait_time_ms)))) { ret = OB_SUCCESS; } else { diff --git a/src/share/CMakeLists.txt b/src/share/CMakeLists.txt index 6bde5c3174..a2829cdba8 100644 --- a/src/share/CMakeLists.txt +++ b/src/share/CMakeLists.txt @@ -347,6 +347,8 @@ ob_set_subtarget(ob_share common_mixed longops_mgr/ob_longops_mgr.cpp ash/ob_active_sess_hist_list.cpp ash/ob_active_sess_hist_task.cpp + ash/ob_ash_refresh_task.cpp + ash/ob_di_util.cpp throttle/ob_share_throttle_define.cpp throttle/ob_throttle_common.cpp restore/ob_restore_data_mode.cpp diff --git a/src/share/allocator/ob_shared_memory_allocator_mgr.h b/src/share/allocator/ob_shared_memory_allocator_mgr.h index ed77b33bd8..6a16b7843a 100644 --- a/src/share/allocator/ob_shared_memory_allocator_mgr.h +++ b/src/share/allocator/ob_shared_memory_allocator_mgr.h @@ -136,7 +136,7 @@ public: if (0 < sleep_interval) { sleep_time += sleep_interval; left_interval -= sleep_interval; - ::usleep(sleep_interval); + ob_usleep(sleep_interval, sleep_interval, sleep_time, 0); } PrintThrottleUtil::pirnt_throttle_info(ret, diff --git a/src/share/ash/ob_active_sess_hist_list.cpp b/src/share/ash/ob_active_sess_hist_list.cpp index 02dc0db371..3760b99bc5 100644 --- a/src/share/ash/ob_active_sess_hist_list.cpp +++ b/src/share/ash/ob_active_sess_hist_list.cpp @@ -14,10 +14,31 @@ #include "lib/oblog/ob_log.h" #include "share/ash/ob_active_sess_hist_list.h" +#include "lib/allocator/ob_malloc.h" +#include "share/config/ob_server_config.h" +#include "lib/guard/ob_shared_guard.h" // ObShareGuard +#include "lib/ob_running_mode.h" using namespace oceanbase::common; using namespace oceanbase::share; +ObActiveSessHistList::ObActiveSessHistList() + : ash_size_(0), + mutex_(common::ObLatchIds::ASH_LOCK), + ash_buffer_() +{ + if (GCONF.is_valid()) { + ash_size_ = GCONF._ob_ash_size; + } + if (ash_size_ == 0) { + if (lib::is_mini_mode()) { + ash_size_ = 10 * 1024 * 1024; // 10M + } else { + ash_size_ = 30 * 1024 * 1024; // 30M + } + } +} + ObActiveSessHistList &ObActiveSessHistList::get_instance() { static ObActiveSessHistList the_one; @@ -27,26 +48,76 @@ ObActiveSessHistList &ObActiveSessHistList::get_instance() int ObActiveSessHistList::init() { int ret = OB_SUCCESS; - // 30MB at most - int64_t max_mem_for_ash = 30 * 1024 * 1024; - list_.set_label("ash_list"); - if (OB_FAIL(list_.prepare_allocate(max_mem_for_ash / sizeof(ActiveSessionStat)))) { - LOG_WARN("fail init ASH circular buffer", K(ret)); + if (ash_buffer_.is_valid()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ash buffer exist", KR(ret)); + } else if (OB_FAIL(mutex_.trylock())) { + LOG_WARN("previous ash resize task is executing", KR(ret)); } else { - LOG_INFO("init ASH circular buffer OK", "size", list_.size(), K(ret)); + common::ObSharedGuard tmp; + if (OB_FAIL(allocate_ash_buffer(ash_size_, tmp))) { + LOG_WARN("failed to allocate ash buffer", KR(ret)); + } else { + ash_buffer_ = tmp; + LOG_INFO("ash buffer init OK", K_(ash_buffer)); + } + mutex_.unlock(); } return ret; } -int ObActiveSessHistList::extend_list(int64_t new_size) +int ObActiveSessHistList::resize_ash_size() { int ret = OB_SUCCESS; - // can only extend list, can't shrink - if (OB_FAIL(list_.prepare_allocate(new_size))) { - LOG_WARN("fail extend ASH circular buffer size", "old_size", list_.size(), K(new_size), K(ret)); - } else { - LOG_INFO("extend ASH circular buffer size OK", "size", list_.size(), K(ret)); + int64_t ash_size = GCONF._ob_ash_size; + if (ash_size == 0) { + if (lib::is_mini_mode()) { + ash_size = 10 * 1024 * 1024; // 10M + } else { + ash_size = 30 * 1024 * 1024; // 30M + } + } + if (ash_size != ash_size_) { + LockGuard lock(mutex_); + // allocator new + common::ObSharedGuard tmp; + if (OB_FAIL(allocate_ash_buffer(ash_size, tmp))) { + LOG_WARN("failed to allocate ash buffer", KR(ret)); + } else { + // copy old to new + ReverseIterator iter = create_reverse_iterator_no_lock(); + while (iter.has_next()) { + const ObActiveSessionStatItem &stat = iter.next(); + if (iter.distance() <= tmp->size()) { + tmp->copy_from_ash_buffer(stat); + } + } + // swap old with new (with mutex protection) + LOG_INFO("successfully resize ash buffer", K(ash_size), "prev_ash_buffer", ash_buffer_.get_ptr(), "prev_size", ash_size_); + ash_buffer_ = tmp; + ash_size_ = ash_size; + } } return ret; } +int ObActiveSessHistList::allocate_ash_buffer(int64_t ash_size, common::ObSharedGuard &ash_buffer) +{ + int ret = OB_SUCCESS; + ObMemAttr attr; + attr.label_ = "ash"; + attr.ctx_id_ = ObCtxIds::DEFAULT_CTX_ID; + attr.tenant_id_ = OB_SYS_TENANT_ID; + if (OB_FAIL(ob_make_shared(ash_buffer))) { + LOG_WARN("failed to make ash buffer", KR(ret)); + } else { + ash_buffer->set_label("ASHListBuffer"); + ash_buffer->set_tenant_id(OB_SYS_TENANT_ID); + if (OB_FAIL(ash_buffer->prepare_allocate(ash_size / sizeof(ObActiveSessionStatItem)))) { + LOG_WARN("fail init ASH circular buffer", K(ret)); + } else { + LOG_INFO("init ASH circular buffer OK", "size", ash_buffer->size()); + } + } + return ret; +} diff --git a/src/share/ash/ob_active_sess_hist_list.h b/src/share/ash/ob_active_sess_hist_list.h index 3a59c2f530..54dedf5c96 100644 --- a/src/share/ash/ob_active_sess_hist_list.h +++ b/src/share/ash/ob_active_sess_hist_list.h @@ -13,7 +13,6 @@ #ifndef _OB_SHARE_ASH_ACTIVE_SESSION_LIST_H_ #define _OB_SHARE_ASH_ACTIVE_SESSION_LIST_H_ -#include "lib/container/ob_array.h" #include "lib/lock/ob_tc_rwlock.h" #include "lib/ash/ob_active_session_guard.h" @@ -21,19 +20,19 @@ namespace oceanbase { namespace share { - -#define WR_ASH_SAMPLE_INTERVAL 10 +typedef lib::ObLockGuard LockGuard; class ObActiveSessHistList { public: - ObActiveSessHistList() : write_pos_(0) {} + ObActiveSessHistList(); ~ObActiveSessHistList() = default; static ObActiveSessHistList &get_instance(); int init(); - int extend_list(int64_t new_size); - TO_STRING_KV(K(size()), K_(write_pos)); + int64_t get_ash_size() const { return ash_size_; } + int resize_ash_size(); + TO_STRING_KV(K(size()), K_(ash_size), K_(ash_buffer)); /* * -> write_idx * +------------------+--------------------+ @@ -43,66 +42,69 @@ public: * * we don't regard it as a circular buffer, * instead, regard it as an unlimited array goes to one direction forever - * i.e. write_pos_ will increase for ever + * i.e. write_pos will increase for ever * - * Note: no concurrent access to list_ + * NOTICE: below function must be called with mutex_ or shared_ptr protection. */ - void add(ActiveSessionStat &stat) + void add(ObActiveSessionStat &stat) { - // TODO: optimize performance, eliminate '%' - int64_t idx = (write_pos_++ + list_.size()) % list_.size(); - stat.id_ = write_pos_; - MEMCPY(&list_[idx], &stat, sizeof(ActiveSessionStat)); - if (0 == write_pos_ % WR_ASH_SAMPLE_INTERVAL) { - list_[idx].is_wr_sample_ = true; - } - stat.wait_time_ = 0; - if (list_[idx].event_no_) { - stat.set_last_stat(&list_[idx]); // for wait event time fixup + int64_t idx = ash_buffer_->append(stat); + if (stat.event_no_) { + // Once session can see fixup index, it surely can see fixup_buffer. + stat.set_fixup_buffer(ash_buffer_); + MEM_BARRIER(); + stat.set_fixup_index(idx); } else { - stat.set_last_stat(nullptr); // for wait event time fixup + // we cannot reset fixup buffer here. Because user thread would reset fixup buffer too. Causing a race condition. + // Bottom line is that we cannot introduce any lock in worker thread. + // Worst case is the fixup buffer never got release because user thread's wait event never ends. } } - int64_t write_pos() const { return write_pos_; } - inline int64_t size() const { return list_.size(); } - const ActiveSessionStat &get(int64_t pos) const { - return list_[pos]; + void set_read_pos(int64_t read_pos) { ash_buffer_->set_read_pos(read_pos); } + int64_t write_pos() const { return ash_buffer_->write_pos(); } + inline int64_t size() const { return ash_buffer_->size(); } + inline int64_t free_slots_num() const { return ash_buffer_->free_slots_num(); } + const ObActiveSessionStatItem &get(int64_t pos) const { + return ash_buffer_->get(pos); } public: class Iterator { public: - Iterator() : list_(nullptr), curr_(0), end_(0) {} - Iterator(ObActiveSessHistList *list, + Iterator() : ash_buffer_(), curr_(0), end_(0) {} + explicit Iterator(const common::ObSharedGuard &ash_buffer, int64_t start, int64_t end) - : list_(list), + : ash_buffer_(), curr_(start), end_(end) - {} + { + ash_buffer_ = ash_buffer; + } Iterator(const Iterator &other) - : list_(other.list_), - curr_(other.curr_), + : curr_(other.curr_), end_(other.end_) - {} - TO_STRING_KV(K_(list), K_(curr), K_(end)); + { + ash_buffer_ = other.ash_buffer_; + } + TO_STRING_KV(K_(ash_buffer), K_(curr), K_(end)); bool has_next() const { bool bret = true; - if (OB_UNLIKELY(nullptr == list_ || list_->write_pos() == 0 || curr_ < 0)) { + if (OB_UNLIKELY(nullptr == ash_buffer_.get_ptr() || ash_buffer_->write_pos() == 0 || curr_ < 0)) { bret = false; - } else if (list_->write_pos() - curr_ > list_->size()) { // write_pos is the next valid write position which is not written + } else if (ash_buffer_->write_pos() - curr_ > ash_buffer_->size()) { // write_pos is the next valid write position which is not written bret = false; } else if (curr_ < end_) { bret = false; } return bret; } - const ActiveSessionStat &next() + const ObActiveSessionStatItem &next() { - int64_t pos = curr_ % list_->size(); + int64_t pos = curr_ % ash_buffer_->size(); curr_--; - return list_->get(pos); + return ash_buffer_->get(pos); } void init_with_sample_time_index(const int64_t &start, const int64_t &end) { @@ -131,7 +133,7 @@ public: int64_t middle = -1; while (begin < end) { middle = begin + ((end - begin) >> 1); - const int64_t val = list_->get(middle % list_->size()).sample_time_; + const int64_t val = ash_buffer_->get(middle % ash_buffer_->size()).sample_time_; if (OB_LIKELY(is_valid(middle))) { if (val >= left) { end = middle; @@ -148,10 +150,10 @@ public: * ended in constant time. */ LOG_DEBUG("ash overwrite happened during binary search", K(begin), - K(middle), K(end), K(val), KPC(list_)); + K(middle), K(end), K(val), K(ash_buffer_->size())); // TODO(roland.qk): Adding sysstat counter to track this corner case. end = curr_ + 1; - begin = list_->write_pos() - list_->size(); + begin = ash_buffer_->write_pos() - ash_buffer_->size(); OB_ASSERT(begin >= 0); } } @@ -164,7 +166,7 @@ public: int64_t middle = -1; while (begin <= end) { middle = begin + ((end - begin) >> 1); - const int64_t val = list_->get(middle % list_->size()).sample_time_; + const int64_t val = ash_buffer_->get(middle % ash_buffer_->size()).sample_time_; if (OB_LIKELY(is_valid(middle))) { if (val > right) { end = middle - 1; @@ -174,7 +176,7 @@ public: } else { // ash ring buffer overwrite happened. LOG_DEBUG("ash overwrite happened during binary search", K(begin), - K(middle), K(end), K(val), KPC(list_)); + K(middle), K(end), K(val), K(ash_buffer_->size())); // TODO(roland.qk): Adding sysstat counter to track this corner case. end = curr_ + 1; begin = sample_time_search_left_most(right); @@ -186,9 +188,9 @@ public: bool is_valid(int64_t pos) { bool bret = true; - if (OB_UNLIKELY(nullptr == list_ || list_->write_pos() == 0 || curr_ < 0)) { + if (OB_UNLIKELY(nullptr == ash_buffer_.get_ptr() || ash_buffer_->write_pos() == 0 || curr_ < 0)) { bret = false; - } else if (list_->write_pos() - pos > list_->size()) { + } else if (ash_buffer_->write_pos() - pos > ash_buffer_->size()) { bret = false; } else if (pos < end_ || pos > curr_) { bret = false; @@ -196,28 +198,100 @@ public: return bret; } private: - ObActiveSessHistList *list_; + common::ObSharedGuard ash_buffer_; + int64_t curr_; + int64_t end_; + }; + + class ReverseIterator + { + public: + ReverseIterator() : ash_buffer_(), curr_(0), end_(0) {} + explicit ReverseIterator(const common::ObSharedGuard &ash_buffer, + int64_t start, + int64_t end) + : ash_buffer_(), + curr_(start), + end_(end) + { + ash_buffer_ = ash_buffer; + } + ReverseIterator(const ReverseIterator &other) + : curr_(other.curr_), + end_(other.end_) + { + ash_buffer_ = other.ash_buffer_; + } + bool has_next() const + { + bool bret = true; + if (OB_UNLIKELY(nullptr == ash_buffer_.get_ptr() || ash_buffer_->write_pos() == 0 || curr_ < 0)) { + bret = false; + } else if (curr_ >= ash_buffer_->write_pos()) { // write_pos is the next valid write position which is not written + bret = false; + } else if (curr_ > end_) { + bret = false; + } + return bret; + } + const ObActiveSessionStatItem &next() + { + int64_t pos = curr_ % ash_buffer_->size(); + curr_++; + return ash_buffer_->get(pos); + } + int64_t distance() const + { + return end_ - curr_ + 1; + } + TO_STRING_KV(K_(ash_buffer), K(ash_buffer_->write_pos()), K_(curr), K_(end)); + private: + common::ObSharedGuard ash_buffer_; int64_t curr_; int64_t end_; }; Iterator create_iterator() { + // get hold of ash buffer. + LockGuard lock(mutex_); + common::ObSharedGuard ash_buffer = ash_buffer_; int64_t read_start = 0; int64_t read_end = 0; - if (write_pos_ < list_.size()) { + if (ash_buffer->write_pos() < ash_buffer->size()) { // buffer not full - read_start = write_pos_ - 1; + read_start = ash_buffer->write_pos() - 1; read_end = 0; } else { - read_start = write_pos_ - 1; - read_end = write_pos_ - list_.size(); + read_start = ash_buffer->write_pos() - 1; + read_end = ash_buffer->write_pos() - ash_buffer->size(); } - return Iterator(this, read_start, read_end); + return Iterator(ash_buffer, read_start, read_end); } + + ReverseIterator create_reverse_iterator_no_lock() + { + // get hold of ash buffer. + common::ObSharedGuard ash_buffer = ash_buffer_; + int64_t read_start = 0; + int64_t read_end = 0; + if (ash_buffer->write_pos() < ash_buffer->size()) { + // buffer not full + read_start = 0; + read_end = ash_buffer->write_pos() - 1; + } else { + read_start = ash_buffer->write_pos() - ash_buffer->size(); + read_end = ash_buffer->write_pos() - 1; + } + return ReverseIterator(ash_buffer, read_start, read_end); + } + void lock() { mutex_.lock(); }; + void unlock() { mutex_.unlock(); }; private: - common::ObArray list_; - int64_t write_pos_; // where can write to when add an element + int allocate_ash_buffer(int64_t ash_size, common::ObSharedGuard &ash_buffer); + int64_t ash_size_; + lib::ObMutex mutex_; + common::ObSharedGuard ash_buffer_; }; } diff --git a/src/share/ash/ob_active_sess_hist_task.cpp b/src/share/ash/ob_active_sess_hist_task.cpp index 2af53f3105..ed8e4cadba 100644 --- a/src/share/ash/ob_active_sess_hist_task.cpp +++ b/src/share/ash/ob_active_sess_hist_task.cpp @@ -14,18 +14,30 @@ #include "lib/oblog/ob_log.h" #include "lib/thread/thread_mgr.h" +#include "observer/ob_srv_network_frame.h" #include "share/ob_thread_mgr.h" #include "share/ash/ob_active_sess_hist_task.h" #include "share/ash/ob_active_sess_hist_list.h" +#include "share/ash/ob_ash_refresh_task.h" #include "sql/session/ob_sql_session_mgr.h" #include "lib/utility/ob_tracepoint.h" #include "lib/statistic_event/ob_stat_event.h" #include "lib/time/ob_time_utility.h" +#include "share/wr/ob_wr_stat_guard.h" +#include "observer/omt/ob_th_worker.h" +#include "deps/oblib/src/rpc/obmysql/ob_mysql_packet.h" +#include "observer/ob_server_struct.h" +#include "observer/omt/ob_multi_tenant.h" +#include "lib/stat/ob_diagnostic_info_container.h" using namespace oceanbase::common; using namespace oceanbase::share; using namespace oceanbase::sql; +// a sample would be taken place up to 20ms after ash iteration begins. +// if sample time is above this threshold, mean ash execution too slow +constexpr int64_t ash_iteration_time = 40000; // 40ms + #define GET_OTHER_TSI_ADDR(var_name, addr) \ const int64_t var_name##_offset = ((int64_t)addr - (int64_t)pthread_self()); \ decltype(*addr) var_name = *(decltype(addr))(thread_base + var_name##_offset); @@ -59,6 +71,8 @@ int ObActiveSessHistTask::start() REFRESH_INTERVAL, true /* repeat */))) { LOG_WARN("fail define timer schedule", K(ret)); + } else if (OB_FAIL(ObAshRefreshTask::get_instance().start())) { + LOG_WARN("failed to start ash refresh task", K(ret)); } else { LOG_INFO("ASH init OK"); } @@ -82,51 +96,50 @@ void ObActiveSessHistTask::destroy() void ObActiveSessHistTask::runTimerTask() { - uint64_t ash_begin_time = common::ObTimeUtility::current_time(); - int is_ash_close = EVENT_CALL(EventTable::EN_CLOSE_ASH); - if (OB_NOT_NULL(GCTX.session_mgr_) && (0 == is_ash_close)) { - // iter over session mgr + common::ObTimeGuard time_guard(__func__, ash_iteration_time); + common::ObBKGDSessInActiveGuard inactive_guard; + int ret = OB_SUCCESS; + ObActiveSessHistList::get_instance().lock(); + if (true == GCONF._ob_ash_enable) { + WR_STAT_GUARD(ASH_SCHEDULAR); sample_time_ = ObTimeUtility::current_time(); - GCTX.session_mgr_->for_each_session(*this); - // iter over each thread - StackMgr::Guard guard(g_stack_mgr); - for (auto* header = *guard; OB_NOT_NULL(header); header = guard.next()) { - auto* thread_base = (char*)(header->pth_); - if (OB_NOT_NULL(thread_base)) { - GET_OTHER_TSI_ADDR(tid, &get_tid_cache()); + tsc_sample_time_ = rdtsc(); + + std::function fn = std::bind(&ObActiveSessHistTask::process_running_di, this, std::placeholders::_1, std::placeholders::_2); + + common::ObVector ids; + GCTX.omt_->get_tenant_ids(ids); + for (int64_t i = 0; i < ids.size(); ++i) { + uint64_t tenant_id = ids[i]; + if (!is_virtual_tenant_id(tenant_id)) { + MTL_SWITCH(tenant_id) { - char path[64]; - IGNORE_RETURN snprintf(path, 64, "/proc/self/task/%ld", tid); - if (-1 == access(path, F_OK)) { - // thread not exist, may have exited. - continue; + if (MTL(ObDiagnosticInfoContainer *)->is_inited() && OB_FAIL(MTL(ObDiagnosticInfoContainer *)->for_each_running_di(fn))) { + LOG_WARN("fail to process tenant ash stat, prceed anyway", K(ret), K(tenant_id)); + ret = OB_SUCCESS; } - } - GET_OTHER_TSI_ADDR(ash_stat, &ObActiveSessionGuard::thread_local_stat_); - if (ash_stat.in_das_remote_exec_ == true) { - ash_stat.sample_time_ = sample_time_; - ObActiveSessHistList::get_instance().add(ash_stat); + } else { + LOG_WARN("failed to switch to current tenant, prceed anyway", K(ret), K(tenant_id)); + ret = OB_SUCCESS; } } } + if (OB_FAIL(ObDiagnosticInfoContainer::get_global_di_container()->for_each_running_di(fn))) { + LOG_WARN("failed to get global diagnostic info", K(ret), KPC(ObDiagnosticInfoContainer::get_global_di_container())); + } } - EVENT_ADD(ASH_SCHEDULAR_ELAPSE_TIME, common::ObTimeUtility::current_time() - ash_begin_time); + ObActiveSessHistList::get_instance().unlock(); } -bool ObActiveSessHistTask::operator()(sql::ObSQLSessionMgr::Key key, ObSQLSessionInfo *sess_info) +bool ObActiveSessHistTask::process_running_di(const SessionID &session_id, ObDiagnosticInfo *di) { - if (OB_ISNULL(sess_info)) { - } else if (ObSQLSessionState::QUERY_ACTIVE == sess_info->get_session_state()) { - ActiveSessionStat &stat = sess_info->get_ash_stat(); - stat.sample_time_ = sample_time_; - stat.tenant_id_ = sess_info->get_effective_tenant_id(); - stat.user_id_ = sess_info->get_user_id(); - stat.session_id_ = sess_info->get_compatibility_sessid(); - stat.plan_id_ = sess_info->get_current_plan_id(); - stat.trace_id_ = sess_info->get_current_trace_id(); - sess_info->get_cur_sql_id(stat.sql_id_, sizeof(stat.sql_id_)); - ObActiveSessHistList::get_instance().add(stat); + if (di->is_active_session() || + ObWaitEventIds::NETWORK_QUEUE_WAIT == di->get_ash_stat().event_no_ || + di->get_ash_stat().is_in_row_lock_wait()) { + di->get_ash_stat().sample_time_ = sample_time_; + ObActiveSessionStat::calc_db_time(di, sample_time_, tsc_sample_time_); + ObActiveSessionStat::calc_retry_wait_event(di->get_ash_stat(), sample_time_); + ObActiveSessHistList::get_instance().add(di->get_ash_stat()); } return true; -} - +} \ No newline at end of file diff --git a/src/share/ash/ob_active_sess_hist_task.h b/src/share/ash/ob_active_sess_hist_task.h index 2a3381b6c3..09a97285dd 100644 --- a/src/share/ash/ob_active_sess_hist_task.h +++ b/src/share/ash/ob_active_sess_hist_task.h @@ -15,17 +15,21 @@ #include "lib/task/ob_timer.h" #include "sql/session/ob_sql_session_mgr.h" +#include "observer/net/ob_net_queue_traver.h" +#include "share/wr/ob_wr_snapshot_rpc_processor.h" namespace oceanbase { namespace share { +using ObNetInfo = rpc::ObNetTraverProcessAutoDiag::ObNetQueueTraRes; + class ObActiveSessHistTask : public common::ObTimerTask { public: ObActiveSessHistTask() - : is_inited_(false) {} + : is_inited_(false), sample_time_(OB_INVALID_TIMESTAMP), tsc_sample_time_(0) {} virtual ~ObActiveSessHistTask() = default; static ObActiveSessHistTask &get_instance(); int init(); @@ -34,10 +38,11 @@ public: void wait(); void destroy(); virtual void runTimerTask() override; - bool operator()(sql::ObSQLSessionMgr::Key key, sql::ObSQLSessionInfo *sess_info); private: + bool process_running_di(const SessionID &session_id, ObDiagnosticInfo *di); bool is_inited_; int64_t sample_time_; + int64_t tsc_sample_time_; }; } diff --git a/src/share/ash/ob_ash_refresh_task.cpp b/src/share/ash/ob_ash_refresh_task.cpp new file mode 100644 index 0000000000..4400d92598 --- /dev/null +++ b/src/share/ash/ob_ash_refresh_task.cpp @@ -0,0 +1,238 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE + +#include "deps/oblib/src/lib/mysqlclient/ob_mysql_proxy.h" +#include "share/ash/ob_ash_refresh_task.h" +#include "share/ash/ob_active_sess_hist_task.h" +#include "share/ash/ob_active_sess_hist_list.h" +#include "share/wr/ob_wr_task.h" +#include "share/wr/ob_wr_service.h" +#include "share/location_cache/ob_location_service.h" +#include "observer/ob_srv_network_frame.h" + +using namespace oceanbase::common; +using namespace oceanbase::share; +using namespace oceanbase::sql; +using namespace oceanbase::common::sqlclient; + +// refresh would consume time up to 10s +// if refresh time is above this threshold, refresh exection is too slow +constexpr int64_t ASH_REFESH_TIME = 10 * 1000L * 1000L; // 10s +// refersh task update its state and do decision making +// every ASH_REFRESH_INTERVAL +constexpr int64_t ASH_REFRESH_INTERVAL = 120 * 1000L * 1000L; // 120s +// we should snapshot ahead if current speed is SPEED_THRESHOLD times larger than expect speed +constexpr int SPEED_THRESHOLD = 10; +// ahead snapshot will be triggered only if the time remaining until the next scheduled snapshot is greater than SNAPSHOT_THRESHOLD +constexpr int SNAPSHOT_THRESHOLD = 180 * 1000L * 1000L; // 180s + +ObAshRefreshTask &ObAshRefreshTask::get_instance() +{ + static ObAshRefreshTask the_one; + return the_one; +} + +int ObAshRefreshTask::start() +{ + int ret = OB_SUCCESS; + STATIC_ASSERT(ASH_REFRESH_INTERVAL < SNAPSHOT_THRESHOLD, "ASH_REFRESH_INTERVAL should be less than SNAPSHOT_THRESHOLD"); + if (OB_FAIL(TG_SCHEDULE(lib::TGDefIDs::ServerGTimer, + *this, + ASH_REFRESH_INTERVAL, + true /* repeat */))) { + LOG_WARN("fail define timer schedule", K(ret)); + } else { + if (OB_FAIL(wr_proxy_.init(GCTX.net_frame_->get_req_transport()))) { + LOG_WARN("failed to init wr proxy", K(ret)); + } + LOG_INFO("AshRefresh init OK"); + last_scheduled_snapshot_time_ = ObTimeUtility::current_time(); + is_inited_ = true; + } + return ret; +} + +void ObAshRefreshTask::runTimerTask() +{ + if (0 == prev_write_pos_) { + } else if (GCONF._ob_ash_disk_write_enable) { + int64_t task_timeout_ts = ObTimeUtility::current_time() + ASH_REFRESH_INTERVAL * 1000L * 1000L - ESTIMATE_PS_RESERVE_TIME; + int ret = OB_SUCCESS; + common::ObTimeGuard time_guard(__func__, ASH_REFESH_TIME); + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObSqlString sql; + int64_t read_pos = 0; + int64_t last_snapshot_end_time = 0; + int64_t snapshot_flag = 0; + const uint64_t tenant_id = OB_SYS_TENANT_ID; + char svr_ip[common::OB_IP_STR_BUFF]; + int32_t svr_port; + GCONF.self_addr_.ip_to_string(svr_ip, sizeof(svr_ip)); + svr_port = GCONF.self_addr_.get_port(); + + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_ISNULL(sql_proxy)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ time_to_usec(END_INTERVAL_TIME), snap_flag FROM %s where " + "snap_id=%ld and tenant_id=%ld", + OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, LAST_SNAPSHOT_RECORD_SNAP_ID, OB_SYS_TENANT_ID))) { + LOG_WARN("failed to format sql", KR(ret)); + } else if (OB_FAIL( + sql_proxy->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(sql)); + } else if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + // no record in __wr_snapshot table. this is the first time we take snapshot in this + // cluster or user delete this record. + last_snapshot_end_time = last_scheduled_snapshot_time_; + ret = OB_SUCCESS; + LOG_WARN("last snapshot end time doesn't exist in this cluster", K(tenant_id)); + } + } else if (OB_FAIL(result->get_int(0L, last_snapshot_end_time))) { + LOG_WARN("get column fail", KR(ret), K(sql)); + } else if (OB_FAIL(result->get_int(1L, snapshot_flag))) { + LOG_WARN("get column fail", KR(ret), K(sql)); + } + + if (OB_SUCC(ret)) { + res.reuse(); + sql.reuse(); + if (OB_ISNULL(sql_proxy)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ min(sample_id)+1 from %s where " + "svr_ip='%s' and svr_port=%d and sample_time>usec_to_time(%ld)", + OB_V_OB_ACTIVE_SESSION_HISTORY_TNAME, svr_ip, svr_port, last_snapshot_end_time))) { + LOG_WARN("failed to format sql", KR(ret)); + } else if (OB_FAIL( + GCTX.sql_proxy_->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(sql)); + } else if (OB_FAIL(result->next())) { + LOG_WARN("fail to get next row", KR(ret)); + } else if (OB_FAIL(result->get_int(0L, read_pos))) { + LOG_WARN("get column fail", KR(ret), K(sql)); + } + } + } + if (OB_SUCC(ret)) { + ObActiveSessHistList::get_instance().set_read_pos(read_pos); + if (static_cast(snapshot_flag) == ObWrSnapshotFlag::LAST_SCHEDULED_SNAPSHOT) { + last_scheduled_snapshot_time_ = last_snapshot_end_time; + } + // send rpc + if (require_snapshot_ahead()) { + int64_t timeout = task_timeout_ts - ObTimeUtility::current_time(); + ObMultiVersionSchemaService *schema_service = GCTX.schema_service_; + ObArray all_tenants; + ObAddr leader; + if (OB_FAIL(schema_service->get_tenant_ids(all_tenants))) { + LOG_WARN("failed to get all tenant ids", KR(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < all_tenants.size(); i++) { + const uint64_t tenant_id = all_tenants.at(i); + if (is_sys_tenant(tenant_id) || is_user_tenant(tenant_id)) { + if (check_tenant_can_do_wr_task(tenant_id)) { + ObWrCreateSnapshotArg arg( + tenant_id, LAST_SNAPSHOT_RECORD_SNAP_ID, last_snapshot_end_time, ObTimeUtility::current_time(), task_timeout_ts); + if (OB_FAIL(GCTX.location_service_->get_leader( + GCONF.cluster_id, tenant_id, share::SYS_LS, false /*force_renew*/, leader))) { + LOG_WARN("fail to get ls locaiton leader", KR(ret), K(tenant_id)); + } else if (OB_FAIL(wr_proxy_.to(leader) + .by(tenant_id) + .timeout(timeout) + .group_id(share::OBCG_WR) + .wr_async_take_snapshot(arg, nullptr))) { + LOG_WARN("failed to send async snapshot task", KR(ret), K(tenant_id)); + } else { + LOG_DEBUG("executing snapshot task for tenant", K(tenant_id), K(leader), K(timeout), + K(arg)); + } + } + } else { + LOG_DEBUG("Only system and user tenants support WR diagnostics", K(ret), K(tenant_id)); + } + if (OB_FAIL(ret)) { + ret = OB_SUCCESS; + LOG_WARN( + "wr snapshot ahead failed for current tenant, procede to next tenant", K(tenant_id)); + } + } + } + } + } + } + prev_write_pos_ = ObActiveSessHistList::get_instance().write_pos(); + prev_sched_time_ = ObTimeUtility::current_time(); +} + +ERRSIM_POINT_DEF(EN_FORCE_ENABLE_SNAPSHOT_AHEAD); + +bool ObAshRefreshTask::require_snapshot_ahead() +{ + bool bret = false; + int64_t write_pos = ObActiveSessHistList::get_instance().write_pos(); + int64_t free_slots_num = ObActiveSessHistList::get_instance().free_slots_num(); + int64_t scheduled_snapshot_interval = GCTX.wr_service_->get_snapshot_interval(false) * 60 * 1000L * 1000L; + int64_t next_scheduled_snapshot_interval = scheduled_snapshot_interval - (ObTimeUtility::current_time() - last_scheduled_snapshot_time_); + if (next_scheduled_snapshot_interval <= 0 || next_scheduled_snapshot_interval > scheduled_snapshot_interval) { + // last scheduled snapshot time update may lose or no last scheduled snapshot or this machine's clock is behind + // cluster pressure may be heavy + LOG_WARN_RET(OB_INVALID_TIMESTAMP, "unexpected next scheduled snapshot interval"); + bret = false; + } else { + double cur_speed = 1.0 * (write_pos - prev_write_pos_) / ((ObTimeUtility::current_time() - prev_sched_time_) / 1000 / 1000); + double expect_speed = 1.0 * free_slots_num / (next_scheduled_snapshot_interval / 1000 / 1000); + bret = (cur_speed >= SPEED_THRESHOLD * expect_speed) && (next_scheduled_snapshot_interval > SNAPSHOT_THRESHOLD); + } + if (EN_FORCE_ENABLE_SNAPSHOT_AHEAD) { + bret = true; + LOG_INFO("force enable snapshot ahead"); + } + return bret; +} + +bool ObAshRefreshTask::check_tenant_can_do_wr_task(uint64_t tenant_id) +{ + bool bret = false; + int ret = OB_SUCCESS; + uint64_t data_version = OB_INVALID_VERSION; + ObSchemaGetterGuard schema_guard; + schema::ObMultiVersionSchemaService *schema_service = GCTX.schema_service_; + const ObSimpleTenantSchema *tenant_schema = nullptr; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { + LOG_WARN("get min data_version failed", KR(ret), K(tenant_id)); + } else if (data_version < DATA_VERSION_4_3_5_0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("tenant data version is too low for wr", K(tenant_id), K(data_version)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than 4.3.5, workload repository not supported"); + } else if (OB_FAIL(schema_service->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("failed to get schema guard", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) { + LOG_WARN("failed to get tenant info", K(ret), K(tenant_id)); + } else if (tenant_schema->is_normal()) { + bret = true; + } else { + LOG_WARN("tenant status abnormal for wr", K(tenant_schema->get_status()), K(tenant_id)); + } + return bret; +} diff --git a/src/share/ash/ob_ash_refresh_task.h b/src/share/ash/ob_ash_refresh_task.h new file mode 100644 index 0000000000..e6fc434ac6 --- /dev/null +++ b/src/share/ash/ob_ash_refresh_task.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef _OB_SHARE_ASH_REFRESH_TASK_H_ +#define _OB_SHARE_ASH_REFRESH_TASK_H_ + +#include "lib/task/ob_timer.h" +#include "share/wr/ob_wr_snapshot_rpc_processor.h" + +namespace oceanbase +{ +namespace share +{ + +class ObAshRefreshTask : public common::ObTimerTask +{ +public: + ObAshRefreshTask(): is_inited_(false), last_scheduled_snapshot_time_(OB_INVALID_TIMESTAMP), prev_write_pos_(0), prev_sched_time_(0) {} + virtual ~ObAshRefreshTask() = default; + static ObAshRefreshTask &get_instance(); + int start(); + virtual void runTimerTask() override; +private: + bool require_snapshot_ahead(); + bool check_tenant_can_do_wr_task(uint64_t tenant_id); + obrpc::ObWrRpcProxy wr_proxy_; + bool is_inited_; + int64_t last_scheduled_snapshot_time_; + int64_t prev_write_pos_; + int64_t prev_sched_time_; + +}; +} +} +#endif /* _OB_SHARE_ASH_REFRESH_TASK_H_ */ +//// end of header file \ No newline at end of file diff --git a/src/share/ash/ob_di_util.cpp b/src/share/ash/ob_di_util.cpp new file mode 100644 index 0000000000..a8db42cd49 --- /dev/null +++ b/src/share/ash/ob_di_util.cpp @@ -0,0 +1,235 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE + +#include "lib/stat/ob_diagnostic_info_container.h" +#include "share/ash/ob_di_util.h" +#include "lib/container/ob_vector.h" +#include "observer/ob_server_struct.h" +#include "observer/omt/ob_multi_tenant.h" +#include "common/ob_smart_var.h" + +namespace oceanbase +{ +namespace share +{ + +int ObDiagnosticInfoUtil::get_the_diag_info(int64_t session_id, ObDISessionCollect &diag_info) +{ + int ret = OB_SUCCESS; + common::ObVector ids; + if (MTL_ID() == OB_SYS_TENANT_ID) { + GCTX.omt_->get_tenant_ids(ids); + } else { + ids.push_back(MTL_ID()); + } + for (int64_t i = 0; i < ids.size(); ++i) { + uint64_t tenant_id = ids[i]; + if (!is_virtual_tenant_id(tenant_id)) { + MTL_SWITCH(tenant_id) + { + if (OB_FAIL( + MTL(ObDiagnosticInfoContainer *)->get_session_diag_info(session_id, diag_info))) { + if (OB_ENTRY_NOT_EXIST != ret) { + break; + } else { + // iter next possible tenant + } + } else { + // until success. + break; + } + } + } + } + return ret; +} + +int ObDiagnosticInfoUtil::get_all_diag_info( + ObIArray> &diag_infos, int64_t tenant_id) +{ + int ret = OB_SUCCESS; + common::ObVector ids; + GCTX.omt_->get_tenant_ids(ids); + std::function fn = [&diag_infos](const SessionID &session_id, + ObDiagnosticInfo *di) { + int ret = OB_SUCCESS; + typedef std::pair DiPair; + HEAP_VAR(DiPair, pair) + { + pair.first = di->get_session_id(); + pair.second.session_id_ = di->get_session_id(); + pair.second.base_value_.set_tenant_id(di->get_tenant_id()); + pair.second.base_value_.set_curr_wait(di->get_curr_wait()); + pair.second.base_value_.get_add_stat_stats().add(di->get_add_stat_stats()); + di->get_event_stats().accumulate_to(pair.second.base_value_.get_event_stats()); + if (OB_FAIL(diag_infos.push_back(pair))) { + LOG_WARN("failed to insert into diagnostic infos", K(ret)); + } + } + return OB_SUCCESS == ret; + }; + for (int64_t i = 0; OB_SUCC(ret) && i < ids.size(); ++i) { + uint64_t cur_tenant_id = ids[i]; + if (tenant_id == OB_SYS_TENANT_ID || cur_tenant_id == tenant_id) { + if (!is_virtual_tenant_id(cur_tenant_id)) { + MTL_SWITCH(cur_tenant_id) + { + if (OB_FAIL(MTL(ObDiagnosticInfoContainer *)->for_each_running_di(fn))) { + LOG_WARN("failed to get all diag info", K(ret)); + } + } + } + } + } + return ret; +} + +int ObDiagnosticInfoUtil::get_the_diag_info(uint64_t tenant_id, ObDiagnoseTenantInfo &diag_info) +{ + int ret = OB_SUCCESS; + std::function fn = [&diag_info](const SessionID &session_id, + ObDiagnosticInfo *di) { + diag_info.get_add_stat_stats().add(di->get_add_stat_stats()); + const_cast(di)->get_event_stats().accumulate_to( + diag_info.get_event_stats()); + return true; + }; + MTL_SWITCH(tenant_id) + { + ObDiagnosticInfoContainer *c = MTL(ObDiagnosticInfoContainer *); + if (OB_FAIL(c->for_each_running_di(fn))) { + LOG_WARN("failed to get tenant diagnostic info", K(ret), KPC(c)); + } + if (OB_SUCC(ret)) { + if (OB_FAIL(c->get_base_summary().get_tenant_add_stats( + tenant_id, diag_info.get_add_stat_stats()))) { + LOG_WARN("failed to get base summary", K(ret)); + } else if (OB_FAIL(c->get_base_summary().get_tenant_event(tenant_id, diag_info.get_event_stats()))) { + LOG_WARN("failed to get base summary", K(ret)); + // latch stat only record in global stat. + // } else if (c->get_base_summary().get_tenant_latch_stat( + // tenant_id, diag_info.get_latch_stats())) { + // LOG_WARN("failed to get base summary", K(ret)); + } + } + } + if (OB_SUCC(ret) && tenant_id == OB_SYS_TENANT_ID) { + ObDiagnosticInfoContainer *c = ObDiagnosticInfoContainer::get_global_di_container(); + if (OB_FAIL(c->for_each_running_di(fn))) { + LOG_WARN("failed to get tenant diagnostic info", K(ret), KPC(c)); + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(c->get_base_summary().get_tenant_add_stats( + tenant_id, diag_info.get_add_stat_stats()))) { + LOG_WARN("failed to get base summary", K(ret)); + } else if (OB_FAIL(c->get_base_summary().get_tenant_event(tenant_id, diag_info.get_event_stats()))) { + LOG_WARN("failed to get base summary", K(ret)); + } else if (OB_FAIL(c->get_base_summary().get_tenant_latch_stat( + tenant_id, diag_info.get_latch_stats()))) { + LOG_WARN("failed to get base summary", K(ret)); + } + } + } + return ret; +} + +inline int get_group_di(int64_t group_id, + ObArray> &diag_infos, + common::ObIAllocator *alloc, ObDiagnoseTenantInfo *&di) +{ + int ret = OB_SUCCESS; + di = nullptr; + for (int i = 0; i < diag_infos.size(); i++) { + if (diag_infos.at(i).first == group_id) { + di = &diag_infos.at(i).second; + break; + } + } + if (OB_ISNULL(di)) { + typedef std::pair ResType; + HEAP_VAR(ResType, tinfo, group_id, alloc) + { + if (OB_FAIL(diag_infos.push_back(tinfo))) { + LOG_WARN("failed to create group diagnose info", K(ret), K(group_id)); + } else { + di = &(diag_infos.at(diag_infos.size() - 1).second); + OB_ASSERT(diag_infos.at(diag_infos.size() - 1).first == group_id); + } + } + } + return ret; +} + +int ObDiagnosticInfoUtil::get_group_diag_info(uint64_t tenant_id, + ObArray> &diag_infos, + common::ObIAllocator *alloc) +{ + int ret = OB_SUCCESS; + std::function fn = [&diag_infos, &alloc]( + const SessionID &session_id, + ObDiagnosticInfo *di) { + ObDiagnoseTenantInfo *tdi = nullptr; + int ret = OB_SUCCESS; + if (OB_FAIL(get_group_di(di->get_group_id(), diag_infos, alloc, tdi))) { + LOG_WARN("failed to acquire di", K(ret), K(di)); + } else { + OB_ASSERT(tdi != nullptr); + tdi->get_add_stat_stats().add(di->get_add_stat_stats()); + const_cast(di)->get_event_stats().accumulate_to(tdi->get_event_stats()); + } + return OB_SUCCESS == ret; + }; + + std::function summary_fn = + [&diag_infos, &alloc](int64_t group_id, const ObDiagnoseTenantInfo &di) { + ObDiagnoseTenantInfo *tdi = nullptr; + int ret = OB_SUCCESS; + if (OB_FAIL(get_group_di(group_id, diag_infos, alloc, tdi))) { + LOG_WARN("failed to acquire di", K(ret), K(di)); + } else { + OB_ASSERT(tdi != nullptr); + tdi->get_add_stat_stats().add( + const_cast(di).get_add_stat_stats()); + tdi->get_event_stats().add(const_cast(di).get_event_stats()); + } + }; + MTL_SWITCH(tenant_id) + { + ObDiagnosticInfoContainer *c = MTL(ObDiagnosticInfoContainer *); + if (OB_FAIL(c->for_each_running_di(fn))) { + LOG_WARN("failed to get tenant diagnostic info", K(ret), KPC(c)); + } + if (OB_SUCC(ret)) { + if (OB_FAIL(c->get_base_summary().for_each_group(summary_fn))) { + LOG_WARN("failed to get base summary", K(ret)); + } + } + } + if (OB_SUCC(ret) && tenant_id == OB_SYS_TENANT_ID) { + ObDiagnosticInfoContainer *c = ObDiagnosticInfoContainer::get_global_di_container(); + if (OB_FAIL(c->for_each_running_di(fn))) { + LOG_WARN("failed to get tenant diagnostic info", K(ret), KPC(c)); + } + if (OB_SUCC(ret)) { + if (OB_FAIL(c->get_base_summary().for_each_group(summary_fn))) { + LOG_WARN("failed to get base summary", K(ret)); + } + } + } + return ret; +} + +} /* namespace share */ +} /* namespace oceanbase */ diff --git a/src/share/ash/ob_di_util.h b/src/share/ash/ob_di_util.h new file mode 100644 index 0000000000..5a8716ea3f --- /dev/null +++ b/src/share/ash/ob_di_util.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2024 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_DI_UTIL_H_ +#define OB_DI_UTIL_H_ + +#include "lib/stat/ob_diagnostic_info_container.h" +#include "lib/stat/ob_diagnose_info.h" +#include "lib/stat/ob_di_cache.h" + +namespace oceanbase +{ +namespace share +{ + +class ObDiagnosticInfoUtil +{ +public: + static int get_the_diag_info(int64_t session_id, ObDISessionCollect &diag_infos); + static int get_all_diag_info(ObIArray> &diag_infos, int64_t tenant_id = OB_SYS_TENANT_ID); + static int get_the_diag_info(uint64_t tenant_id, ObDiagnoseTenantInfo &diag_info); + static int get_group_diag_info(uint64_t tenant_id, + ObArray> &diag_infos, + common::ObIAllocator *alloc); + +private: + ObDiagnosticInfoUtil() = default; + ~ObDiagnosticInfoUtil() = default; + DISABLE_COPY_ASSIGN(ObDiagnosticInfoUtil); +}; + +} // namespace share +} // namespace oceanbase + +#endif /* OB_DI_UTIL_H_ */ \ No newline at end of file diff --git a/src/share/deadlock/ob_lcl_scheme/ob_lcl_batch_sender_thread.cpp b/src/share/deadlock/ob_lcl_scheme/ob_lcl_batch_sender_thread.cpp index deb6fc19ca..f7a7f69d5b 100644 --- a/src/share/deadlock/ob_lcl_scheme/ob_lcl_batch_sender_thread.cpp +++ b/src/share/deadlock/ob_lcl_scheme/ob_lcl_batch_sender_thread.cpp @@ -23,6 +23,7 @@ #include #include + namespace oceanbase { namespace share @@ -258,7 +259,7 @@ void ObLCLBatchSenderThread::run1() record_summary_info_and_logout_when_necessary_(begin_ts, end_ts, diff); if (diff < _lcl_op_interval) { - ob_usleep(static_cast(_lcl_op_interval - diff)); + ob_usleep(static_cast(_lcl_op_interval - diff), true/*is_idle_sleep*/); // DETECT_LOG(DEBUG, "scan done", K(diff), K(*this)); } } diff --git a/src/share/detect/ob_detect_manager.cpp b/src/share/detect/ob_detect_manager.cpp index 93a3d900e9..b1845593c8 100644 --- a/src/share/detect/ob_detect_manager.cpp +++ b/src/share/detect/ob_detect_manager.cpp @@ -713,7 +713,7 @@ int ObDetectManagerThread::detect() { if (sleep_time < 0) { sleep_time = 0; } else { - ob_usleep(sleep_time); + ob_usleep(sleep_time, true/*is_idle_sleep*/); } ++loop_time; LIB_LOG(DEBUG, "[DM] detect has execute ", K(loop_time)); diff --git a/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp b/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp index 8059e29d00..fbcefa25e2 100644 --- a/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp @@ -4222,6 +4222,226 @@ int ObInnerTableSchema::all_virtual_ddl_sim_point_stat_schema(ObTableSchema &tab return ret; } +int ObInnerTableSchema::all_virtual_res_mgr_sysstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(5); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("group_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("statistic#", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("value", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("value_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("stat_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("class", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("can_visible", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTinyIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + 1, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST_COLUMNS); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("svr_ip, svr_port"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp b/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp index 4459e697b5..c28b2419df 100644 --- a/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp @@ -11799,6 +11799,366 @@ int ObInnerTableSchema::all_virtual_checkpoint_diagnose_info_schema(ObTableSchem return ret; } +int ObInnerTableSchema::all_virtual_wr_system_event_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(6); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("total_waits", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("total_timeouts", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("time_waited_micro", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_wr_event_name_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_EVENT_NAME_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_EVENT_NAME_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter1", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter2", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter3", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("wait_class_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("wait_class", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_tenant_scheduler_running_job_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -12586,6 +12946,2275 @@ int ObInnerTableSchema::all_virtual_routine_privilege_history_schema(ObTableSche return ret; } +int ObInnerTableSchema::all_virtual_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_HASH", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("QUERY_SQL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObLongTextType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MODULE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ACTION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_USER_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj executions_total_default; + executions_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("EXECUTIONS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_total_default, + executions_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj executions_delta_default; + executions_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("EXECUTIONS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_delta_default, + executions_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_total_default; + disk_reads_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("DISK_READS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_total_default, + disk_reads_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_delta_default; + disk_reads_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("DISK_READS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_delta_default, + disk_reads_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_total_default; + buffer_gets_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("BUFFER_GETS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_total_default, + buffer_gets_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_delta_default; + buffer_gets_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("BUFFER_GETS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_delta_default, + buffer_gets_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_total_default; + elapsed_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ELAPSED_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_total_default, + elapsed_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_delta_default; + elapsed_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ELAPSED_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_delta_default, + elapsed_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_total_default; + cpu_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("CPU_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_total_default, + cpu_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_delta_default; + cpu_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("CPU_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_delta_default, + cpu_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_total_default; + ccwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("CCWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_total_default, + ccwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_delta_default; + ccwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("CCWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_delta_default, + ccwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_total_default; + userio_wait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("USERIO_WAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_total_default, + userio_wait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_delta_default; + userio_wait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("USERIO_WAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_delta_default, + userio_wait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_total_default; + apwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("APWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_total_default, + apwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_delta_default; + apwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("APWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_delta_default, + apwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_total_default; + physical_read_requests_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PHYSICAL_READ_REQUESTS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_total_default, + physical_read_requests_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_delta_default; + physical_read_requests_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PHYSICAL_READ_REQUESTS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_delta_default, + physical_read_requests_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_total_default; + physical_read_bytes_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PHYSICAL_READ_BYTES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_total_default, + physical_read_bytes_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_delta_default; + physical_read_bytes_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PHYSICAL_READ_BYTES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_delta_default, + physical_read_bytes_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_total_default; + write_throttle_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("WRITE_THROTTLE_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_total_default, + write_throttle_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_delta_default; + write_throttle_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("WRITE_THROTTLE_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_delta_default, + write_throttle_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_total_default; + rows_processed_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ROWS_PROCESSED_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_total_default, + rows_processed_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_delta_default; + rows_processed_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ROWS_PROCESSED_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_delta_default, + rows_processed_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_total_default; + memstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MEMSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_total_default, + memstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_delta_default; + memstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MEMSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_delta_default, + memstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_total_default; + minor_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MINOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_total_default, + minor_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_delta_default; + minor_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MINOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_delta_default, + minor_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_total_default; + major_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MAJOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_total_default, + major_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_delta_default; + major_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("MAJOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_delta_default, + major_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_total_default; + rpc_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("RPC_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_total_default, + rpc_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_delta_default; + rpc_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("RPC_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_delta_default, + rpc_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_total_default; + fetches_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("FETCHES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_total_default, + fetches_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_delta_default; + fetches_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("FETCHES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_delta_default, + fetches_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_total_default; + retry_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("RETRY_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_total_default, + retry_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_delta_default; + retry_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("RETRY_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_delta_default, + retry_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_total_default; + partition_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PARTITION_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_total_default, + partition_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_delta_default; + partition_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PARTITION_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_delta_default, + partition_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_total_default; + nested_sql_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("NESTED_SQL_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_total_default, + nested_sql_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_delta_default; + nested_sql_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("NESTED_SQL_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_delta_default, + nested_sql_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj route_miss_total_default; + route_miss_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ROUTE_MISS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_total_default, + route_miss_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj route_miss_delta_default; + route_miss_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ROUTE_MISS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_delta_default, + route_miss_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("FIRST_LOAD_TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_total_default; + plan_cache_hit_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PLAN_CACHE_HIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_total_default, + plan_cache_hit_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_delta_default; + plan_cache_hit_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("PLAN_CACHE_HIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_delta_default, + plan_cache_hit_delta_default); //default_value + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST_COLUMNS); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_wr_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_hash", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("source_ip", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("source_port", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("module", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("action", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_db_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_db_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj executions_total_default; + executions_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("executions_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_total_default, + executions_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj executions_delta_default; + executions_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("executions_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_delta_default, + executions_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_total_default; + disk_reads_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("disk_reads_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_total_default, + disk_reads_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_delta_default; + disk_reads_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("disk_reads_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_delta_default, + disk_reads_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_total_default; + buffer_gets_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("buffer_gets_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_total_default, + buffer_gets_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_delta_default; + buffer_gets_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("buffer_gets_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_delta_default, + buffer_gets_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_total_default; + elapsed_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("elapsed_time_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_total_default, + elapsed_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_delta_default; + elapsed_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("elapsed_time_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_delta_default, + elapsed_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_total_default; + cpu_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("cpu_time_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_total_default, + cpu_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_delta_default; + cpu_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("cpu_time_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_delta_default, + cpu_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_total_default; + ccwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ccwait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_total_default, + ccwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_delta_default; + ccwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ccwait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_delta_default, + ccwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_total_default; + userio_wait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("userio_wait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_total_default, + userio_wait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_delta_default; + userio_wait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("userio_wait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_delta_default, + userio_wait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_total_default; + apwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("apwait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_total_default, + apwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_delta_default; + apwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("apwait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_delta_default, + apwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_total_default; + physical_read_requests_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_requests_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_total_default, + physical_read_requests_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_delta_default; + physical_read_requests_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_requests_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_delta_default, + physical_read_requests_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_total_default; + physical_read_bytes_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_bytes_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_total_default, + physical_read_bytes_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_delta_default; + physical_read_bytes_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_bytes_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_delta_default, + physical_read_bytes_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_total_default; + write_throttle_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("write_throttle_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_total_default, + write_throttle_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_delta_default; + write_throttle_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("write_throttle_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_delta_default, + write_throttle_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_total_default; + rows_processed_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rows_processed_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_total_default, + rows_processed_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_delta_default; + rows_processed_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rows_processed_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_delta_default, + rows_processed_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_total_default; + memstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("memstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_total_default, + memstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_delta_default; + memstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("memstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_delta_default, + memstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_total_default; + minor_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("minor_ssstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_total_default, + minor_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_delta_default; + minor_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("minor_ssstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_delta_default, + minor_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_total_default; + major_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("major_ssstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_total_default, + major_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_delta_default; + major_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("major_ssstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_delta_default, + major_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_total_default; + rpc_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rpc_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_total_default, + rpc_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_delta_default; + rpc_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rpc_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_delta_default, + rpc_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_total_default; + fetches_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("fetches_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_total_default, + fetches_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_delta_default; + fetches_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("fetches_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_delta_default, + fetches_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_total_default; + retry_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("retry_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_total_default, + retry_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_delta_default; + retry_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("retry_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_delta_default, + retry_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_total_default; + partition_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("partition_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_total_default, + partition_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_delta_default; + partition_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("partition_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_delta_default, + partition_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_total_default; + nested_sql_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("nested_sql_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_total_default, + nested_sql_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_delta_default; + nested_sql_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("nested_sql_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_delta_default, + nested_sql_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj route_miss_total_default; + route_miss_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("route_miss_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_total_default, + route_miss_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj route_miss_delta_default; + route_miss_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("route_miss_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_delta_default, + route_miss_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("first_load_time", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_total_default; + plan_cache_hit_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("plan_cache_hit_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_total_default, + plan_cache_hit_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_delta_default; + plan_cache_hit_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("plan_cache_hit_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_delta_default, + plan_cache_hit_delta_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_aux_stat_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp index 6ff2429be0..20eaa51375 100644 --- a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp @@ -729,6 +729,141 @@ int ObInnerTableSchema::all_virtual_tenant_snapshot_job_schema(ObTableSchema &ta return ret; } +int ObInnerTableSchema::all_virtual_wr_sqltext_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQLTEXT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(4); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQLTEXT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("query_sql", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObLongTextType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_dbms_lock_allocated_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.12501_12550.cpp b/src/share/inner_table/ob_inner_table_schema.12501_12550.cpp index 3192268126..985e7654de 100644 --- a/src/share/inner_table/ob_inner_table_schema.12501_12550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12501_12550.cpp @@ -232,6 +232,701 @@ int ObInnerTableSchema::all_virtual_kv_client_info_schema(ObTableSchema &table_s return ret; } +int ObInnerTableSchema::all_virtual_wr_sql_plan_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQL_PLAN_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQL_PLAN_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_hash", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_id", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj id_default; + id_default.set_uint64(0); + ADD_COLUMN_SCHEMA_T("id", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + id_default, + id_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("db_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("operator", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 255, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("options", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 255, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_node", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 40, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_owner", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_alias", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 261, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 20, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("optimizer", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parent_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("depth", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("position", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_last_child", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("real_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cardinality", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("real_cardinality", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("bytes", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("rowset", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other_tag", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("partition_start", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cpu_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("io_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("access_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("filter_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("startup_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("projection", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("special_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("qblock_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("remarks", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other_xml", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_function_io_stat_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp b/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp index fc91350a40..0aa395c109 100644 --- a/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp @@ -5320,6 +5320,2416 @@ int ObInnerTableSchema::all_virtual_cgroup_config_ora_schema(ObTableSchema &tabl return ret; } +int ObInnerTableSchema::all_virtual_wr_system_event_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(6); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLUSTER_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SNAP_ID", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EVENT_ID", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TOTAL_WAITS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TOTAL_TIMEOUTS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TIME_WAITED_MICRO", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_wr_event_name_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLUSTER_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EVENT_ID", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EVENT_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARAMETER1", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARAMETER2", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARAMETER3", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WAIT_CLASS_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WAIT_CLASS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_sqlstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_SQLSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_SQLSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_HASH", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("QUERY_SQL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObLongTextType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MODULE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ACTION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_USER_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXECUTIONS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXECUTIONS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DISK_READS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DISK_READS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BUFFER_GETS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BUFFER_GETS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ELAPSED_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ELAPSED_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CPU_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CPU_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CCWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CCWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USERIO_WAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USERIO_WAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("APWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("APWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_REQUESTS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_REQUESTS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_BYTES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_BYTES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WRITE_THROTTLE_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WRITE_THROTTLE_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROWS_PROCESSED_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROWS_PROCESSED_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MEMSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MEMSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MINOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MINOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MAJOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MAJOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RPC_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RPC_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FETCHES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FETCHES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RETRY_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RETRY_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARTITION_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARTITION_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NESTED_SQL_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NESTED_SQL_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROUTE_MISS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROUTE_MISS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FIRST_LOAD_TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampLTZType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_CACHE_HIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_CACHE_HIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_wr_sqlstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLUSTER_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SNAP_ID", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_HASH", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_IP", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SOURCE_PORT", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MODULE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ACTION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_DB_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARSING_USER_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXECUTIONS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXECUTIONS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DISK_READS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DISK_READS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BUFFER_GETS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BUFFER_GETS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ELAPSED_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ELAPSED_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CPU_TIME_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CPU_TIME_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CCWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CCWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USERIO_WAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USERIO_WAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("APWAIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("APWAIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_REQUESTS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_REQUESTS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_BYTES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PHYSICAL_READ_BYTES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WRITE_THROTTLE_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("WRITE_THROTTLE_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROWS_PROCESSED_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROWS_PROCESSED_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MEMSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MEMSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MINOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MINOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MAJOR_SSSTORE_READ_ROWS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MAJOR_SSSTORE_READ_ROWS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RPC_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RPC_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FETCHES_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FETCHES_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RETRY_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RETRY_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARTITION_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARTITION_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NESTED_SQL_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NESTED_SQL_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROUTE_MISS_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROUTE_MISS_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FIRST_LOAD_TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampLTZType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_CACHE_HIT_TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_CACHE_HIT_DELTA", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::tenant_virtual_statname_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_TENANT_VIRTUAL_STATNAME_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_TENANT_VIRTUAL_STATNAME_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STAT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STATISTIC#", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DISPLAY_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLASS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_aux_stat_real_agent_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -6190,6 +8600,141 @@ int ObInnerTableSchema::all_virtual_transfer_partition_task_history_real_agent_o return ret; } +int ObInnerTableSchema::all_virtual_wr_sqltext_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(4); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLUSTER_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SNAP_ID", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("QUERY_SQL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObLongTextType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_ls_snapshot_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.15451_15500.cpp b/src/share/inner_table/ob_inner_table_schema.15451_15500.cpp index 5e07259caf..6e551c8581 100644 --- a/src/share/inner_table/ob_inner_table_schema.15451_15500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15451_15500.cpp @@ -1160,6 +1160,166 @@ int ObInnerTableSchema::all_virtual_nic_info_ora_schema(ObTableSchema &table_sch return ret; } +int ObInnerTableSchema::all_virtual_query_response_time_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("RESPONSE_TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("COUNT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TOTAL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 128, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_scheduler_job_run_detail_v2_real_agent_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -5210,6 +5370,916 @@ int ObInnerTableSchema::all_virtual_pkg_coll_type_real_agent_ora_schema(ObTableS return ret; } +int ObInnerTableSchema::all_virtual_wr_sql_plan_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLUSTER_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SNAP_ID", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_HASH", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PLAN_ID", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ID", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DB_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("GMT_CREATE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampLTZType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OPERATOR", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 255, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OPTIONS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 255, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_NODE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 40, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_OWNER", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 128, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 128, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_ALIAS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 261, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OBJECT_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 20, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OPTIMIZER", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARENT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DEPTH", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("POSITION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("IS_LAST_CHILD", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("COST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("REAL_COST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CARDINALITY", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("REAL_CARDINALITY", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BYTES", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROWSET", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OTHER_TAG", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PARTITION_START", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OTHER", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CPU_COST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("IO_COST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ACCESS_PREDICATES", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("FILTER_PREDICATES", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STARTUP_PREDICATES", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PROJECTION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SPECIAL_PREDICATES", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("QBLOCK_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 128, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("REMARKS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("OTHER_XML", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 4000, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_res_mgr_sysstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(5); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("GROUP_ID", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STATISTIC#", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("VALUE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("VALUE_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 16, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STAT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 64, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CLASS", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CAN_VISIBLE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_function_io_stat_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21001_21050.cpp b/src/share/inner_table/ob_inner_table_schema.21001_21050.cpp index 9abfad5c26..3600d0f3cd 100644 --- a/src/share/inner_table/ob_inner_table_schema.21001_21050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21001_21050.cpp @@ -774,7 +774,7 @@ int ObInnerTableSchema::gv_ob_sql_audit_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(select svr_ip as SVR_IP, svr_port as SVR_PORT, request_id as REQUEST_ID, execution_id as SQL_EXEC_ID, trace_id as TRACE_ID, session_id as SID, client_ip as CLIENT_IP, client_port as CLIENT_PORT, tenant_id as TENANT_ID, tenant_name as TENANT_NAME, effective_tenant_id as EFFECTIVE_TENANT_ID, user_id as USER_ID, user_name as USER_NAME, user_group as USER_GROUP, user_client_ip as USER_CLIENT_IP, db_id as DB_ID, db_name as DB_NAME, sql_id as SQL_ID, query_sql as QUERY_SQL, plan_id as PLAN_ID, affected_rows as AFFECTED_ROWS, return_rows as RETURN_ROWS, partition_cnt as PARTITION_CNT, ret_code as RET_CODE, qc_id as QC_ID, dfo_id as DFO_ID, sqc_id as SQC_ID, worker_id as WORKER_ID, event as EVENT, p1text as P1TEXT, p1 as P1, p2text as P2TEXT, p2 as P2, p3text as P3TEXT, p3 as P3, `level` as `LEVEL`, wait_class_id as WAIT_CLASS_ID, `wait_class#` as `WAIT_CLASS#`, wait_class as WAIT_CLASS, state as STATE, wait_time_micro as WAIT_TIME_MICRO, total_wait_time_micro as TOTAL_WAIT_TIME_MICRO, total_waits as TOTAL_WAITS, rpc_count as RPC_COUNT, plan_type as PLAN_TYPE, is_inner_sql as IS_INNER_SQL, is_executor_rpc as IS_EXECUTOR_RPC, is_hit_plan as IS_HIT_PLAN, request_time as REQUEST_TIME, elapsed_time as ELAPSED_TIME, net_time as NET_TIME, net_wait_time as NET_WAIT_TIME, queue_time as QUEUE_TIME, decode_time as DECODE_TIME, get_plan_time as GET_PLAN_TIME, execute_time as EXECUTE_TIME, application_wait_time as APPLICATION_WAIT_TIME, concurrency_wait_time as CONCURRENCY_WAIT_TIME, user_io_wait_time as USER_IO_WAIT_TIME, schedule_time as SCHEDULE_TIME, row_cache_hit as ROW_CACHE_HIT, bloom_filter_cache_hit as BLOOM_FILTER_CACHE_HIT, block_cache_hit as BLOCK_CACHE_HIT, disk_reads as DISK_READS, retry_cnt as RETRY_CNT, table_scan as TABLE_SCAN, consistency_level as CONSISTENCY_LEVEL, memstore_read_row_count as MEMSTORE_READ_ROW_COUNT, ssstore_read_row_count as SSSTORE_READ_ROW_COUNT, data_block_read_cnt as DATA_BLOCK_READ_CNT, data_block_cache_hit as DATA_BLOCK_CACHE_HIT, index_block_read_cnt as INDEX_BLOCK_READ_CNT, index_block_cache_hit as INDEX_BLOCK_CACHE_HIT, blockscan_block_cnt as BLOCKSCAN_BLOCK_CNT, blockscan_row_cnt as BLOCKSCAN_ROW_CNT, pushdown_storage_filter_row_cnt as PUSHDOWN_STORAGE_FILTER_ROW_CNT, request_memory_used as REQUEST_MEMORY_USED, expected_worker_count as EXPECTED_WORKER_COUNT, used_worker_count as USED_WORKER_COUNT, sched_info as SCHED_INFO, fuse_row_cache_hit as FUSE_ROW_CACHE_HIT, ps_client_stmt_id as PS_CLIENT_STMT_ID, ps_inner_stmt_id as PS_INNER_STMT_ID, transaction_id as TX_ID, snapshot_version as SNAPSHOT_VERSION, request_type as REQUEST_TYPE, is_batched_multi_stmt as IS_BATCHED_MULTI_STMT, ob_trace_info as OB_TRACE_INFO, plan_hash as PLAN_HASH, lock_for_read_time as LOCK_FOR_READ_TIME, params_value as PARAMS_VALUE, rule_name as RULE_NAME, partition_hit as PARTITION_HIT, case when tx_internal_route_flag & 96 = 32 then 1 else 0 end as TX_INTERNAL_ROUTING, tx_internal_route_version as TX_STATE_VERSION, flt_trace_id as FLT_TRACE_ID, pl_trace_id as PL_TRACE_ID, plsql_exec_time as PLSQL_EXEC_TIME, format_sql_id as FORMAT_SQL_ID, stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, proxy_user as PROXY_USER from oceanbase.__all_virtual_sql_audit )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select svr_ip as SVR_IP, svr_port as SVR_PORT, request_id as REQUEST_ID, execution_id as SQL_EXEC_ID, trace_id as TRACE_ID, session_id as SID, client_ip as CLIENT_IP, client_port as CLIENT_PORT, tenant_id as TENANT_ID, tenant_name as TENANT_NAME, effective_tenant_id as EFFECTIVE_TENANT_ID, user_id as USER_ID, user_name as USER_NAME, user_group as USER_GROUP, user_client_ip as USER_CLIENT_IP, db_id as DB_ID, db_name as DB_NAME, sql_id as SQL_ID, query_sql as QUERY_SQL, plan_id as PLAN_ID, affected_rows as AFFECTED_ROWS, return_rows as RETURN_ROWS, partition_cnt as PARTITION_CNT, ret_code as RET_CODE, qc_id as QC_ID, dfo_id as DFO_ID, sqc_id as SQC_ID, worker_id as WORKER_ID, event as EVENT, p1text as P1TEXT, p1 as P1, p2text as P2TEXT, p2 as P2, p3text as P3TEXT, p3 as P3, `level` as `LEVEL`, wait_class_id as WAIT_CLASS_ID, `wait_class#` as `WAIT_CLASS#`, wait_class as WAIT_CLASS, state as STATE, wait_time_micro as WAIT_TIME_MICRO, total_wait_time_micro as TOTAL_WAIT_TIME_MICRO, total_waits as TOTAL_WAITS, rpc_count as RPC_COUNT, plan_type as PLAN_TYPE, is_inner_sql as IS_INNER_SQL, is_executor_rpc as IS_EXECUTOR_RPC, is_hit_plan as IS_HIT_PLAN, request_time as REQUEST_TIME, elapsed_time as ELAPSED_TIME, net_time as NET_TIME, net_wait_time as NET_WAIT_TIME, queue_time as QUEUE_TIME, decode_time as DECODE_TIME, get_plan_time as GET_PLAN_TIME, execute_time as EXECUTE_TIME, application_wait_time as APPLICATION_WAIT_TIME, concurrency_wait_time as CONCURRENCY_WAIT_TIME, user_io_wait_time as USER_IO_WAIT_TIME, schedule_time as SCHEDULE_TIME, row_cache_hit as ROW_CACHE_HIT, bloom_filter_cache_hit as BLOOM_FILTER_CACHE_HIT, block_cache_hit as BLOCK_CACHE_HIT, disk_reads as DISK_READS, retry_cnt as RETRY_CNT, table_scan as TABLE_SCAN, consistency_level as CONSISTENCY_LEVEL, memstore_read_row_count as MEMSTORE_READ_ROW_COUNT, ssstore_read_row_count as SSSTORE_READ_ROW_COUNT, data_block_read_cnt as DATA_BLOCK_READ_CNT, data_block_cache_hit as DATA_BLOCK_CACHE_HIT, index_block_read_cnt as INDEX_BLOCK_READ_CNT, index_block_cache_hit as INDEX_BLOCK_CACHE_HIT, blockscan_block_cnt as BLOCKSCAN_BLOCK_CNT, blockscan_row_cnt as BLOCKSCAN_ROW_CNT, pushdown_storage_filter_row_cnt as PUSHDOWN_STORAGE_FILTER_ROW_CNT, request_memory_used as REQUEST_MEMORY_USED, expected_worker_count as EXPECTED_WORKER_COUNT, used_worker_count as USED_WORKER_COUNT, sched_info as SCHED_INFO, fuse_row_cache_hit as FUSE_ROW_CACHE_HIT, ps_client_stmt_id as PS_CLIENT_STMT_ID, ps_inner_stmt_id as PS_INNER_STMT_ID, transaction_id as TX_ID, snapshot_version as SNAPSHOT_VERSION, request_type as REQUEST_TYPE, is_batched_multi_stmt as IS_BATCHED_MULTI_STMT, ob_trace_info as OB_TRACE_INFO, plan_hash as PLAN_HASH, lock_for_read_time as LOCK_FOR_READ_TIME, params_value as PARAMS_VALUE, rule_name as RULE_NAME, partition_hit as PARTITION_HIT, case when tx_internal_route_flag & 96 = 32 then 1 else 0 end as TX_INTERNAL_ROUTING, tx_internal_route_version as TX_STATE_VERSION, flt_trace_id as FLT_TRACE_ID, pl_trace_id as PL_TRACE_ID, plsql_exec_time as PLSQL_EXEC_TIME, format_sql_id as FORMAT_SQL_ID, stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, proxy_user as PROXY_USER, seq_num as SEQ_NUM, network_wait_time as NETWORK_WAIT_TIME from oceanbase.__all_virtual_sql_audit )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1386,7 +1386,7 @@ int ObInnerTableSchema::v_ob_sql_audit_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, REQUEST_ID, SQL_EXEC_ID, TRACE_ID, SID, CLIENT_IP, CLIENT_PORT, TENANT_ID, TENANT_NAME, EFFECTIVE_TENANT_ID, USER_ID, USER_NAME, USER_GROUP, USER_CLIENT_IP, DB_ID, DB_NAME, SQL_ID, QUERY_SQL, PLAN_ID, AFFECTED_ROWS, RETURN_ROWS, PARTITION_CNT, RET_CODE, QC_ID, DFO_ID, SQC_ID, WORKER_ID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, `LEVEL`, WAIT_CLASS_ID, `WAIT_CLASS#`, WAIT_CLASS, STATE, WAIT_TIME_MICRO, TOTAL_WAIT_TIME_MICRO, TOTAL_WAITS, RPC_COUNT, PLAN_TYPE, IS_INNER_SQL, IS_EXECUTOR_RPC, IS_HIT_PLAN, REQUEST_TIME, ELAPSED_TIME, NET_TIME, NET_WAIT_TIME, QUEUE_TIME, DECODE_TIME, GET_PLAN_TIME, EXECUTE_TIME, APPLICATION_WAIT_TIME, CONCURRENCY_WAIT_TIME, USER_IO_WAIT_TIME, SCHEDULE_TIME, ROW_CACHE_HIT, BLOOM_FILTER_CACHE_HIT, BLOCK_CACHE_HIT, DISK_READS, RETRY_CNT, TABLE_SCAN, CONSISTENCY_LEVEL, MEMSTORE_READ_ROW_COUNT, SSSTORE_READ_ROW_COUNT, DATA_BLOCK_READ_CNT, DATA_BLOCK_CACHE_HIT, INDEX_BLOCK_READ_CNT, INDEX_BLOCK_CACHE_HIT, BLOCKSCAN_BLOCK_CNT, BLOCKSCAN_ROW_CNT, PUSHDOWN_STORAGE_FILTER_ROW_CNT, REQUEST_MEMORY_USED, EXPECTED_WORKER_COUNT, USED_WORKER_COUNT, SCHED_INFO, FUSE_ROW_CACHE_HIT, PS_CLIENT_STMT_ID, PS_INNER_STMT_ID, TX_ID, SNAPSHOT_VERSION, REQUEST_TYPE, IS_BATCHED_MULTI_STMT, OB_TRACE_INFO, PLAN_HASH, LOCK_FOR_READ_TIME, PARAMS_VALUE, RULE_NAME, PARTITION_HIT, TX_INTERNAL_ROUTING, TX_STATE_VERSION, FLT_TRACE_ID, PL_TRACE_ID, PLSQL_EXEC_TIME, FORMAT_SQL_ID, stmt_type as STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, PROXY_USER FROM oceanbase.GV$OB_SQL_AUDIT WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, REQUEST_ID, SQL_EXEC_ID, TRACE_ID, SID, CLIENT_IP, CLIENT_PORT, TENANT_ID, TENANT_NAME, EFFECTIVE_TENANT_ID, USER_ID, USER_NAME, USER_GROUP, USER_CLIENT_IP, DB_ID, DB_NAME, SQL_ID, QUERY_SQL, PLAN_ID, AFFECTED_ROWS, RETURN_ROWS, PARTITION_CNT, RET_CODE, QC_ID, DFO_ID, SQC_ID, WORKER_ID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, `LEVEL`, WAIT_CLASS_ID, `WAIT_CLASS#`, WAIT_CLASS, STATE, WAIT_TIME_MICRO, TOTAL_WAIT_TIME_MICRO, TOTAL_WAITS, RPC_COUNT, PLAN_TYPE, IS_INNER_SQL, IS_EXECUTOR_RPC, IS_HIT_PLAN, REQUEST_TIME, ELAPSED_TIME, NET_TIME, NET_WAIT_TIME, QUEUE_TIME, DECODE_TIME, GET_PLAN_TIME, EXECUTE_TIME, APPLICATION_WAIT_TIME, CONCURRENCY_WAIT_TIME, USER_IO_WAIT_TIME, SCHEDULE_TIME, ROW_CACHE_HIT, BLOOM_FILTER_CACHE_HIT, BLOCK_CACHE_HIT, DISK_READS, RETRY_CNT, TABLE_SCAN, CONSISTENCY_LEVEL, MEMSTORE_READ_ROW_COUNT, SSSTORE_READ_ROW_COUNT, DATA_BLOCK_READ_CNT, DATA_BLOCK_CACHE_HIT, INDEX_BLOCK_READ_CNT, INDEX_BLOCK_CACHE_HIT, BLOCKSCAN_BLOCK_CNT, BLOCKSCAN_ROW_CNT, PUSHDOWN_STORAGE_FILTER_ROW_CNT, REQUEST_MEMORY_USED, EXPECTED_WORKER_COUNT, USED_WORKER_COUNT, SCHED_INFO, FUSE_ROW_CACHE_HIT, PS_CLIENT_STMT_ID, PS_INNER_STMT_ID, TX_ID, SNAPSHOT_VERSION, REQUEST_TYPE, IS_BATCHED_MULTI_STMT, OB_TRACE_INFO, PLAN_HASH, LOCK_FOR_READ_TIME, PARAMS_VALUE, RULE_NAME, PARTITION_HIT, TX_INTERNAL_ROUTING, TX_STATE_VERSION, FLT_TRACE_ID, PL_TRACE_ID, PLSQL_EXEC_TIME, FORMAT_SQL_ID, stmt_type as STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, PROXY_USER, SEQ_NUM, NETWORK_WAIT_TIME FROM oceanbase.GV$OB_SQL_AUDIT WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp index 0042e07ab8..7c97d608cd 100644 --- a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp @@ -927,7 +927,7 @@ int ObInnerTableSchema::gv_active_session_history_schema(ObTableSchema &table_sc table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(SVR_IP AS CHAR(46)) AS SVR_IP, CAST(SVR_PORT AS SIGNED) AS SVR_PORT, CAST(SAMPLE_ID AS SIGNED) AS SAMPLE_ID, CAST(SAMPLE_TIME AS DATETIME) AS SAMPLE_TIME, CAST(TENANT_ID AS SIGNED) AS CON_ID, CAST(USER_ID AS SIGNED) AS USER_ID, CAST(SESSION_ID AS SIGNED) AS SESSION_ID, CAST(IF (SESSION_TYPE = 0, 'FOREGROUND', 'BACKGROUND') AS CHAR(10)) AS SESSION_TYPE, CAST(IF (EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, CAST(SQL_ID AS CHAR(32)) AS SQL_ID, CAST(PLAN_ID AS SIGNED) AS PLAN_ID, CAST(TRACE_ID AS CHAR(64)) AS TRACE_ID, CAST(NAME AS CHAR(64)) AS EVENT, CAST(EVENT_NO AS SIGNED) AS EVENT_NO, CAST(oceanbase.__all_virtual_ash.EVENT_ID AS SIGNED) AS EVENT_ID, CAST(PARAMETER1 AS CHAR(64)) AS P1TEXT, CAST(P1 AS SIGNED) AS P1, CAST(PARAMETER2 AS CHAR(64)) AS P2TEXT, CAST(P2 AS SIGNED) AS P2, CAST(PARAMETER3 AS CHAR(64)) AS P3TEXT, CAST(P3 AS SIGNED) AS P3, CAST(WAIT_CLASS AS CHAR(64)) AS WAIT_CLASS, CAST(WAIT_CLASS_ID AS SIGNED) AS WAIT_CLASS_ID, CAST(TIME_WAITED AS SIGNED) AS TIME_WAITED, CAST(SQL_PLAN_LINE_ID AS SIGNED) SQL_PLAN_LINE_ID, CAST(GROUP_ID AS SIGNED) GROUP_ID, CAST(TX_ID AS SIGNED) TX_ID, CAST(BLOCKING_SESSION_ID AS SIGNED) BLOCKING_SESSION_ID, CAST(IF (IN_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PARSE, CAST(IF (IN_PL_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PL_PARSE, CAST(IF (IN_PLAN_CACHE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLAN_CACHE, CAST(IF (IN_SQL_OPTIMIZE = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(IF (IN_SQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(IF (IN_PX_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PX_EXECUTION, CAST(IF (IN_SEQUENCE_LOAD = 1, 'Y', 'N') AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(IF (IN_COMMITTING = 1, 'Y', 'N') AS CHAR(1)) AS IN_COMMITTING, CAST(IF (IN_STORAGE_READ = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_READ, CAST(IF (IN_STORAGE_WRITE = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(IF (IN_REMOTE_DAS_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(IF (IN_FILTER_ROWS = 1, 'Y', 'N') AS CHAR(1)) AS IN_FILTER_ROWS, CAST(PROGRAM AS CHAR(64)) AS PROGRAM, CAST(MODULE AS CHAR(64)) AS MODULE, CAST(ACTION AS CHAR(64)) AS ACTION, CAST(CLIENT_ID AS CHAR(64)) AS CLIENT_ID, CAST(BACKTRACE AS CHAR(512)) AS BACKTRACE, CAST(TM_DELTA_TIME AS SIGNED) AS TM_DELTA_TIME, CAST(TM_DELTA_CPU_TIME AS SIGNED) AS TM_DELTA_CPU_TIME, CAST(TM_DELTA_DB_TIME AS SIGNED) AS TM_DELTA_DB_TIME, CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, CAST(IF (IN_PLSQL_COMPILATION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(IF (IN_PLSQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(PLSQL_ENTRY_OBJECT_ID AS SIGNED) AS PLSQL_ENTRY_OBJECT_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS SIGNED) AS PLSQL_ENTRY_SUBPROGRAM_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, CAST(PLSQL_OBJECT_ID AS SIGNED) AS PLSQL_OBJECT_ID, CAST(PLSQL_SUBPROGRAM_ID AS SIGNED) AS PLSQL_SUBPROGRAM_ID, CAST(PLSQL_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_SUBPROGRAM_NAME FROM oceanbase.__all_virtual_ash LEFT JOIN oceanbase.v$event_name on EVENT_NO = `event#` )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM oceanbase.GV$OB_ACTIVE_SESSION_HISTORY )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -978,7 +978,7 @@ int ObInnerTableSchema::v_active_session_history_schema(ObTableSchema &table_sch table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, TX_ID, BLOCKING_SESSION_ID, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME FROM oceanbase.gv$active_session_history WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM oceanbase.gv$active_session_history WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp b/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp index 3527dd3a0a..a6dda4527e 100644 --- a/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp @@ -373,7 +373,7 @@ int ObInnerTableSchema::query_response_time_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(select response_time as RESPONSE_TIME, count as COUNT, total as TOTAL from oceanbase.__all_virtual_query_response_time where tenant_id = effective_tenant_id() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select svr_ip as SVR_IP, svr_port as SVR_PORT, response_time as RESPONSE_TIME, sum(count) as COUNT, sum(total) as TOTAL from oceanbase.__all_virtual_query_response_time where tenant_id = effective_tenant_id() group by svr_ip, svr_port, response_time )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp index e7d20e2639..9e4c02832b 100644 --- a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp @@ -1845,7 +1845,7 @@ int ObInnerTableSchema::dba_wr_active_session_history_schema(ObTableSchema &tabl table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(IF (ASH.EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN (ASH.TIME_MODEL & 1) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 2) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PL_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 4) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN (ASH.TIME_MODEL & 8) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN (ASH.TIME_MODEL & 16) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 32) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 64) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN (ASH.TIME_MODEL & 128) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_COMMITTING, CAST(CASE WHEN (ASH.TIME_MODEL & 256) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_READ, CAST(CASE WHEN (ASH.TIME_MODEL & 512) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN (ASH.TIME_MODEL & 1024) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID ) WHERE ASH.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(IF (ASH.EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, ASH.PLAN_HASH AS PLAN_HASH, ASH.THREAD_ID AS THREAD_ID, ASH.STMT_TYPE AS STMT_TYPE, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN (ASH.TIME_MODEL & 1) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 2) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PL_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 4) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN (ASH.TIME_MODEL & 8) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN (ASH.TIME_MODEL & 16) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 32) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 64) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN (ASH.TIME_MODEL & 128) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_COMMITTING, CAST(CASE WHEN (ASH.TIME_MODEL & 256) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_READ, CAST(CASE WHEN (ASH.TIME_MODEL & 512) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN (ASH.TIME_MODEL & 1024) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, CAST(CASE WHEN (ASH.TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, CAST(CASE WHEN (ASH.TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, CAST(CASE WHEN (ASH.TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, ASH.TABLET_ID AS TABLET_ID, ASH.PROXY_SID AS PROXY_SID FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID ) WHERE ASH.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1896,7 +1896,7 @@ int ObInnerTableSchema::cdb_wr_active_session_history_schema(ObTableSchema &tabl table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(IF (ASH.EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN (ASH.TIME_MODEL & 1) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 2) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PL_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 4) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN (ASH.TIME_MODEL & 8) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN (ASH.TIME_MODEL & 16) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 32) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 64) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN (ASH.TIME_MODEL & 128) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_COMMITTING, CAST(CASE WHEN (ASH.TIME_MODEL & 256) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_READ, CAST(CASE WHEN (ASH.TIME_MODEL & 512) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN (ASH.TIME_MODEL & 1024) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID ) WHERE SNAP.STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(IF (ASH.EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, ASH.PLAN_HASH AS PLAN_HASH, ASH.THREAD_ID AS THREAD_ID, ASH.STMT_TYPE AS STMT_TYPE, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN (ASH.TIME_MODEL & 1) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 2) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PL_PARSE, CAST(CASE WHEN (ASH.TIME_MODEL & 4) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN (ASH.TIME_MODEL & 8) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN (ASH.TIME_MODEL & 16) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 32) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 64) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN (ASH.TIME_MODEL & 128) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_COMMITTING, CAST(CASE WHEN (ASH.TIME_MODEL & 256) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_READ, CAST(CASE WHEN (ASH.TIME_MODEL & 512) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN (ASH.TIME_MODEL & 1024) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, CAST(CASE WHEN (ASH.TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, CAST(CASE WHEN (ASH.TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, CAST(CASE WHEN (ASH.TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, ASH.TABLET_ID AS TABLET_ID, ASH.PROXY_SID AS PROXY_SID FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID ) WHERE SNAP.STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1947,7 +1947,7 @@ int ObInnerTableSchema::dba_wr_snapshot_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, SNAP_ID, SVR_IP, SVR_PORT, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME FROM OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT WHERE STATUS = 0 AND TENANT_ID=EFFECTIVE_TENANT_ID(); )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, SNAP_ID, SVR_IP, SVR_PORT, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME FROM oceanbase.__all_virtual_wr_snapshot WHERE STATUS = 0 AND TENANT_ID=EFFECTIVE_TENANT_ID(); )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1998,7 +1998,7 @@ int ObInnerTableSchema::cdb_wr_snapshot_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, SNAP_ID, SVR_IP, SVR_PORT, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME FROM OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT WHERE STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, SNAP_ID, SVR_IP, SVR_PORT, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME FROM oceanbase.__all_virtual_wr_snapshot WHERE STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2049,7 +2049,7 @@ int ObInnerTableSchema::dba_wr_statname_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, STAT_ID, STAT_NAME FROM OCEANBASE.__ALL_VIRTUAL_WR_STATNAME WHERE TENANT_ID=EFFECTIVE_TENANT_ID(); )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, STAT_ID, STAT_NAME FROM oceanbase.__all_virtual_wr_statname WHERE TENANT_ID=EFFECTIVE_TENANT_ID(); )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2100,7 +2100,7 @@ int ObInnerTableSchema::cdb_wr_statname_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, STAT_ID, STAT_NAME FROM OCEANBASE.__ALL_VIRTUAL_WR_STATNAME; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CLUSTER_ID, TENANT_ID, STAT_ID, STAT_NAME FROM oceanbase.__all_virtual_wr_statname; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2151,7 +2151,7 @@ int ObInnerTableSchema::dba_wr_sysstat_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.CLUSTER_ID AS CLUSTER_ID, STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.STAT_ID AS STAT_ID, STAT.VALUE AS VALUE FROM ( OCEANBASE.__ALL_VIRTUAL_WR_SYSSTAT STAT JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.CLUSTER_ID AS CLUSTER_ID, STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.STAT_ID AS STAT_ID, STAT.VALUE AS VALUE FROM ( oceanbase.__all_virtual_wr_sysstat STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2202,7 +2202,7 @@ int ObInnerTableSchema::cdb_wr_sysstat_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.CLUSTER_ID AS CLUSTER_ID, STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.STAT_ID AS STAT_ID, STAT.VALUE AS VALUE FROM ( OCEANBASE.__ALL_VIRTUAL_WR_SYSSTAT STAT JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE SNAP.STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.CLUSTER_ID AS CLUSTER_ID, STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.STAT_ID AS STAT_ID, STAT.VALUE AS VALUE FROM ( oceanbase.__all_virtual_wr_sysstat STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE SNAP.STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp index a8b1a77c6f..9923200e0d 100644 --- a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp @@ -1386,7 +1386,7 @@ int ObInnerTableSchema::dba_wr_control_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.SNAP_INTERVAL AS SNAP_INTERVAL, SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM OCEANBASE.__ALL_VIRTUAL_WR_CONTROL SETTING WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.SNAP_INTERVAL AS SNAP_INTERVAL, SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM oceanbase.__all_virtual_wr_control SETTING WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1437,7 +1437,7 @@ int ObInnerTableSchema::cdb_wr_control_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.SNAP_INTERVAL AS SNAP_INTERVAL, SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM OCEANBASE.__ALL_VIRTUAL_WR_CONTROL SETTING )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.SNAP_INTERVAL AS SNAP_INTERVAL, SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM oceanbase.__all_virtual_wr_control SETTING )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp index 67b17c82e4..7a564abd54 100644 --- a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp @@ -1045,6 +1045,210 @@ int ObInnerTableSchema::v_ob_cgroup_config_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::dba_wr_system_event_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SYSTEM_EVENT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SYSTEM_EVENT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.SNAP_ID AS SNAP_ID, SETTING.SVR_IP AS SVR_IP, SETTING.SVR_PORT AS SVR_PORT, SETTING.EVENT_ID AS EVENT_ID, EN.EVENT_NAME AS EVENT_NAME, EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, EN.WAIT_CLASS AS WAIT_CLASS, SETTING.TOTAL_WAITS AS TOTAL_WAITS, SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO FROM oceanbase.__all_virtual_wr_system_event SETTING, oceanbase.__all_virtual_wr_event_name EN WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() AND EN.EVENT_ID = SETTING.EVENT_ID AND EN.TENANT_ID = SETTING.TENANT_ID )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_system_event_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_SYSTEM_EVENT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_SYSTEM_EVENT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.CLUSTER_ID AS CLUSTER_ID, SETTING.SNAP_ID AS SNAP_ID, SETTING.SVR_IP AS SVR_IP, SETTING.SVR_PORT AS SVR_PORT, SETTING.EVENT_ID AS EVENT_ID, EN.EVENT_NAME AS EVENT_NAME, EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, EN.WAIT_CLASS AS WAIT_CLASS, SETTING.TOTAL_WAITS AS TOTAL_WAITS, SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO FROM oceanbase.__all_virtual_wr_system_event SETTING, oceanbase.__all_virtual_wr_event_name EN WHERE EN.EVENT_ID = SETTING.EVENT_ID AND EN.TENANT_ID = SETTING.TENANT_ID )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_event_name_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_EVENT_NAME_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_EVENT_NAME_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.EVENT_ID AS EVENT_ID, SETTING.EVENT_NAME AS EVENT_NAME, SETTING.PARAMETER1 AS PARAMETER1, SETTING.PARAMETER2 AS PARAMETER2, SETTING.PARAMETER3 AS PARAMETER3, SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, SETTING.WAIT_CLASS AS WAIT_CLASS FROM oceanbase.__all_virtual_wr_event_name SETTING WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_event_name_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_EVENT_NAME_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_EVENT_NAME_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.TENANT_ID AS TENANT_ID, SETTING.CLUSTER_ID AS CLUSTER_ID, SETTING.EVENT_ID AS EVENT_ID, SETTING.EVENT_NAME AS EVENT_NAME, SETTING.PARAMETER1 AS PARAMETER1, SETTING.PARAMETER2 AS PARAMETER2, SETTING.PARAMETER3 AS PARAMETER3, SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, SETTING.WAIT_CLASS AS WAIT_CLASS FROM oceanbase.__all_virtual_wr_event_name SETTING )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_format_outlines_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -1147,6 +1351,516 @@ int ObInnerTableSchema::procs_priv_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, SQL_ID AS SQL_ID, PLAN_ID AS PLAN_ID, PLAN_HASH AS PLAN_HASH, PLAN_TYPE AS PLAN_TYPE, QUERY_SQL AS QUERY_SQL, SQL_TYPE AS SQL_TYPE, MODULE AS MODULE, ACTION AS ACTION, PARSING_DB_ID AS PARSING_DB_ID, PARSING_DB_NAME AS PARSING_DB_NAME, PARSING_USER_ID AS PARSING_USER_ID, EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, EXECUTIONS_DELTA AS EXECUTIONS_DELTA, DISK_READS_TOTAL AS DISK_READS_TOTAL, DISK_READS_DELTA AS DISK_READS_DELTA, BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, CPU_TIME_TOTAL AS CPU_TIME_TOTAL, CPU_TIME_DELTA AS CPU_TIME_DELTA, CCWAIT_TOTAL AS CCWAIT_TOTAL, CCWAIT_DELTA AS CCWAIT_DELTA, USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, APWAIT_TOTAL AS APWAIT_TOTAL, APWAIT_DELTA AS APWAIT_DELTA, PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, RPC_TOTAL AS RPC_TOTAL, RPC_DELTA AS RPC_DELTA, FETCHES_TOTAL AS FETCHES_TOTAL, FETCHES_DELTA AS FETCHES_DELTA, RETRY_TOTAL AS RETRY_TOTAL, RETRY_DELTA AS RETRY_DELTA, PARTITION_TOTAL AS PARTITION_TOTAL, PARTITION_DELTA AS PARTITION_DELTA, NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, NESTED_SQL_DELTA AS NESTED_SQL_DELTA, SOURCE_IP AS SOURCE_IP, SOURCE_PORT AS SOURCE_PORT, ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, FIRST_LOAD_TIME AS FIRST_LOAD_TIME, PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA FROM oceanbase.__all_virtual_sqlstat )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TENANT_ID, SQL_ID, PLAN_ID, PLAN_HASH, PLAN_TYPE, QUERY_SQL, SQL_TYPE, MODULE, ACTION, PARSING_DB_ID, PARSING_DB_NAME, PARSING_USER_ID, EXECUTIONS_TOTAL, EXECUTIONS_DELTA, DISK_READS_TOTAL, DISK_READS_DELTA, BUFFER_GETS_TOTAL, BUFFER_GETS_DELTA, ELAPSED_TIME_TOTAL, ELAPSED_TIME_DELTA, CPU_TIME_TOTAL, CPU_TIME_DELTA, CCWAIT_TOTAL, CCWAIT_DELTA, USERIO_WAIT_TOTAL, USERIO_WAIT_DELTA, APWAIT_TOTAL, APWAIT_DELTA, PHYSICAL_READ_REQUESTS_TOTAL, PHYSICAL_READ_REQUESTS_DELTA, PHYSICAL_READ_BYTES_TOTAL, PHYSICAL_READ_BYTES_DELTA, WRITE_THROTTLE_TOTAL, WRITE_THROTTLE_DELTA, ROWS_PROCESSED_TOTAL, ROWS_PROCESSED_DELTA, MEMSTORE_READ_ROWS_TOTAL, MEMSTORE_READ_ROWS_DELTA, MINOR_SSSTORE_READ_ROWS_TOTAL, MINOR_SSSTORE_READ_ROWS_DELTA, MAJOR_SSSTORE_READ_ROWS_TOTAL, MAJOR_SSSTORE_READ_ROWS_DELTA, RPC_TOTAL, RPC_DELTA, FETCHES_TOTAL, FETCHES_DELTA, RETRY_TOTAL, RETRY_DELTA, PARTITION_TOTAL, PARTITION_DELTA, NESTED_SQL_TOTAL, NESTED_SQL_DELTA, SOURCE_IP, SOURCE_PORT, ROUTE_MISS_TOTAL, ROUTE_MISS_DELTA, FIRST_LOAD_TIME, PLAN_CACHE_HIT_TOTAL, PLAN_CACHE_HIT_DELTA FROM oceanbase.gv$ob_sqlstat WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.SQL_ID AS SQL_ID, STAT.PLAN_HASH AS PLAN_HASH, STAT.PLAN_TYPE AS PLAN_TYPE, STAT.MODULE AS MODULE, STAT.ACTION AS ACTION, STAT.PARSING_DB_ID AS PARSING_DB_ID, STAT.PARSING_DB_NAME AS PARSING_DB_NAME, STAT.PARSING_USER_ID AS PARSING_USER_ID, STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, STAT.DISK_READS_DELTA AS DISK_READS_DELTA, STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, STAT.CCWAIT_DELTA AS CCWAIT_DELTA, STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, STAT.APWAIT_TOTAL AS APWAIT_TOTAL, STAT.APWAIT_DELTA AS APWAIT_DELTA, STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, STAT.RPC_TOTAL AS RPC_TOTAL, STAT.RPC_DELTA AS RPC_DELTA, STAT.FETCHES_TOTAL AS FETCHES_TOTAL, STAT.FETCHES_DELTA AS FETCHES_DELTA, STAT.RETRY_TOTAL AS RETRY_TOTAL, STAT.RETRY_DELTA AS RETRY_DELTA, STAT.PARTITION_TOTAL AS PARTITION_TOTAL, STAT.PARTITION_DELTA AS PARTITION_DELTA, STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, STAT.SOURCE_IP AS SOURCE_IP, STAT.SOURCE_PORT AS SOURCE_PORT, STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA FROM ( oceanbase.__all_virtual_wr_sqlstat STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID AND STAT.SVR_IP = SNAP.SVR_IP AND STAT.SVR_PORT = SNAP.SVR_PORT ) WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.SQL_ID AS SQL_ID, STAT.PLAN_HASH AS PLAN_HASH, STAT.PLAN_TYPE AS PLAN_TYPE, STAT.MODULE AS MODULE, STAT.ACTION AS ACTION, STAT.PARSING_DB_ID AS PARSING_DB_ID, STAT.PARSING_DB_NAME AS PARSING_DB_NAME, STAT.PARSING_USER_ID AS PARSING_USER_ID, STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, STAT.DISK_READS_DELTA AS DISK_READS_DELTA, STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, STAT.CCWAIT_DELTA AS CCWAIT_DELTA, STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, STAT.APWAIT_TOTAL AS APWAIT_TOTAL, STAT.APWAIT_DELTA AS APWAIT_DELTA, STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, STAT.RPC_TOTAL AS RPC_TOTAL, STAT.RPC_DELTA AS RPC_DELTA, STAT.FETCHES_TOTAL AS FETCHES_TOTAL, STAT.FETCHES_DELTA AS FETCHES_DELTA, STAT.RETRY_TOTAL AS RETRY_TOTAL, STAT.RETRY_DELTA AS RETRY_DELTA, STAT.PARTITION_TOTAL AS PARTITION_TOTAL, STAT.PARTITION_DELTA AS PARTITION_DELTA, STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, STAT.SOURCE_IP AS SOURCE_IP, STAT.SOURCE_PORT AS SOURCE_PORT, STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA FROM ( oceanbase.__all_virtual_wr_sqlstat STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID AND STAT.SVR_IP = SNAP.SVR_IP AND STAT.SVR_PORT = SNAP.SVR_PORT ) WHERE SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::gv_ob_sess_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SESS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SESS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SID AS SID, gv$sesstat.CON_ID AS TENANT_ID, SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, STAT_ID AS STAT_ID, NAME AS STAT_NAME, VALUE AS VALUE FROM oceanbase.GV$SESSTAT left join oceanbase.v$statname on gv$sesstat.`statistic#`=v$statname.`statistic#` WHERE STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sess_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SESS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SESS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SID, TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, STAT_NAME, VALUE FROM oceanbase.GV$OB_SESS_TIME_MODEL WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::gv_ob_sys_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SYS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SYS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT GV$SYSSTAT.CON_ID AS TENANT_ID, SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, STAT_ID AS STAT_ID, NAME AS STAT_NAME, VALUE AS VALUE FROM oceanbase.GV$SYSSTAT WHERE STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sys_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SYS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SYS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, STAT_NAME, VALUE FROM oceanbase.GV$OB_SYS_TIME_MODEL WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT(); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_sys_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SYS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SYS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SNAP_ID AS SNAP_ID, SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, oceanbase.DBA_WR_SYSSTAT.STAT_ID AS STAT_ID, STAT_NAME AS STAT_NAME, VALUE AS VALUE FROM oceanbase.DBA_WR_SYSSTAT left join oceanbase.DBA_WR_STATNAME on oceanbase.DBA_WR_SYSSTAT.STAT_ID=oceanbase.DBA_WR_STATNAME.STAT_ID WHERE oceanbase.DBA_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_sys_time_model_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_SYS_TIME_MODEL_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_SYS_TIME_MODEL_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT oceanbase.CDB_WR_SYSSTAT.CLUSTER_ID AS CLUSTER_ID, oceanbase.CDB_WR_SYSSTAT.TENANT_ID AS TENANT_ID, SNAP_ID AS SNAP_ID, SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, oceanbase.CDB_WR_SYSSTAT.STAT_ID AS STAT_ID, STAT_NAME AS STAT_NAME, VALUE AS VALUE FROM oceanbase.CDB_WR_SYSSTAT left join oceanbase.DBA_WR_STATNAME on oceanbase.CDB_WR_SYSSTAT.STAT_ID=oceanbase.DBA_WR_STATNAME.STAT_ID WHERE oceanbase.CDB_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_aux_statistics_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp index 680640019a..b768eb2e8f 100644 --- a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp @@ -280,6 +280,210 @@ int ObInnerTableSchema::cdb_ob_transfer_partition_task_history_schema(ObTableSch return ret; } +int ObInnerTableSchema::dba_wr_sqltext_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQLTEXT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQLTEXT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.SNAP_ID AS SNAP_ID, STAT.SQL_ID AS SQL_ID, STAT.QUERY_SQL AS QUERY_SQL, STAT.SQL_TYPE AS SQL_TYPE FROM ( oceanbase.__all_virtual_wr_sqltext STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_sqltext_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_SQLTEXT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_SQLTEXT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.TENANT_ID AS TENANT_ID, STAT.SNAP_ID AS SNAP_ID, STAT.SQL_ID AS SQL_ID, STAT.QUERY_SQL AS QUERY_SQL, STAT.SQL_TYPE AS SQL_TYPE FROM ( oceanbase.__all_virtual_wr_sqltext STAT JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID ) WHERE SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::gv_ob_active_session_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_ACTIVE_SESSION_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_ACTIVE_SESSION_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(SVR_IP AS CHAR(46)) AS SVR_IP, CAST(SVR_PORT AS SIGNED) AS SVR_PORT, CAST(SAMPLE_ID AS SIGNED) AS SAMPLE_ID, SAMPLE_TIME AS SAMPLE_TIME, CAST(TENANT_ID AS SIGNED) AS CON_ID, CAST(USER_ID AS SIGNED) AS USER_ID, CAST(SESSION_ID AS SIGNED) AS SESSION_ID, CAST(IF (SESSION_TYPE = 0, 'FOREGROUND', 'BACKGROUND') AS CHAR(10)) AS SESSION_TYPE, CAST(IF (EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, CAST(SQL_ID AS CHAR(32)) AS SQL_ID, CAST(PLAN_ID AS SIGNED) AS PLAN_ID, CAST(TRACE_ID AS CHAR(64)) AS TRACE_ID, CAST(NAME AS CHAR(64)) AS EVENT, CAST(EVENT_NO AS SIGNED) AS EVENT_NO, CAST(ASH.EVENT_ID AS SIGNED) AS EVENT_ID, CAST(PARAMETER1 AS CHAR(64)) AS P1TEXT, CAST(P1 AS SIGNED) AS P1, CAST(PARAMETER2 AS CHAR(64)) AS P2TEXT, CAST(P2 AS SIGNED) AS P2, CAST(PARAMETER3 AS CHAR(64)) AS P3TEXT, CAST(P3 AS SIGNED) AS P3, CAST(WAIT_CLASS AS CHAR(64)) AS WAIT_CLASS, CAST(WAIT_CLASS_ID AS SIGNED) AS WAIT_CLASS_ID, CAST(TIME_WAITED AS SIGNED) AS TIME_WAITED, CAST(SQL_PLAN_LINE_ID AS SIGNED) SQL_PLAN_LINE_ID, CAST(GROUP_ID AS SIGNED) GROUP_ID, CAST(PLAN_HASH AS UNSIGNED) PLAN_HASH, CAST(THREAD_ID AS SIGNED) THREAD_ID, CAST(STMT_TYPE AS SIGNED) STMT_TYPE, CAST(TIME_MODEL AS SIGNED) TIME_MODEL, CAST(IF (IN_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PARSE, CAST(IF (IN_PL_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PL_PARSE, CAST(IF (IN_PLAN_CACHE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLAN_CACHE, CAST(IF (IN_SQL_OPTIMIZE = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_OPTIMIZE, CAST(IF (IN_SQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_EXECUTION, CAST(IF (IN_PX_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PX_EXECUTION, CAST(IF (IN_SEQUENCE_LOAD = 1, 'Y', 'N') AS CHAR(1)) AS IN_SEQUENCE_LOAD, CAST(IF (IN_COMMITTING = 1, 'Y', 'N') AS CHAR(1)) AS IN_COMMITTING, CAST(IF (IN_STORAGE_READ = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_READ, CAST(IF (IN_STORAGE_WRITE = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_WRITE, CAST(IF (IN_REMOTE_DAS_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(IF (IN_FILTER_ROWS = 1, 'Y', 'N') AS CHAR(1)) AS IN_FILTER_ROWS, CAST(CASE WHEN (TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, CAST(CASE WHEN (TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, CAST(CASE WHEN (TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, CAST(PROGRAM AS CHAR(64)) AS PROGRAM, CAST(MODULE AS CHAR(64)) AS MODULE, CAST(ACTION AS CHAR(64)) AS ACTION, CAST(CLIENT_ID AS CHAR(64)) AS CLIENT_ID, CAST(BACKTRACE AS CHAR(512)) AS BACKTRACE, CAST(TM_DELTA_TIME AS SIGNED) AS TM_DELTA_TIME, CAST(TM_DELTA_CPU_TIME AS SIGNED) AS TM_DELTA_CPU_TIME, CAST(TM_DELTA_DB_TIME AS SIGNED) AS TM_DELTA_DB_TIME, CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, CAST(IF (IN_PLSQL_COMPILATION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(IF (IN_PLSQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(PLSQL_ENTRY_OBJECT_ID AS SIGNED) AS PLSQL_ENTRY_OBJECT_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS SIGNED) AS PLSQL_ENTRY_SUBPROGRAM_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, CAST(PLSQL_OBJECT_ID AS SIGNED) AS PLSQL_OBJECT_ID, CAST(PLSQL_SUBPROGRAM_ID AS SIGNED) AS PLSQL_SUBPROGRAM_ID, CAST(PLSQL_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_SUBPROGRAM_NAME, CAST(TX_ID AS SIGNED) AS TX_ID, CAST(BLOCKING_SESSION_ID AS SIGNED) AS BLOCKING_SESSION_ID, CAST(TABLET_ID AS SIGNED) AS TABLET_ID, CAST(PROXY_SID AS SIGNED) AS PROXY_SID FROM oceanbase.__all_virtual_ash ASH LEFT JOIN oceanbase.v$event_name on EVENT_NO = `event#` )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_active_session_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_ACTIVE_SESSION_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_ACTIVE_SESSION_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM oceanbase.GV$OB_ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_trusted_root_certificate_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21551_21600.cpp b/src/share/inner_table/ob_inner_table_schema.21551_21600.cpp index 17e7e6f732..eebeb3e86f 100644 --- a/src/share/inner_table/ob_inner_table_schema.21551_21600.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21551_21600.cpp @@ -1912,6 +1912,108 @@ int ObInnerTableSchema::gv_ob_nic_info_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_query_response_time_histogram_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT svr_ip as SVR_IP, svr_port as SVR_PORT, tenant_id as TENANT_ID, sql_type as SQL_TYPE, cast ((response_time/1000000 ) as decimal(24,6)) as RESPONSE_TIME, count as COUNT, cast ((total/1000000) as decimal(24,6)) as TOTAL FROM oceanbase.__all_virtual_query_response_time )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_query_response_time_histogram_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, SQL_TYPE, RESPONSE_TIME, COUNT, TOTAL FROM oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_scheduler_job_run_details_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21601_21650.cpp b/src/share/inner_table/ob_inner_table_schema.21601_21650.cpp index 7d38ae8ecc..ab310c3122 100644 --- a/src/share/inner_table/ob_inner_table_schema.21601_21650.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21601_21650.cpp @@ -433,6 +433,210 @@ int ObInnerTableSchema::v_ob_kv_client_info_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_res_mgr_sysstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_RES_MGR_SYSSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_RES_MGR_SYSSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( select tenant_id as CON_ID, group_id as GROUP_ID, svr_ip as SVR_IP, svr_port as SVR_PORT, `statistic#` as `STATISTIC#`, name as NAME, class as CLASS, value as VALUE, value_type as VALUE_TYPE, stat_id as STAT_ID from oceanbase.__all_virtual_res_mgr_sysstat where can_visible = true )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_res_mgr_sysstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_RES_MGR_SYSSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_RES_MGR_SYSSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CON_ID, GROUP_ID, SVR_IP, SVR_PORT, `STATISTIC#`, NAME, CLASS, VALUE, VALUE_TYPE, STAT_ID FROM OCEANBASE.GV$OB_RES_MGR_SYSSTAT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_sql_plan_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQL_PLAN_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQL_PLAN_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SQLPLAN.TENANT_ID AS TENANT_ID, SQLPLAN.CLUSTER_ID AS CLUSTER_ID, SQLPLAN.SNAP_ID AS SNAP_ID, SQLPLAN.SVR_IP AS SVR_IP, SQLPLAN.SVR_PORT AS SVR_PORT, SQLPLAN.SQL_ID AS SQL_ID, SQLPLAN.PLAN_HASH AS PLAN_HASH, SQLPLAN.PLAN_ID AS PLAN_ID, SQLPLAN.ID AS ID, SQLPLAN.DB_ID AS DB_ID, SQLPLAN.GMT_CREATE AS GMT_CREATE, SQLPLAN.OPERATOR AS OPERATOR, SQLPLAN.OPTIONS AS OPTIONS, SQLPLAN.OBJECT_NODE AS OBJECT_NODE, SQLPLAN.OBJECT_ID AS OBJECT_ID, SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, SQLPLAN.OBJECT_NAME AS OBJECT_NAME, SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, SQLPLAN.OPTIMIZER AS OPTIMIZER, SQLPLAN.PARENT_ID AS PARENT_ID, SQLPLAN.DEPTH AS DEPTH, SQLPLAN.POSITION AS POSITION, SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, SQLPLAN.COST AS COST, SQLPLAN.REAL_COST AS REAL_COST, SQLPLAN.CARDINALITY AS CARDINALITY, SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, SQLPLAN.BYTES AS BYTES, SQLPLAN.ROWSET AS ROWSET, SQLPLAN.OTHER_TAG AS OTHER_TAG, SQLPLAN.PARTITION_START AS PARTITION_START, SQLPLAN.other AS OTHER, SQLPLAN.CPU_COST AS CPU_COST, SQLPLAN.IO_COST AS IO_COST, SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, SQLPLAN.PROJECTION AS PROJECTION, SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, SQLPLAN.REMARKS AS REMARKS, SQLPLAN.OTHER_XML AS OTHER_XML FROM ( oceanbase.__all_virtual_wr_sql_plan SQLPLAN ) WHERE SQLPLAN.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::cdb_wr_sql_plan_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_CDB_WR_SQL_PLAN_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_CDB_WR_SQL_PLAN_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SQLPLAN.TENANT_ID AS TENANT_ID, SQLPLAN.CLUSTER_ID AS CLUSTER_ID, SQLPLAN.SNAP_ID AS SNAP_ID, SQLPLAN.SVR_IP AS SVR_IP, SQLPLAN.SVR_PORT AS SVR_PORT, SQLPLAN.SQL_ID AS SQL_ID, SQLPLAN.PLAN_HASH AS PLAN_HASH, SQLPLAN.PLAN_ID AS PLAN_ID, SQLPLAN.ID AS ID, SQLPLAN.DB_ID AS DB_ID, SQLPLAN.GMT_CREATE AS GMT_CREATE, SQLPLAN.OPERATOR AS OPERATOR, SQLPLAN.OPTIONS AS OPTIONS, SQLPLAN.OBJECT_NODE AS OBJECT_NODE, SQLPLAN.OBJECT_ID AS OBJECT_ID, SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, SQLPLAN.OBJECT_NAME AS OBJECT_NAME, SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, SQLPLAN.OPTIMIZER AS OPTIMIZER, SQLPLAN.PARENT_ID AS PARENT_ID, SQLPLAN.DEPTH AS DEPTH, SQLPLAN.POSITION AS POSITION, SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, SQLPLAN.COST AS COST, SQLPLAN.REAL_COST AS REAL_COST, SQLPLAN.CARDINALITY AS CARDINALITY, SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, SQLPLAN.BYTES AS BYTES, SQLPLAN.ROWSET AS ROWSET, SQLPLAN.OTHER_TAG AS OTHER_TAG, SQLPLAN.PARTITION_START AS PARTITION_START, SQLPLAN.other AS OTHER, SQLPLAN.CPU_COST AS CPU_COST, SQLPLAN.IO_COST AS IO_COST, SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, SQLPLAN.PROJECTION AS PROJECTION, SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, SQLPLAN.REMARKS AS REMARKS, SQLPLAN.OTHER_XML AS OTHER_XML FROM ( oceanbase.__all_virtual_wr_sql_plan SQLPLAN ) )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_spm_evo_result_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp b/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp index 6c1ffa5c12..2299e6e77a 100644 --- a/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp @@ -1437,7 +1437,7 @@ int ObInnerTableSchema::dba_wr_active_session_history_ora_schema(ObTableSchema & table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(DECODE(ASH.EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 1) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PARSE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 2) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PL_PARSE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 4) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 8) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 16) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 32) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 64) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 128) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_COMMITTING, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 256) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_STORAGE_READ, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 512) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 1024) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 2048) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 4096) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 8192) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_FILTER_ROWS, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES FROM SYS.ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH, SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP WHERE ASH.TENANT_ID = EFFECTIVE_TENANT_ID() AND ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID AND SNAP.STATUS = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT ASH.CLUSTER_ID AS CLUSTER_ID, ASH.TENANT_ID AS TENANT_ID, ASH.SNAP_ID AS SNAP_ID, ASH.SVR_IP AS SVR_IP, ASH.SVR_PORT AS SVR_PORT, ASH.SAMPLE_ID AS SAMPLE_ID, ASH.SESSION_ID AS SESSION_ID, ASH.SAMPLE_TIME AS SAMPLE_TIME, ASH.USER_ID AS USER_ID, ASH.SESSION_TYPE AS SESSION_TYPE, CAST(DECODE(ASH.EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, ASH.SQL_ID AS SQL_ID, ASH.TRACE_ID AS TRACE_ID, ASH.EVENT_NO AS EVENT_NO, ASH.EVENT_ID AS EVENT_ID, ASH.TIME_WAITED AS TIME_WAITED, ASH.P1 AS P1, ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.PLAN_HASH AS PLAN_HASH, ASH.THREAD_ID AS THREAD_ID, ASH.STMT_TYPE AS STMT_TYPE, ASH.GROUP_ID AS GROUP_ID, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 1) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PARSE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 2) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PL_PARSE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 4) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLAN_CACHE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 8) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 16) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SQL_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 32) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PX_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 64) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 128) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_COMMITTING, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 256) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_STORAGE_READ, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 512) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_STORAGE_WRITE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 1024) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 2048) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 4096) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 8192) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_FILTER_ROWS, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 16384) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_ENCODE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 32768) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_DECODE, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 65536) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, ASH.CLIENT_ID AS CLIENT_ID, ASH.BACKTRACE AS BACKTRACE, ASH.PLAN_ID AS PLAN_ID, ASH.TM_DELTA_TIME AS TM_DELTA_TIME, ASH.TM_DELTA_CPU_TIME AS TM_DELTA_CPU_TIME, ASH.TM_DELTA_DB_TIME AS TM_DELTA_DB_TIME, ASH.TOP_LEVEL_SQL_ID AS TOP_LEVEL_SQL_ID, ASH.PLSQL_ENTRY_OBJECT_ID AS PLSQL_ENTRY_OBJECT_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_ID AS PLSQL_ENTRY_SUBPROGRAM_ID, ASH.PLSQL_ENTRY_SUBPROGRAM_NAME AS PLSQL_ENTRY_SUBPROGRAM_NAME, ASH.PLSQL_OBJECT_ID AS PLSQL_OBJECT_ID, ASH.PLSQL_SUBPROGRAM_ID AS PLSQL_SUBPROGRAM_ID, ASH.PLSQL_SUBPROGRAM_NAME AS PLSQL_SUBPROGRAM_NAME, ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, ASH.TABLET_ID AS TABLET_ID, ASH.PROXY_SID AS PROXY_SID FROM SYS.ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH, SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP WHERE ASH.TENANT_ID = EFFECTIVE_TENANT_ID() AND ASH.CLUSTER_ID = SNAP.CLUSTER_ID AND ASH.TENANT_ID = SNAP.TENANT_ID AND ASH.SNAP_ID = SNAP.SNAP_ID AND SNAP.STATUS = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.25251_25300.cpp b/src/share/inner_table/ob_inner_table_schema.25251_25300.cpp index 6bbee7b2e3..c70fd54f6f 100644 --- a/src/share/inner_table/ob_inner_table_schema.25251_25300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25251_25300.cpp @@ -637,6 +637,108 @@ int ObInnerTableSchema::dba_ob_import_table_task_history_ora_schema(ObTableSchem return ret; } +int ObInnerTableSchema::dba_wr_system_event_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SYSTEM_EVENT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SYSTEM_EVENT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.SNAP_ID AS SNAP_ID, SETTING.SVR_IP AS SVR_IP, SETTING.SVR_PORT AS SVR_PORT, SETTING.EVENT_ID AS EVENT_ID, EN.EVENT_NAME AS EVENT_NAME, EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, EN.WAIT_CLASS AS WAIT_CLASS, SETTING.TOTAL_WAITS AS TOTAL_WAITS, SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO FROM SYS.ALL_VIRTUAL_WR_SYSTEM_EVENT SETTING, SYS.ALL_VIRTUAL_WR_EVENT_NAME EN WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() AND EN.EVENT_ID = SETTING.EVENT_ID AND EN.TENANT_ID = SETTING.TENANT_ID )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_event_name_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_EVENT_NAME_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_EVENT_NAME_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SETTING.EVENT_ID AS EVENT_ID, SETTING.EVENT_NAME AS EVENT_NAME, SETTING.PARAMETER1 AS PARAMETER1, SETTING.PARAMETER2 AS PARAMETER2, SETTING.PARAMETER3 AS PARAMETER3, SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, SETTING.WAIT_CLASS AS WAIT_CLASS FROM SYS.ALL_VIRTUAL_WR_EVENT_NAME SETTING WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_format_outlines_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -688,6 +790,108 @@ int ObInnerTableSchema::dba_ob_format_outlines_ora_schema(ObTableSchema &table_s return ret; } +int ObInnerTableSchema::dba_wr_sqlstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQLSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQLSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.SNAP_ID AS SNAP_ID, STAT.SVR_IP AS SVR_IP, STAT.SVR_PORT AS SVR_PORT, STAT.SQL_ID AS SQL_ID, STAT.PLAN_HASH AS PLAN_HASH, STAT.PLAN_TYPE AS PLAN_TYPE, STAT.MODULE AS MODULE, STAT.ACTION AS ACTION, STAT.PARSING_DB_ID AS PARSING_DB_ID, STAT.PARSING_DB_NAME AS PARSING_DB_NAME, STAT.PARSING_USER_ID AS PARSING_USER_ID, STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, STAT.DISK_READS_DELTA AS DISK_READS_DELTA, STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, STAT.CCWAIT_DELTA AS CCWAIT_DELTA, STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, STAT.APWAIT_TOTAL AS APWAIT_TOTAL, STAT.APWAIT_DELTA AS APWAIT_DELTA, STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, STAT.RPC_TOTAL AS RPC_TOTAL, STAT.RPC_DELTA AS RPC_DELTA, STAT.FETCHES_TOTAL AS FETCHES_TOTAL, STAT.FETCHES_DELTA AS FETCHES_DELTA, STAT.RETRY_TOTAL AS RETRY_TOTAL, STAT.RETRY_DELTA AS RETRY_DELTA, STAT.PARTITION_TOTAL AS PARTITION_TOTAL, STAT.PARTITION_DELTA AS PARTITION_DELTA, STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, STAT.SOURCE_IP AS SOURCE_IP, STAT.SOURCE_PORT AS SOURCE_PORT, STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA FROM SYS.ALL_VIRTUAL_WR_SQLSTAT STAT, SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID AND STAT.SVR_IP = SNAP.SVR_IP AND STAT.SVR_PORT = SNAP.SVR_PORT AND SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_sys_time_model_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SYS_TIME_MODEL_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SYS_TIME_MODEL_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SNAP_ID AS SNAP_ID, SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, SYS.DBA_WR_SYSSTAT.STAT_ID AS STAT_ID, STAT_NAME AS STAT_NAME, VALUE AS VALUE FROM SYS.DBA_WR_SYSSTAT left join SYS.DBA_WR_STATNAME on SYS.DBA_WR_SYSSTAT.STAT_ID=SYS.DBA_WR_STATNAME.STAT_ID WHERE SYS.DBA_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_transfer_partition_tasks_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -790,6 +994,57 @@ int ObInnerTableSchema::dba_ob_transfer_partition_task_history_ora_schema(ObTabl return ret; } +int ObInnerTableSchema::dba_wr_sqltext_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQLTEXT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQLTEXT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT STAT.SNAP_ID AS SNAP_ID, STAT.SQL_ID AS SQL_ID, STAT.QUERY_SQL AS QUERY_SQL, STAT.SQL_TYPE AS SQL_TYPE FROM SYS.ALL_VIRTUAL_WR_SQLTEXT STAT, SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP WHERE STAT.TENANT_ID = EFFECTIVE_TENANT_ID() AND STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID AND SNAP.STATUS = 0 )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::user_users_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.28001_28050.cpp b/src/share/inner_table/ob_inner_table_schema.28001_28050.cpp index de29175802..7d52c5f122 100644 --- a/src/share/inner_table/ob_inner_table_schema.28001_28050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28001_28050.cpp @@ -60,7 +60,7 @@ int ObInnerTableSchema::gv_ob_sql_audit_ora_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT svr_ip SVR_IP, svr_port SVR_PORT, request_id REQUEST_ID, execution_id SQL_EXEC_ID, trace_id TRACE_ID, session_id SID, client_ip CLIENT_IP, client_port CLIENT_PORT, tenant_id TENANT_ID, effective_tenant_id EFFECTIVE_TENANT_ID, tenant_name TENANT_NAME, user_id USER_ID, user_name USER_NAME, user_group as USER_GROUP, user_client_ip as USER_CLIENT_IP, db_id DB_ID, db_name DB_NAME, sql_id SQL_ID, query_sql QUERY_SQL, plan_id PLAN_ID, affected_rows AFFECTED_ROWS, return_rows RETURN_ROWS, partition_cnt PARTITION_CNT, ret_code RET_CODE, qc_id QC_ID, dfo_id DFO_ID, sqc_id SQC_ID, worker_id WORKER_ID, event EVENT, p1text P1TEXT, p1 P1, p2text P2TEXT, p2 P2, p3text P3TEXT, p3 P3, "LEVEL" "LEVEL", wait_class_id WAIT_CLASS_ID, "WAIT_CLASS#" "WAIT_CLASS#", wait_class WAIT_CLASS, state STATE, wait_time_micro WAIT_TIME_MICRO, total_wait_time_micro TOTAL_WAIT_TIME_MICRO, total_waits TOTAL_WAITS, rpc_count RPC_COUNT, plan_type PLAN_TYPE, is_inner_sql IS_INNER_SQL, is_executor_rpc IS_EXECUTOR_RPC, is_hit_plan IS_HIT_PLAN, request_time REQUEST_TIME, elapsed_time ELAPSED_TIME, net_time NET_TIME, net_wait_time NET_WAIT_TIME, queue_time QUEUE_TIME, decode_time DECODE_TIME, get_plan_time GET_PLAN_TIME, execute_time EXECUTE_TIME, application_wait_time APPLICATION_WAIT_TIME, concurrency_wait_time CONCURRENCY_WAIT_TIME, user_io_wait_time USER_IO_WAIT_TIME, schedule_time SCHEDULE_TIME, row_cache_hit ROW_CACHE_HIT, bloom_filter_cache_hit BLOOM_FILTER_CACHE_HIT, block_cache_hit BLOCK_CACHE_HIT, disk_reads DISK_READS, retry_cnt RETRY_CNT, table_scan TABLE_SCAN, consistency_level CONSISTENCY_LEVEL, memstore_read_row_count MEMSTORE_READ_ROW_COUNT, ssstore_read_row_count SSSTORE_READ_ROW_COUNT, data_block_read_cnt as DATA_BLOCK_READ_CNT, data_block_cache_hit as DATA_BLOCK_CACHE_HIT, index_block_read_cnt as INDEX_BLOCK_READ_CNT, index_block_cache_hit as INDEX_BLOCK_CACHE_HIT, blockscan_block_cnt as BLOCKSCAN_BLOCK_CNT, blockscan_row_cnt as BLOCKSCAN_ROW_CNT, pushdown_storage_filter_row_cnt as PUSHDOWN_STORAGE_FILTER_ROW_CNT, request_memory_used REQUEST_MEMORY_USED, expected_worker_count EXPECTED_WORKER_COUNT, used_worker_count USED_WORKER_COUNT, sched_info SCHED_INFO, ps_client_stmt_id PS_CLIENT_STMT_ID, ps_inner_stmt_id PS_INNER_STMT_ID, transaction_id as TX_ID, snapshot_version as SNAPSHOT_VERSION, request_type as REQUEST_TYPE, is_batched_multi_stmt as IS_BATCHED_MULTI_STMT, ob_trace_info as OB_TRACE_INFO, plan_hash as PLAN_HASH, params_value as PARAMS_VALUE, rule_name as RULE_NAME, case when bitand(tx_internal_route_flag, 96) = 32 then 1 else 0 end as TX_INTERNAL_ROUTING, tx_internal_route_version as TX_STATE_VERSION, flt_trace_id as FLT_TRACE_ID, pl_trace_id as PL_TRACE_ID, plsql_exec_time as PLSQL_EXEC_TIME, format_sql_id as FORMAT_SQL_ID, stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, proxy_user as PROXY_USER FROM SYS.ALL_VIRTUAL_SQL_AUDIT )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT svr_ip SVR_IP, svr_port SVR_PORT, request_id REQUEST_ID, execution_id SQL_EXEC_ID, trace_id TRACE_ID, session_id SID, client_ip CLIENT_IP, client_port CLIENT_PORT, tenant_id TENANT_ID, effective_tenant_id EFFECTIVE_TENANT_ID, tenant_name TENANT_NAME, user_id USER_ID, user_name USER_NAME, user_group as USER_GROUP, user_client_ip as USER_CLIENT_IP, db_id DB_ID, db_name DB_NAME, sql_id SQL_ID, query_sql QUERY_SQL, plan_id PLAN_ID, affected_rows AFFECTED_ROWS, return_rows RETURN_ROWS, partition_cnt PARTITION_CNT, ret_code RET_CODE, qc_id QC_ID, dfo_id DFO_ID, sqc_id SQC_ID, worker_id WORKER_ID, event EVENT, p1text P1TEXT, p1 P1, p2text P2TEXT, p2 P2, p3text P3TEXT, p3 P3, "LEVEL" "LEVEL", wait_class_id WAIT_CLASS_ID, "WAIT_CLASS#" "WAIT_CLASS#", wait_class WAIT_CLASS, state STATE, wait_time_micro WAIT_TIME_MICRO, total_wait_time_micro TOTAL_WAIT_TIME_MICRO, total_waits TOTAL_WAITS, rpc_count RPC_COUNT, plan_type PLAN_TYPE, is_inner_sql IS_INNER_SQL, is_executor_rpc IS_EXECUTOR_RPC, is_hit_plan IS_HIT_PLAN, request_time REQUEST_TIME, elapsed_time ELAPSED_TIME, net_time NET_TIME, net_wait_time NET_WAIT_TIME, queue_time QUEUE_TIME, decode_time DECODE_TIME, get_plan_time GET_PLAN_TIME, execute_time EXECUTE_TIME, application_wait_time APPLICATION_WAIT_TIME, concurrency_wait_time CONCURRENCY_WAIT_TIME, user_io_wait_time USER_IO_WAIT_TIME, schedule_time SCHEDULE_TIME, row_cache_hit ROW_CACHE_HIT, bloom_filter_cache_hit BLOOM_FILTER_CACHE_HIT, block_cache_hit BLOCK_CACHE_HIT, disk_reads DISK_READS, retry_cnt RETRY_CNT, table_scan TABLE_SCAN, consistency_level CONSISTENCY_LEVEL, memstore_read_row_count MEMSTORE_READ_ROW_COUNT, ssstore_read_row_count SSSTORE_READ_ROW_COUNT, data_block_read_cnt as DATA_BLOCK_READ_CNT, data_block_cache_hit as DATA_BLOCK_CACHE_HIT, index_block_read_cnt as INDEX_BLOCK_READ_CNT, index_block_cache_hit as INDEX_BLOCK_CACHE_HIT, blockscan_block_cnt as BLOCKSCAN_BLOCK_CNT, blockscan_row_cnt as BLOCKSCAN_ROW_CNT, pushdown_storage_filter_row_cnt as PUSHDOWN_STORAGE_FILTER_ROW_CNT, request_memory_used REQUEST_MEMORY_USED, expected_worker_count EXPECTED_WORKER_COUNT, used_worker_count USED_WORKER_COUNT, sched_info SCHED_INFO, ps_client_stmt_id PS_CLIENT_STMT_ID, ps_inner_stmt_id PS_INNER_STMT_ID, transaction_id as TX_ID, snapshot_version as SNAPSHOT_VERSION, request_type as REQUEST_TYPE, is_batched_multi_stmt as IS_BATCHED_MULTI_STMT, ob_trace_info as OB_TRACE_INFO, plan_hash as PLAN_HASH, params_value as PARAMS_VALUE, rule_name as RULE_NAME, case when bitand(tx_internal_route_flag, 96) = 32 then 1 else 0 end as TX_INTERNAL_ROUTING, tx_internal_route_version as TX_STATE_VERSION, flt_trace_id as FLT_TRACE_ID, pl_trace_id as PL_TRACE_ID, plsql_exec_time as PLSQL_EXEC_TIME, format_sql_id as FORMAT_SQL_ID, stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, proxy_user as PROXY_USER, seq_num as SEQ_NUM, network_wait_time as NETWORK_WAIT_TIME FROM SYS.ALL_VIRTUAL_SQL_AUDIT )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -111,7 +111,7 @@ int ObInnerTableSchema::v_ob_sql_audit_ora_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, REQUEST_ID, SQL_EXEC_ID, TRACE_ID, SID, CLIENT_IP, CLIENT_PORT, TENANT_ID, EFFECTIVE_TENANT_ID, TENANT_NAME, USER_ID, USER_NAME, USER_GROUP, USER_CLIENT_IP, DB_ID, DB_NAME, SQL_ID, QUERY_SQL, PLAN_ID, AFFECTED_ROWS, RETURN_ROWS, PARTITION_CNT, RET_CODE, QC_ID, DFO_ID, SQC_ID, WORKER_ID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, "LEVEL", WAIT_CLASS_ID, "WAIT_CLASS#", WAIT_CLASS, STATE, WAIT_TIME_MICRO, TOTAL_WAIT_TIME_MICRO, TOTAL_WAITS, RPC_COUNT, PLAN_TYPE, IS_INNER_SQL, IS_EXECUTOR_RPC, IS_HIT_PLAN, REQUEST_TIME, ELAPSED_TIME, NET_TIME, NET_WAIT_TIME, QUEUE_TIME, DECODE_TIME, GET_PLAN_TIME, EXECUTE_TIME, APPLICATION_WAIT_TIME, CONCURRENCY_WAIT_TIME, USER_IO_WAIT_TIME, SCHEDULE_TIME, ROW_CACHE_HIT, BLOOM_FILTER_CACHE_HIT, BLOCK_CACHE_HIT, DISK_READS, RETRY_CNT, TABLE_SCAN, CONSISTENCY_LEVEL, MEMSTORE_READ_ROW_COUNT, SSSTORE_READ_ROW_COUNT, DATA_BLOCK_READ_CNT, DATA_BLOCK_CACHE_HIT, INDEX_BLOCK_READ_CNT, INDEX_BLOCK_CACHE_HIT, BLOCKSCAN_BLOCK_CNT, BLOCKSCAN_ROW_CNT, PUSHDOWN_STORAGE_FILTER_ROW_CNT, REQUEST_MEMORY_USED, EXPECTED_WORKER_COUNT, USED_WORKER_COUNT, SCHED_INFO, PS_CLIENT_STMT_ID, PS_INNER_STMT_ID, TX_ID, SNAPSHOT_VERSION, REQUEST_TYPE, IS_BATCHED_MULTI_STMT, OB_TRACE_INFO, PLAN_HASH, PARAMS_VALUE, RULE_NAME, TX_INTERNAL_ROUTING, TX_STATE_VERSION, FLT_TRACE_ID, PL_TRACE_ID, PLSQL_EXEC_TIME, FORMAT_SQL_ID, STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, PROXY_USER FROM SYS.GV$OB_SQL_AUDIT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, REQUEST_ID, SQL_EXEC_ID, TRACE_ID, SID, CLIENT_IP, CLIENT_PORT, TENANT_ID, EFFECTIVE_TENANT_ID, TENANT_NAME, USER_ID, USER_NAME, USER_GROUP, USER_CLIENT_IP, DB_ID, DB_NAME, SQL_ID, QUERY_SQL, PLAN_ID, AFFECTED_ROWS, RETURN_ROWS, PARTITION_CNT, RET_CODE, QC_ID, DFO_ID, SQC_ID, WORKER_ID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, "LEVEL", WAIT_CLASS_ID, "WAIT_CLASS#", WAIT_CLASS, STATE, WAIT_TIME_MICRO, TOTAL_WAIT_TIME_MICRO, TOTAL_WAITS, RPC_COUNT, PLAN_TYPE, IS_INNER_SQL, IS_EXECUTOR_RPC, IS_HIT_PLAN, REQUEST_TIME, ELAPSED_TIME, NET_TIME, NET_WAIT_TIME, QUEUE_TIME, DECODE_TIME, GET_PLAN_TIME, EXECUTE_TIME, APPLICATION_WAIT_TIME, CONCURRENCY_WAIT_TIME, USER_IO_WAIT_TIME, SCHEDULE_TIME, ROW_CACHE_HIT, BLOOM_FILTER_CACHE_HIT, BLOCK_CACHE_HIT, DISK_READS, RETRY_CNT, TABLE_SCAN, CONSISTENCY_LEVEL, MEMSTORE_READ_ROW_COUNT, SSSTORE_READ_ROW_COUNT, DATA_BLOCK_READ_CNT, DATA_BLOCK_CACHE_HIT, INDEX_BLOCK_READ_CNT, INDEX_BLOCK_CACHE_HIT, BLOCKSCAN_BLOCK_CNT, BLOCKSCAN_ROW_CNT, PUSHDOWN_STORAGE_FILTER_ROW_CNT, REQUEST_MEMORY_USED, EXPECTED_WORKER_COUNT, USED_WORKER_COUNT, SCHED_INFO, PS_CLIENT_STMT_ID, PS_INNER_STMT_ID, TX_ID, SNAPSHOT_VERSION, REQUEST_TYPE, IS_BATCHED_MULTI_STMT, OB_TRACE_INFO, PLAN_HASH, PARAMS_VALUE, RULE_NAME, TX_INTERNAL_ROUTING, TX_STATE_VERSION, FLT_TRACE_ID, PL_TRACE_ID, PLSQL_EXEC_TIME, FORMAT_SQL_ID, STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, PROXY_USER, SEQ_NUM, NETWORK_WAIT_TIME FROM SYS.GV$OB_SQL_AUDIT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp b/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp index 8f24c14baa..aa8a60eb78 100644 --- a/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp @@ -2049,7 +2049,7 @@ int ObInnerTableSchema::gv_active_session_history_ora_schema(ObTableSchema &tabl table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, CAST(SVR_PORT AS NUMBER) AS SVR_PORT, CAST(SAMPLE_ID AS NUMBER) AS SAMPLE_ID, CAST(SAMPLE_TIME AS TIMESTAMP) AS SAMPLE_TIME, CAST(TENANT_ID AS NUMBER) AS CON_ID, CAST(USER_ID AS NUMBER) AS USER_ID, CAST(SESSION_ID AS NUMBER) AS SESSION_ID, CAST(DECODE(SESSION_TYPE, 0, 'FOREGROUND', 'BACKGROUND') AS VARCHAR2(10)) AS SESSION_TYPE, CAST(DECODE(EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, CAST(PLAN_ID AS NUMBER) AS PLAN_ID, CAST(TRACE_ID AS VARCHAR(64)) AS TRACE_ID, CAST(NAME AS VARCHAR2(64)) AS EVENT, CAST(EVENT_NO AS NUMBER) AS EVENT_NO, CAST(SYS.ALL_VIRTUAL_ASH.EVENT_ID AS NUMBER) AS EVENT_ID, CAST(PARAMETER1 AS VARCHAR2(64)) AS P1TEXT, CAST(P1 AS NUMBER) AS P1, CAST(PARAMETER2 AS VARCHAR2(64)) AS P2TEXT, CAST(P2 AS NUMBER) AS P2, CAST(PARAMETER3 AS VARCHAR2(64)) AS P3TEXT, CAST(P3 AS NUMBER) AS P3, CAST(WAIT_CLASS AS VARCHAR2(64)) AS WAIT_CLASS, CAST(WAIT_CLASS_ID AS NUMBER) AS WAIT_CLASS_ID, CAST(TIME_WAITED AS NUMBER) AS TIME_WAITED, CAST(SQL_PLAN_LINE_ID AS NUMBER) SQL_PLAN_LINE_ID, CAST(GROUP_ID AS NUMBER) GROUP_ID, CAST(TX_ID AS NUMBER) TX_ID, CAST(BLOCKING_SESSION_ID AS NUMBER) BLOCKING_SESSION_ID, CAST(DECODE(IN_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PARSE, CAST(DECODE(IN_PL_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PL_PARSE, CAST(DECODE(IN_PLAN_CACHE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLAN_CACHE, CAST(DECODE(IN_SQL_OPTIMIZE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, CAST(DECODE(IN_SQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_EXECUTION, CAST(DECODE(IN_PX_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PX_EXECUTION, CAST(DECODE(IN_SEQUENCE_LOAD, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, CAST(DECODE(IN_COMMITTING, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_COMMITTING, CAST(DECODE(IN_STORAGE_READ, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_READ, CAST(DECODE(IN_STORAGE_WRITE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_WRITE, CAST(DECODE(IN_REMOTE_DAS_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(DECODE(IN_FILTER_ROWS, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_FILTER_ROWS, CAST(PROGRAM AS VARCHAR2(64)) AS PROGRAM, CAST(MODULE AS VARCHAR2(64)) AS MODULE, CAST(ACTION AS VARCHAR2(64)) AS ACTION, CAST(CLIENT_ID AS VARCHAR2(64)) AS CLIENT_ID, CAST(BACKTRACE AS VARCHAR2(512)) AS BACKTRACE, CAST(TM_DELTA_TIME AS NUMBER) AS TM_DELTA_TIME, CAST(TM_DELTA_CPU_TIME AS NUMBER) AS TM_DELTA_CPU_TIME, CAST(TM_DELTA_DB_TIME AS NUMBER) AS TM_DELTA_DB_TIME, CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, CAST(DECODE(IN_PLSQL_COMPILATION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, CAST(DECODE(IN_PLSQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, CAST(PLSQL_ENTRY_OBJECT_ID AS NUMBER) AS PLSQL_ENTRY_OBJECT_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS NUMBER) AS PLSQL_ENTRY_SUBPROGRAM_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, CAST(PLSQL_OBJECT_ID AS NUMBER) AS PLSQL_OBJECT_ID, CAST(PLSQL_SUBPROGRAM_ID AS NUMBER) AS PLSQL_SUBPROGRAM_ID, CAST(PLSQL_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_SUBPROGRAM_NAME FROM SYS.ALL_VIRTUAL_ASH LEFT JOIN SYS.V$EVENT_NAME on EVENT_NO = "EVENT#" )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM SYS.GV$OB_ACTIVE_SESSION_HISTORY )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2100,7 +2100,7 @@ int ObInnerTableSchema::v_active_session_history_ora_schema(ObTableSchema &table table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, TX_ID, BLOCKING_SESSION_ID, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME FROM SYS.GV$ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM SYS.GV$ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp index 50b1d1706e..4571472433 100644 --- a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp @@ -127,6 +127,363 @@ int ObInnerTableSchema::v_ob_cgroup_config_ora_schema(ObTableSchema &table_schem return ret; } +int ObInnerTableSchema::gv_ob_sqlstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SQLSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SQLSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, CAST(SVR_PORT AS NUMBER) AS SVR_PORT, CAST(TENANT_ID AS NUMBER) AS TENANT_ID, CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, CAST(PLAN_ID AS NUMBER) AS PLAN_ID, CAST(PLAN_HASH AS NUMBER) AS PLAN_HASH, CAST(PLAN_TYPE AS NUMBER) AS PLAN_TYPE, TO_CLOB(QUERY_SQL) AS QUERY_SQL, CAST(MODULE AS VARCHAR(64)) AS MODULE, CAST(ACTION AS VARCHAR(64)) AS ACTION, CAST(PARSING_DB_ID AS NUMBER) AS PARSING_DB_ID, CAST(PARSING_DB_NAME AS VARCHAR(128)) AS PARSING_DB_NAME, CAST(PARSING_USER_ID AS NUMBER) AS PARSING_USER_ID, CAST(EXECUTIONS_TOTAL AS NUMBER) AS EXECUTIONS_TOTAL, CAST(EXECUTIONS_DELTA AS NUMBER) AS EXECUTIONS_DELTA, CAST(DISK_READS_TOTAL AS NUMBER) AS DISK_READS_TOTAL, CAST(DISK_READS_DELTA AS NUMBER) AS DISK_READS_DELTA, CAST(BUFFER_GETS_TOTAL AS NUMBER) AS BUFFER_GETS_TOTAL, CAST(BUFFER_GETS_DELTA AS NUMBER) AS BUFFER_GETS_DELTA, CAST(ELAPSED_TIME_TOTAL AS NUMBER) AS ELAPSED_TIME_TOTAL, CAST(ELAPSED_TIME_DELTA AS NUMBER) AS ELAPSED_TIME_DELTA, CAST(CPU_TIME_TOTAL AS NUMBER) AS CPU_TIME_TOTAL, CAST(CPU_TIME_DELTA AS NUMBER) AS CPU_TIME_DELTA, CAST(CCWAIT_TOTAL AS NUMBER) AS CCWAIT_TOTAL, CAST(CCWAIT_DELTA AS NUMBER) AS CCWAIT_DELTA, CAST(USERIO_WAIT_TOTAL AS NUMBER) AS USERIO_WAIT_TOTAL, CAST(USERIO_WAIT_DELTA AS NUMBER) AS USERIO_WAIT_DELTA, CAST(APWAIT_TOTAL AS NUMBER) AS APWAIT_TOTAL, CAST(APWAIT_DELTA AS NUMBER) AS APWAIT_DELTA, CAST(PHYSICAL_READ_REQUESTS_TOTAL AS NUMBER) AS PHYSICAL_READ_REQUESTS_TOTAL, CAST(PHYSICAL_READ_REQUESTS_DELTA AS NUMBER) AS PHYSICAL_READ_REQUESTS_DELTA, CAST(PHYSICAL_READ_BYTES_TOTAL AS NUMBER) AS PHYSICAL_READ_BYTES_TOTAL, CAST(PHYSICAL_READ_BYTES_DELTA AS NUMBER) AS PHYSICAL_READ_BYTES_DELTA, CAST(WRITE_THROTTLE_TOTAL AS NUMBER) AS WRITE_THROTTLE_TOTAL, CAST(WRITE_THROTTLE_DELTA AS NUMBER) AS WRITE_THROTTLE_DELTA, CAST(ROWS_PROCESSED_TOTAL AS NUMBER) AS ROWS_PROCESSED_TOTAL, CAST(ROWS_PROCESSED_DELTA AS NUMBER) AS ROWS_PROCESSED_DELTA, CAST(MEMSTORE_READ_ROWS_TOTAL AS NUMBER) AS MEMSTORE_READ_ROWS_TOTAL, CAST(MEMSTORE_READ_ROWS_DELTA AS NUMBER) AS MEMSTORE_READ_ROWS_DELTA, CAST(MINOR_SSSTORE_READ_ROWS_TOTAL AS NUMBER) AS MINOR_SSSTORE_READ_ROWS_TOTAL, CAST(MINOR_SSSTORE_READ_ROWS_DELTA AS NUMBER) AS MINOR_SSSTORE_READ_ROWS_DELTA, CAST(MAJOR_SSSTORE_READ_ROWS_TOTAL AS NUMBER) AS MAJOR_SSSTORE_READ_ROWS_TOTAL, CAST(MAJOR_SSSTORE_READ_ROWS_DELTA AS NUMBER) AS MAJOR_SSSTORE_READ_ROWS_DELTA, CAST(RPC_TOTAL AS NUMBER) AS RPC_TOTAL, CAST(RPC_DELTA AS NUMBER) AS RPC_DELTA, CAST(FETCHES_TOTAL AS NUMBER) AS FETCHES_TOTAL, CAST(FETCHES_DELTA AS NUMBER) AS FETCHES_DELTA, CAST(RETRY_TOTAL AS NUMBER) AS RETRY_TOTAL, CAST(RETRY_DELTA AS NUMBER) AS RETRY_DELTA, CAST(PARTITION_TOTAL AS NUMBER) AS PARTITION_TOTAL, CAST(PARTITION_DELTA AS NUMBER) AS PARTITION_DELTA, CAST(NESTED_SQL_TOTAL AS NUMBER) AS NESTED_SQL_TOTAL, CAST(NESTED_SQL_DELTA AS NUMBER) AS NESTED_SQL_DELTA, CAST(SOURCE_IP AS CHAR(46)) AS SOURCE_IP, CAST(SOURCE_PORT AS NUMBER) AS SOURCE_PORT, CAST(ROUTE_MISS_TOTAL AS NUMBER) AS ROUTE_MISS_TOTAL, CAST(ROUTE_MISS_DELTA AS NUMBER) AS ROUTE_MISS_DELTA, CAST(FIRST_LOAD_TIME AS TIMESTAMP(6)) AS FIRST_LOAD_TIME, CAST(PLAN_CACHE_HIT_TOTAL AS NUMBER) AS PLAN_CACHE_HIT_TOTAL, CAST(PLAN_CACHE_HIT_DELTA AS NUMBER) AS PLAN_CACHE_HIT_DELTA FROM SYS.ALL_VIRTUAL_SQLSTAT )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sqlstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SQLSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SQLSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TENANT_ID, SQL_ID, PLAN_ID, PLAN_HASH, PLAN_TYPE, QUERY_SQL, MODULE, ACTION, PARSING_DB_ID, PARSING_DB_NAME, PARSING_USER_ID, EXECUTIONS_TOTAL, EXECUTIONS_DELTA, DISK_READS_TOTAL, DISK_READS_DELTA, BUFFER_GETS_TOTAL, BUFFER_GETS_DELTA, ELAPSED_TIME_TOTAL, ELAPSED_TIME_DELTA, CPU_TIME_TOTAL, CPU_TIME_DELTA, CCWAIT_TOTAL, CCWAIT_DELTA, USERIO_WAIT_TOTAL, USERIO_WAIT_DELTA, APWAIT_TOTAL, APWAIT_DELTA, PHYSICAL_READ_REQUESTS_TOTAL, PHYSICAL_READ_REQUESTS_DELTA, PHYSICAL_READ_BYTES_TOTAL, PHYSICAL_READ_BYTES_DELTA, WRITE_THROTTLE_TOTAL, WRITE_THROTTLE_DELTA, ROWS_PROCESSED_TOTAL, ROWS_PROCESSED_DELTA, MEMSTORE_READ_ROWS_TOTAL, MEMSTORE_READ_ROWS_DELTA, MINOR_SSSTORE_READ_ROWS_TOTAL, MINOR_SSSTORE_READ_ROWS_DELTA, MAJOR_SSSTORE_READ_ROWS_TOTAL, MAJOR_SSSTORE_READ_ROWS_DELTA, RPC_TOTAL, RPC_DELTA, FETCHES_TOTAL, FETCHES_DELTA, RETRY_TOTAL, RETRY_DELTA, PARTITION_TOTAL, PARTITION_DELTA, NESTED_SQL_TOTAL, NESTED_SQL_DELTA, SOURCE_IP, SOURCE_PORT, ROUTE_MISS_TOTAL, ROUTE_MISS_DELTA, FIRST_LOAD_TIME, PLAN_CACHE_HIT_TOTAL, PLAN_CACHE_HIT_DELTA FROM SYS.GV$OB_SQLSTAT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::gv_ob_sess_time_model_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SESS_TIME_MODEL_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SESS_TIME_MODEL_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SID, CAST(GV$SESSTAT.CON_ID AS NUMBER) AS TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, CAST(NAME AS VARCHAR2(64)) AS STAT_NAME, VALUE FROM SYS.GV$SESSTAT left join SYS.v$statname on SYS.GV$SESSTAT.statistic#=SYS.v$statname.statistic# WHERE STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sess_time_model_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SESS_TIME_MODEL_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SESS_TIME_MODEL_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SID, TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, STAT_NAME, VALUE FROM SYS.GV$OB_SESS_TIME_MODEL WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT(); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::gv_ob_sys_time_model_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SYS_TIME_MODEL_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SYS_TIME_MODEL_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CON_ID AS TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, CAST(NAME AS VARCHAR2(64)) AS STAT_NAME, VALUE FROM SYS.GV$SYSSTAT WHERE STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_sys_time_model_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SYS_TIME_MODEL_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SYS_TIME_MODEL_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, SVR_IP, SVR_PORT, STAT_ID, STAT_NAME, VALUE FROM SYS.GV$OB_SYS_TIME_MODEL WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT(); )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_statname_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_STATNAME_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_STATNAME_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( select CAST(TENANT_ID AS NUMBER) AS CON_ID, CAST(STAT_ID AS NUMBER) as STAT_ID, CAST("STATISTIC#" AS NUMBER) as "STATISTIC#", CAST(NAME AS VARCHAR2(64)) AS NAME, CAST(DISPLAY_NAME AS VARCHAR2(64)) AS DISPLAY_NAME, CAST(CLASS AS NUMBER) AS CLASS from SYS.TENANT_VIRTUAL_STATNAME )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_aux_statistics_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -229,6 +586,108 @@ int ObInnerTableSchema::dba_ob_sys_variables_ora_schema(ObTableSchema &table_sch return ret; } +int ObInnerTableSchema::gv_ob_active_session_history_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, CAST(SVR_PORT AS NUMBER) AS SVR_PORT, CAST(SAMPLE_ID AS NUMBER) AS SAMPLE_ID, SAMPLE_TIME AS SAMPLE_TIME, CAST(TENANT_ID AS NUMBER) AS CON_ID, CAST(USER_ID AS NUMBER) AS USER_ID, CAST(SESSION_ID AS NUMBER) AS SESSION_ID, CAST(DECODE(SESSION_TYPE, 0, 'FOREGROUND', 'BACKGROUND') AS VARCHAR2(10)) AS SESSION_TYPE, CAST(DECODE(EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, CAST(PLAN_ID AS NUMBER) AS PLAN_ID, CAST(TRACE_ID AS VARCHAR(64)) AS TRACE_ID, CAST(NAME AS VARCHAR2(64)) AS EVENT, CAST(EVENT_NO AS NUMBER) AS EVENT_NO, CAST(SYS.ALL_VIRTUAL_ASH.EVENT_ID AS NUMBER) AS EVENT_ID, CAST(PARAMETER1 AS VARCHAR2(64)) AS P1TEXT, CAST(P1 AS NUMBER) AS P1, CAST(PARAMETER2 AS VARCHAR2(64)) AS P2TEXT, CAST(P2 AS NUMBER) AS P2, CAST(PARAMETER3 AS VARCHAR2(64)) AS P3TEXT, CAST(P3 AS NUMBER) AS P3, CAST(WAIT_CLASS AS VARCHAR2(64)) AS WAIT_CLASS, CAST(WAIT_CLASS_ID AS NUMBER) AS WAIT_CLASS_ID, CAST(TIME_WAITED AS NUMBER) AS TIME_WAITED, CAST(SQL_PLAN_LINE_ID AS NUMBER) SQL_PLAN_LINE_ID, CAST(GROUP_ID AS NUMBER) GROUP_ID, CAST(PLAN_HASH AS NUMBER) PLAN_HASH, CAST(THREAD_ID AS NUMBER) THREAD_ID, CAST(STMT_TYPE AS NUMBER) STMT_TYPE, CAST(TIME_MODEL AS NUMBER) TIME_MODEL, CAST(DECODE(IN_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PARSE, CAST(DECODE(IN_PL_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PL_PARSE, CAST(DECODE(IN_PLAN_CACHE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLAN_CACHE, CAST(DECODE(IN_SQL_OPTIMIZE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, CAST(DECODE(IN_SQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_EXECUTION, CAST(DECODE(IN_PX_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PX_EXECUTION, CAST(DECODE(IN_SEQUENCE_LOAD, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, CAST(DECODE(IN_COMMITTING, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_COMMITTING, CAST(DECODE(IN_STORAGE_READ, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_READ, CAST(DECODE(IN_STORAGE_WRITE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_WRITE, CAST(DECODE(IN_REMOTE_DAS_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, CAST(DECODE(IN_FILTER_ROWS, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_FILTER_ROWS, CAST(CASE WHEN BITAND(TIME_MODEL , 16384) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_ENCODE, CAST(CASE WHEN BITAND(TIME_MODEL , 32768) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_DECODE, CAST(CASE WHEN BITAND(TIME_MODEL , 65536) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_CONNECTION_MGR, CAST(PROGRAM AS VARCHAR2(64)) AS PROGRAM, CAST(MODULE AS VARCHAR2(64)) AS MODULE, CAST(ACTION AS VARCHAR2(64)) AS ACTION, CAST(CLIENT_ID AS VARCHAR2(64)) AS CLIENT_ID, CAST(BACKTRACE AS VARCHAR2(512)) AS BACKTRACE, CAST(TM_DELTA_TIME AS NUMBER) AS TM_DELTA_TIME, CAST(TM_DELTA_CPU_TIME AS NUMBER) AS TM_DELTA_CPU_TIME, CAST(TM_DELTA_DB_TIME AS NUMBER) AS TM_DELTA_DB_TIME, CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, CAST(DECODE(IN_PLSQL_COMPILATION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, CAST(DECODE(IN_PLSQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, CAST(PLSQL_ENTRY_OBJECT_ID AS NUMBER) AS PLSQL_ENTRY_OBJECT_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS NUMBER) AS PLSQL_ENTRY_SUBPROGRAM_ID, CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, CAST(PLSQL_OBJECT_ID AS NUMBER) AS PLSQL_OBJECT_ID, CAST(PLSQL_SUBPROGRAM_ID AS NUMBER) AS PLSQL_SUBPROGRAM_ID, CAST(PLSQL_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_SUBPROGRAM_NAME, CAST(TX_ID AS NUMBER) AS TX_ID, CAST(BLOCKING_SESSION_ID AS NUMBER) AS BLOCKING_SESSION_ID, CAST(TABLET_ID AS NUMBER) AS TABLET_ID, CAST(PROXY_SID AS NUMBER) AS PROXY_SID FROM SYS.ALL_VIRTUAL_ASH LEFT JOIN SYS.V$EVENT_NAME on EVENT_NO = "EVENT#" )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_active_session_history_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, CON_ID, USER_ID, SESSION_ID, SESSION_TYPE, SESSION_STATE, SQL_ID, PLAN_ID, TRACE_ID, EVENT, EVENT_NO, EVENT_ID, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS, WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, PLAN_HASH, THREAD_ID, STMT_TYPE, TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION, IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, IN_RPC_ENCODE, IN_RPC_DECODE, IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, CLIENT_ID, BACKTRACE, TM_DELTA_TIME, TM_DELTA_CPU_TIME, TM_DELTA_DB_TIME, TOP_LEVEL_SQL_ID, IN_PLSQL_COMPILATION, IN_PLSQL_EXECUTION, PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, PLSQL_SUBPROGRAM_NAME, TX_ID, BLOCKING_SESSION_ID, TABLET_ID, PROXY_SID FROM SYS.GV$OB_ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_index_usage_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -1147,6 +1606,108 @@ int ObInnerTableSchema::v_ob_nic_info_ora_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_query_response_time_histogram_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP AS SVR_IP, SVR_PORT AS SVR_PORT, TENANT_ID AS TENANT_ID, SQL_TYPE AS SQL_TYPE, RESPONSE_TIME / 1000000 AS RESPONSE_TIME, COUNT AS COUNT, TOTAL / 1000000 AS TOTAL FROM SYS.ALL_VIRTUAL_QUERY_RESPONSE_TIME )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_query_response_time_histogram_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, TENANT_ID, SQL_TYPE, RESPONSE_TIME, COUNT, TOTAL FROM SYS.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM WHERE SVR_IP =HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_spatial_columns_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.28251_28300.cpp b/src/share/inner_table/ob_inner_table_schema.28251_28300.cpp index 2a1ffa15f7..7a2e4ca615 100644 --- a/src/share/inner_table/ob_inner_table_schema.28251_28300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28251_28300.cpp @@ -178,6 +178,159 @@ int ObInnerTableSchema::user_plsql_type_attrs_schema(ObTableSchema &table_schema return ret; } +int ObInnerTableSchema::gv_ob_res_mgr_sysstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_RES_MGR_SYSSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_RES_MGR_SYSSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(TENANT_ID AS NUMBER) as CON_ID, CAST(GROUP_ID AS NUMBER) as GROUP_ID, SVR_IP as SVR_IP, SVR_PORT as SVR_PORT, CAST("STATISTIC#" AS NUMBER) as "STATISTIC#", CAST(NAME AS VARCHAR2(64)) as NAME, CAST(CLASS AS NUMBER) as CLASS, CAST(VALUE AS NUMBER) as VALUE, CAST(VALUE_TYPE AS VARCHAR2(16)) as VALUE_TYPE, CAST(STAT_ID AS NUMBER) as STAT_ID FROM SYS.ALL_VIRTUAL_RES_MGR_SYSSTAT )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_res_mgr_sysstat_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_RES_MGR_SYSSTAT_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_RES_MGR_SYSSTAT_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CON_ID, GROUP_ID, SVR_IP, SVR_PORT, "STATISTIC#", NAME, CLASS, VALUE, VALUE_TYPE, STAT_ID FROM SYS.GV$OB_RES_MGR_SYSSTAT WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::dba_wr_sql_plan_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_DBA_WR_SQL_PLAN_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DBA_WR_SQL_PLAN_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SQLPLAN.TENANT_ID AS TENANT_ID, SQLPLAN.CLUSTER_ID AS CLUSTER_ID, SQLPLAN.SNAP_ID AS SNAP_ID, SQLPLAN.SVR_IP AS SVR_IP, SQLPLAN.SVR_PORT AS SVR_PORT, SQLPLAN.SQL_ID AS SQL_ID, SQLPLAN.PLAN_HASH AS PLAN_HASH, SQLPLAN.PLAN_ID AS PLAN_ID, SQLPLAN.ID AS ID, SQLPLAN.DB_ID AS DB_ID, SQLPLAN.GMT_CREATE AS GMT_CREATE, SQLPLAN.OPERATOR AS OPERATOR, SQLPLAN.OPTIONS AS OPTIONS, SQLPLAN.OBJECT_NODE AS OBJECT_NODE, SQLPLAN.OBJECT_ID AS OBJECT_ID, SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, SQLPLAN.OBJECT_NAME AS OBJECT_NAME, SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, SQLPLAN.OPTIMIZER AS OPTIMIZER, SQLPLAN.PARENT_ID AS PARENT_ID, SQLPLAN.DEPTH AS DEPTH, SQLPLAN.POSITION AS POSITION, SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, SQLPLAN.COST AS COST, SQLPLAN.REAL_COST AS REAL_COST, SQLPLAN.CARDINALITY AS CARDINALITY, SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, SQLPLAN.BYTES AS BYTES, SQLPLAN.ROWSET AS ROWSET, SQLPLAN.OTHER_TAG AS OTHER_TAG, SQLPLAN.PARTITION_START AS PARTITION_START, SQLPLAN.other AS OTHER, SQLPLAN.CPU_COST AS CPU_COST, SQLPLAN.IO_COST AS IO_COST, SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, SQLPLAN.PROJECTION AS PROJECTION, SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, SQLPLAN.REMARKS AS REMARKS, SQLPLAN.OTHER_XML AS OTHER_XML FROM SYS.ALL_VIRTUAL_WR_SQL_PLAN SQLPLAN WHERE SQLPLAN.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + table_schema.set_micro_index_clustered(false); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_spm_evo_result_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.451_500.cpp b/src/share/inner_table/ob_inner_table_schema.451_500.cpp index 6f6854ac76..c1f54f348f 100644 --- a/src/share/inner_table/ob_inner_table_schema.451_500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.451_500.cpp @@ -12143,6 +12143,370 @@ int ObInnerTableSchema::all_clone_job_history_schema(ObTableSchema &table_schema return ret; } +int ObInnerTableSchema::wr_system_event_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SYSTEM_EVENT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(6); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SYSTEM_EVENT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("total_waits", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("total_timeouts", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("time_waited_micro", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SYSTEM_EVENT_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_aux_lob_meta_tid(OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::wr_event_name_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_EVENT_NAME_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_EVENT_NAME_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("event_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter1", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter2", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parameter3", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("wait_class_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("wait_class", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_EVENT_NAME_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_aux_lob_meta_tid(OB_WR_EVENT_NAME_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_routine_privilege_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -12607,6 +12971,1130 @@ int ObInnerTableSchema::all_routine_privilege_history_schema(ObTableSchema &tabl return ret; } +int ObInnerTableSchema::wr_sqlstat_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLSTAT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLSTAT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_hash", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("source_ip", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("source_port", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("module", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("action", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 64, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_db_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_db_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parsing_user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj executions_total_default; + executions_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("executions_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_total_default, + executions_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj executions_delta_default; + executions_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("executions_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + executions_delta_default, + executions_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_total_default; + disk_reads_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("disk_reads_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_total_default, + disk_reads_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj disk_reads_delta_default; + disk_reads_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("disk_reads_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + disk_reads_delta_default, + disk_reads_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_total_default; + buffer_gets_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("buffer_gets_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_total_default, + buffer_gets_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj buffer_gets_delta_default; + buffer_gets_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("buffer_gets_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + buffer_gets_delta_default, + buffer_gets_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_total_default; + elapsed_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("elapsed_time_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_total_default, + elapsed_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj elapsed_time_delta_default; + elapsed_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("elapsed_time_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + elapsed_time_delta_default, + elapsed_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_total_default; + cpu_time_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("cpu_time_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_total_default, + cpu_time_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj cpu_time_delta_default; + cpu_time_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("cpu_time_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + cpu_time_delta_default, + cpu_time_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_total_default; + ccwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ccwait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_total_default, + ccwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj ccwait_delta_default; + ccwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("ccwait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + ccwait_delta_default, + ccwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_total_default; + userio_wait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("userio_wait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_total_default, + userio_wait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj userio_wait_delta_default; + userio_wait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("userio_wait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + userio_wait_delta_default, + userio_wait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_total_default; + apwait_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("apwait_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_total_default, + apwait_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj apwait_delta_default; + apwait_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("apwait_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + apwait_delta_default, + apwait_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_total_default; + physical_read_requests_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_requests_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_total_default, + physical_read_requests_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_requests_delta_default; + physical_read_requests_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_requests_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_requests_delta_default, + physical_read_requests_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_total_default; + physical_read_bytes_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_bytes_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_total_default, + physical_read_bytes_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj physical_read_bytes_delta_default; + physical_read_bytes_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("physical_read_bytes_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + physical_read_bytes_delta_default, + physical_read_bytes_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_total_default; + write_throttle_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("write_throttle_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_total_default, + write_throttle_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj write_throttle_delta_default; + write_throttle_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("write_throttle_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + write_throttle_delta_default, + write_throttle_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_total_default; + rows_processed_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rows_processed_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_total_default, + rows_processed_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rows_processed_delta_default; + rows_processed_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rows_processed_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rows_processed_delta_default, + rows_processed_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_total_default; + memstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("memstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_total_default, + memstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj memstore_read_rows_delta_default; + memstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("memstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + memstore_read_rows_delta_default, + memstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_total_default; + minor_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("minor_ssstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_total_default, + minor_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj minor_ssstore_read_rows_delta_default; + minor_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("minor_ssstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + minor_ssstore_read_rows_delta_default, + minor_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_total_default; + major_ssstore_read_rows_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("major_ssstore_read_rows_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_total_default, + major_ssstore_read_rows_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj major_ssstore_read_rows_delta_default; + major_ssstore_read_rows_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("major_ssstore_read_rows_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + major_ssstore_read_rows_delta_default, + major_ssstore_read_rows_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_total_default; + rpc_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rpc_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_total_default, + rpc_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj rpc_delta_default; + rpc_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("rpc_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + rpc_delta_default, + rpc_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_total_default; + fetches_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("fetches_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_total_default, + fetches_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj fetches_delta_default; + fetches_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("fetches_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + fetches_delta_default, + fetches_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_total_default; + retry_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("retry_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_total_default, + retry_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj retry_delta_default; + retry_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("retry_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + retry_delta_default, + retry_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_total_default; + partition_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("partition_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_total_default, + partition_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj partition_delta_default; + partition_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("partition_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + partition_delta_default, + partition_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_total_default; + nested_sql_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("nested_sql_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_total_default, + nested_sql_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj nested_sql_delta_default; + nested_sql_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("nested_sql_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + nested_sql_delta_default, + nested_sql_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj route_miss_total_default; + route_miss_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("route_miss_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_total_default, + route_miss_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj route_miss_delta_default; + route_miss_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("route_miss_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + route_miss_delta_default, + route_miss_delta_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("first_load_time", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_total_default; + plan_cache_hit_total_default.set_int(0); + ADD_COLUMN_SCHEMA_T("plan_cache_hit_total", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_total_default, + plan_cache_hit_total_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj plan_cache_hit_delta_default; + plan_cache_hit_delta_default.set_int(0); + ADD_COLUMN_SCHEMA_T("plan_cache_hit_delta", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false, //is_autoincrement + plan_cache_hit_delta_default, + plan_cache_hit_delta_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLSTAT_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_aux_lob_meta_tid(OB_WR_SQLSTAT_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_WR_SQLSTAT_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.501_550.cpp b/src/share/inner_table/ob_inner_table_schema.501_550.cpp index 362b313cb6..8b1891f9ab 100644 --- a/src/share/inner_table/ob_inner_table_schema.501_550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.501_550.cpp @@ -210,6 +210,143 @@ int ObInnerTableSchema::all_tenant_snapshot_job_schema(ObTableSchema &table_sche return ret; } +int ObInnerTableSchema::wr_sqltext_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLTEXT_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(4); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLTEXT_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("query_sql", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObLongTextType, //column_type + CS_TYPE_INVALID, //column_collation_type + 0, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLTEXT_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_aux_lob_meta_tid(OB_WR_SQLTEXT_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_WR_SQLTEXT_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_trusted_root_certificate_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -5186,6 +5323,703 @@ int ObInnerTableSchema::all_pkg_coll_type_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::wr_sql_plan_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQL_PLAN_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(9); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQL_PLAN_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cluster_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("snap_id", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("sql_id", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_hash", //column_name + ++column_id, //column_id + 7, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("plan_id", //column_name + ++column_id, //column_id + 8, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj id_default; + id_default.set_uint64(0); + ADD_COLUMN_SCHEMA_T("id", //column_name + ++column_id, //column_id + 9, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + id_default, + id_default); //default_value + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("db_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("operator", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 255, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("options", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 255, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_node", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 40, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_owner", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_alias", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 261, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("object_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 20, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("optimizer", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("parent_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("depth", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("position", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_last_child", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("real_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cardinality", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("real_cardinality", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("bytes", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("rowset", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other_tag", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("partition_start", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("cpu_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("io_cost", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + 20, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("access_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("filter_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("startup_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("projection", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("special_predicates", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("qblock_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 128, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("remarks", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("other_xml", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 4000, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQL_PLAN_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_aux_lob_meta_tid(OB_WR_SQL_PLAN_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_v2_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp index 7ddf2478e8..7a7cfd6e49 100644 --- a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp @@ -4921,6 +4921,278 @@ int ObInnerTableSchema::all_clone_job_history_aux_lob_meta_schema(ObTableSchema return ret; } +int ObInnerTableSchema::wr_system_event_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SYSTEM_EVENT_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SYSTEM_EVENT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::wr_event_name_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_EVENT_NAME_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_EVENT_NAME_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_EVENT_NAME_AUX_LOB_META_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_EVENT_NAME_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_routine_privilege_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -5193,6 +5465,142 @@ int ObInnerTableSchema::all_routine_privilege_history_aux_lob_meta_schema(ObTabl return ret; } +int ObInnerTableSchema::wr_sqlstat_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLSTAT_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLSTAT_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLSTAT_AUX_LOB_META_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQLSTAT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp b/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp index ff2b5bf493..07fed93932 100644 --- a/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp @@ -161,6 +161,142 @@ int ObInnerTableSchema::all_tenant_snapshot_job_aux_lob_meta_schema(ObTableSchem return ret; } +int ObInnerTableSchema::wr_sqltext_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLTEXT_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLTEXT_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLTEXT_AUX_LOB_META_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQLTEXT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_trusted_root_certificate_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -2881,6 +3017,142 @@ int ObInnerTableSchema::all_pkg_coll_type_aux_lob_meta_schema(ObTableSchema &tab return ret; } +int ObInnerTableSchema::wr_sql_plan_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQL_PLAN_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQL_PLAN_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQL_PLAN_AUX_LOB_META_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQL_PLAN_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_v2_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp index 925b5bc0f7..f18db96d24 100644 --- a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp @@ -3301,6 +3301,188 @@ int ObInnerTableSchema::all_clone_job_history_aux_lob_piece_schema(ObTableSchema return ret; } +int ObInnerTableSchema::wr_system_event_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SYSTEM_EVENT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::wr_event_name_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_EVENT_NAME_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_EVENT_NAME_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_routine_privilege_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -3483,6 +3665,97 @@ int ObInnerTableSchema::all_routine_privilege_history_aux_lob_piece_schema(ObTab return ret; } +int ObInnerTableSchema::wr_sqlstat_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLSTAT_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLSTAT_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLSTAT_AUX_LOB_PIECE_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQLSTAT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp b/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp index e733fea9c6..371fc99513 100644 --- a/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp @@ -116,6 +116,97 @@ int ObInnerTableSchema::all_tenant_snapshot_job_aux_lob_piece_schema(ObTableSche return ret; } +int ObInnerTableSchema::wr_sqltext_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQLTEXT_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQLTEXT_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQLTEXT_AUX_LOB_PIECE_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQLTEXT_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_trusted_root_certificate_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -1936,6 +2027,97 @@ int ObInnerTableSchema::all_pkg_coll_type_aux_lob_piece_schema(ObTableSchema &ta return ret; } +int ObInnerTableSchema::wr_sql_plan_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_WR_SQL_PLAN_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID); + table_schema.set_micro_index_clustered(false); + table_schema.set_data_table_id(OB_WR_SQL_PLAN_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_v2_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.h b/src/share/inner_table/ob_inner_table_schema.h index ddc4722e62..6b9fa31e25 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -610,8 +610,11 @@ public: static int all_storage_ha_perf_diagnose_history_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_schema(share::schema::ObTableSchema &table_schema); + static int wr_system_event_schema(share::schema::ObTableSchema &table_schema); + static int wr_event_name_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_history_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqlstat_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_schema(share::schema::ObTableSchema &table_schema); @@ -620,6 +623,7 @@ public: static int all_transfer_partition_task_schema(share::schema::ObTableSchema &table_schema); static int all_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqltext_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_filter_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_user_schema(share::schema::ObTableSchema &table_schema); @@ -640,6 +644,7 @@ public: static int all_pkg_type_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_type_attr_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_coll_type_schema(share::schema::ObTableSchema &table_schema); + static int wr_sql_plan_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_v2_schema(share::schema::ObTableSchema &table_schema); static int tenant_virtual_all_table_schema(share::schema::ObTableSchema &table_schema); static int tenant_virtual_table_column_schema(share::schema::ObTableSchema &table_schema); @@ -732,6 +737,7 @@ public: static int all_virtual_tablet_stat_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ddl_sim_point_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ddl_sim_point_stat_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_res_mgr_sysstat_schema(share::schema::ObTableSchema &table_schema); static int session_variables_schema(share::schema::ObTableSchema &table_schema); static int global_status_schema(share::schema::ObTableSchema &table_schema); static int session_status_schema(share::schema::ObTableSchema &table_schema); @@ -1068,9 +1074,13 @@ public: static int all_virtual_checkpoint_diagnose_memtable_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_checkpoint_diagnose_checkpoint_unit_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_checkpoint_diagnose_info_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_system_event_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_event_name_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_scheduler_running_job_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_routine_privilege_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_routine_privilege_history_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_sqlstat_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sqlstat_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_aux_stat_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_detect_lock_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_client_to_server_session_info_schema(share::schema::ObTableSchema &table_schema); @@ -1078,6 +1088,7 @@ public: static int all_virtual_transfer_partition_task_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_snapshot_job_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sqltext_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_dbms_lock_allocated_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_shared_storage_compaction_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_snapshot_schema(share::schema::ObTableSchema &table_schema); @@ -1118,6 +1129,7 @@ public: static int all_virtual_pkg_type_attr_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_pkg_coll_type_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_kv_client_info_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sql_plan_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_function_io_stat_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_temp_file_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ncomp_dll_v2_schema(share::schema::ObTableSchema &table_schema); @@ -1379,11 +1391,17 @@ public: static int all_virtual_import_table_task_history_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_info_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_cgroup_config_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_system_event_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_event_name_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_sqlstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sqlstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int tenant_virtual_statname_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_aux_stat_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sys_variable_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sys_variable_default_value_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_transfer_partition_task_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_transfer_partition_task_history_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sqltext_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_snapshot_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_index_usage_info_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_shared_storage_quota_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1399,6 +1417,7 @@ public: static int all_virtual_storage_io_usage_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_zone_storage_sys_agent_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_query_response_time_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_scheduler_job_run_detail_v2_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_spatial_reference_systems_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_log_transport_dest_stat_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1411,6 +1430,8 @@ public: static int all_virtual_pkg_type_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_pkg_type_attr_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_pkg_coll_type_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_wr_sql_plan_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_res_mgr_sysstat_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_function_io_stat_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_temp_file_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ncomp_dll_v2_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1799,8 +1820,22 @@ public: static int v_ob_tenant_runtime_info_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_cgroup_config_schema(share::schema::ObTableSchema &table_schema); static int v_ob_cgroup_config_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_system_event_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_system_event_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_event_name_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_event_name_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_format_outlines_schema(share::schema::ObTableSchema &table_schema); static int procs_priv_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sqlstat_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sqlstat_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sqlstat_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_sqlstat_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sess_time_model_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sess_time_model_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sys_time_model_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sys_time_model_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sys_time_model_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_sys_time_model_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_aux_statistics_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_aux_statistics_schema(share::schema::ObTableSchema &table_schema); static int dba_index_usage_schema(share::schema::ObTableSchema &table_schema); @@ -1809,6 +1844,10 @@ public: static int cdb_ob_transfer_partition_tasks_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sqltext_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_sqltext_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_active_session_history_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_active_session_history_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_trusted_root_certificate_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_clone_progress_schema(share::schema::ObTableSchema &table_schema); static int role_edges_schema(share::schema::ObTableSchema &table_schema); @@ -1886,6 +1925,8 @@ public: static int role_routine_grants_schema(share::schema::ObTableSchema &table_schema); static int func_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_nic_info_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_query_response_time_histogram_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_query_response_time_histogram_schema(share::schema::ObTableSchema &table_schema); static int dba_scheduler_job_run_details_schema(share::schema::ObTableSchema &table_schema); static int cdb_scheduler_job_run_details_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_server_space_usage_schema(share::schema::ObTableSchema &table_schema); @@ -1903,6 +1944,10 @@ public: static int innodb_sys_foreign_cols_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_kv_client_info_schema(share::schema::ObTableSchema &table_schema); static int v_ob_kv_client_info_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_res_mgr_sysstat_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_res_mgr_sysstat_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sql_plan_schema(share::schema::ObTableSchema &table_schema); + static int cdb_wr_sql_plan_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_spm_evo_result_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_spm_evo_result_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_function_io_stat_schema(share::schema::ObTableSchema &table_schema); @@ -2163,9 +2208,14 @@ public: static int dba_ob_import_table_job_history_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_import_table_tasks_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_import_table_task_history_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_system_event_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_event_name_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_format_outlines_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sqlstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sys_time_model_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_transfer_partition_tasks_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_transfer_partition_task_history_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sqltext_ora_schema(share::schema::ObTableSchema &table_schema); static int user_users_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_ls_replica_task_history_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_mview_logs_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2363,8 +2413,17 @@ public: static int v_ob_pl_cache_object_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_cgroup_config_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_cgroup_config_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sqlstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sqlstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sess_time_model_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sess_time_model_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_sys_time_model_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_sys_time_model_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_statname_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_aux_statistics_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_sys_variables_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_active_session_history_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_active_session_history_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_index_usage_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_ls_snapshots_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_ls_snapshots_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2383,6 +2442,8 @@ public: static int gv_ob_group_io_stat_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_query_response_time_histogram_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_query_response_time_histogram_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_spatial_columns_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_table_space_usage_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_log_transport_dest_stat_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2398,6 +2459,9 @@ public: static int all_plsql_type_attrs_schema(share::schema::ObTableSchema &table_schema); static int dba_plsql_type_attrs_schema(share::schema::ObTableSchema &table_schema); static int user_plsql_type_attrs_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_res_mgr_sysstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_res_mgr_sysstat_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_wr_sql_plan_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_spm_evo_result_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_function_io_stat_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_function_io_stat_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2684,8 +2748,11 @@ public: static int all_storage_ha_perf_diagnose_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int wr_system_event_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int wr_event_name_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqlstat_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); @@ -2694,6 +2761,7 @@ public: static int all_transfer_partition_task_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_transfer_partition_task_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqltext_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_filter_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_user_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); @@ -2714,6 +2782,7 @@ public: static int all_pkg_type_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_type_attr_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_coll_type_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int wr_sql_plan_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_v2_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_table_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_column_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -2997,8 +3066,11 @@ public: static int all_storage_ha_perf_diagnose_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int wr_system_event_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int wr_event_name_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_routine_privilege_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqlstat_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -3007,6 +3079,7 @@ public: static int all_transfer_partition_task_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_transfer_partition_task_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int wr_sqltext_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_filter_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_audit_log_user_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -3027,6 +3100,7 @@ public: static int all_pkg_type_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_type_attr_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_pkg_coll_type_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int wr_sql_plan_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_v2_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ash_all_virtual_ash_i1_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema(share::schema::ObTableSchema &table_schema); @@ -3543,8 +3617,11 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_storage_ha_perf_diagnose_history_schema, ObInnerTableSchema::all_clone_job_schema, ObInnerTableSchema::all_clone_job_history_schema, + ObInnerTableSchema::wr_system_event_schema, + ObInnerTableSchema::wr_event_name_schema, ObInnerTableSchema::all_routine_privilege_schema, ObInnerTableSchema::all_routine_privilege_history_schema, + ObInnerTableSchema::wr_sqlstat_schema, ObInnerTableSchema::all_ncomp_dll_schema, ObInnerTableSchema::all_aux_stat_schema, ObInnerTableSchema::all_index_usage_info_schema, @@ -3553,6 +3630,7 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_transfer_partition_task_schema, ObInnerTableSchema::all_transfer_partition_task_history_schema, ObInnerTableSchema::all_tenant_snapshot_job_schema, + ObInnerTableSchema::wr_sqltext_schema, ObInnerTableSchema::all_trusted_root_certificate_schema, ObInnerTableSchema::all_audit_log_filter_schema, ObInnerTableSchema::all_audit_log_user_schema, @@ -3573,6 +3651,7 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_pkg_type_schema, ObInnerTableSchema::all_pkg_type_attr_schema, ObInnerTableSchema::all_pkg_coll_type_schema, + ObInnerTableSchema::wr_sql_plan_schema, ObInnerTableSchema::all_ncomp_dll_v2_schema, NULL,}; @@ -3668,6 +3747,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_tablet_stat_schema, ObInnerTableSchema::all_virtual_ddl_sim_point_schema, ObInnerTableSchema::all_virtual_ddl_sim_point_stat_schema, + ObInnerTableSchema::all_virtual_res_mgr_sysstat_schema, ObInnerTableSchema::session_variables_schema, ObInnerTableSchema::global_status_schema, ObInnerTableSchema::session_status_schema, @@ -4004,9 +4084,13 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_checkpoint_diagnose_memtable_info_schema, ObInnerTableSchema::all_virtual_checkpoint_diagnose_checkpoint_unit_info_schema, ObInnerTableSchema::all_virtual_checkpoint_diagnose_info_schema, + ObInnerTableSchema::all_virtual_wr_system_event_schema, + ObInnerTableSchema::all_virtual_wr_event_name_schema, ObInnerTableSchema::all_virtual_tenant_scheduler_running_job_schema, ObInnerTableSchema::all_virtual_routine_privilege_schema, ObInnerTableSchema::all_virtual_routine_privilege_history_schema, + ObInnerTableSchema::all_virtual_sqlstat_schema, + ObInnerTableSchema::all_virtual_wr_sqlstat_schema, ObInnerTableSchema::all_virtual_aux_stat_schema, ObInnerTableSchema::all_virtual_detect_lock_info_schema, ObInnerTableSchema::all_virtual_client_to_server_session_info_schema, @@ -4014,6 +4098,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_transfer_partition_task_schema, ObInnerTableSchema::all_virtual_transfer_partition_task_history_schema, ObInnerTableSchema::all_virtual_tenant_snapshot_job_schema, + ObInnerTableSchema::all_virtual_wr_sqltext_schema, ObInnerTableSchema::all_virtual_dbms_lock_allocated_schema, ObInnerTableSchema::all_virtual_shared_storage_compaction_info_schema, ObInnerTableSchema::all_virtual_ls_snapshot_schema, @@ -4054,6 +4139,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_pkg_type_attr_schema, ObInnerTableSchema::all_virtual_pkg_coll_type_schema, ObInnerTableSchema::all_virtual_kv_client_info_schema, + ObInnerTableSchema::all_virtual_wr_sql_plan_schema, ObInnerTableSchema::all_virtual_function_io_stat_schema, ObInnerTableSchema::all_virtual_temp_file_schema, ObInnerTableSchema::all_virtual_ncomp_dll_v2_schema, @@ -4325,11 +4411,17 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_import_table_task_history_ora_schema, ObInnerTableSchema::all_virtual_ls_info_ora_schema, ObInnerTableSchema::all_virtual_cgroup_config_ora_schema, + ObInnerTableSchema::all_virtual_wr_system_event_ora_schema, + ObInnerTableSchema::all_virtual_wr_event_name_ora_schema, + ObInnerTableSchema::all_virtual_sqlstat_ora_schema, + ObInnerTableSchema::all_virtual_wr_sqlstat_ora_schema, + ObInnerTableSchema::tenant_virtual_statname_ora_schema, ObInnerTableSchema::all_virtual_aux_stat_real_agent_ora_schema, ObInnerTableSchema::all_virtual_sys_variable_real_agent_ora_schema, ObInnerTableSchema::all_virtual_sys_variable_default_value_ora_schema, ObInnerTableSchema::all_virtual_transfer_partition_task_real_agent_ora_schema, ObInnerTableSchema::all_virtual_transfer_partition_task_history_real_agent_ora_schema, + ObInnerTableSchema::all_virtual_wr_sqltext_ora_schema, ObInnerTableSchema::all_virtual_ls_snapshot_ora_schema, ObInnerTableSchema::all_virtual_index_usage_info_real_agent_ora_schema, ObInnerTableSchema::all_virtual_shared_storage_quota_ora_schema, @@ -4345,6 +4437,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_storage_io_usage_ora_schema, ObInnerTableSchema::all_virtual_zone_storage_sys_agent_schema, ObInnerTableSchema::all_virtual_nic_info_ora_schema, + ObInnerTableSchema::all_virtual_query_response_time_ora_schema, ObInnerTableSchema::all_virtual_scheduler_job_run_detail_v2_real_agent_ora_schema, ObInnerTableSchema::all_virtual_spatial_reference_systems_real_agent_ora_schema, ObInnerTableSchema::all_virtual_log_transport_dest_stat_ora_schema, @@ -4357,6 +4450,8 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_pkg_type_real_agent_ora_schema, ObInnerTableSchema::all_virtual_pkg_type_attr_real_agent_ora_schema, ObInnerTableSchema::all_virtual_pkg_coll_type_real_agent_ora_schema, + ObInnerTableSchema::all_virtual_wr_sql_plan_ora_schema, + ObInnerTableSchema::all_virtual_res_mgr_sysstat_ora_schema, ObInnerTableSchema::all_virtual_function_io_stat_ora_schema, ObInnerTableSchema::all_virtual_temp_file_ora_schema, ObInnerTableSchema::all_virtual_ncomp_dll_v2_real_agent_ora_schema, @@ -4838,8 +4933,22 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::v_ob_tenant_runtime_info_schema, ObInnerTableSchema::gv_ob_cgroup_config_schema, ObInnerTableSchema::v_ob_cgroup_config_schema, + ObInnerTableSchema::dba_wr_system_event_schema, + ObInnerTableSchema::cdb_wr_system_event_schema, + ObInnerTableSchema::dba_wr_event_name_schema, + ObInnerTableSchema::cdb_wr_event_name_schema, ObInnerTableSchema::dba_ob_format_outlines_schema, ObInnerTableSchema::procs_priv_schema, + ObInnerTableSchema::gv_ob_sqlstat_schema, + ObInnerTableSchema::v_ob_sqlstat_schema, + ObInnerTableSchema::dba_wr_sqlstat_schema, + ObInnerTableSchema::cdb_wr_sqlstat_schema, + ObInnerTableSchema::gv_ob_sess_time_model_schema, + ObInnerTableSchema::v_ob_sess_time_model_schema, + ObInnerTableSchema::gv_ob_sys_time_model_schema, + ObInnerTableSchema::v_ob_sys_time_model_schema, + ObInnerTableSchema::dba_wr_sys_time_model_schema, + ObInnerTableSchema::cdb_wr_sys_time_model_schema, ObInnerTableSchema::dba_ob_aux_statistics_schema, ObInnerTableSchema::cdb_ob_aux_statistics_schema, ObInnerTableSchema::dba_index_usage_schema, @@ -4848,6 +4957,10 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::cdb_ob_transfer_partition_tasks_schema, ObInnerTableSchema::dba_ob_transfer_partition_task_history_schema, ObInnerTableSchema::cdb_ob_transfer_partition_task_history_schema, + ObInnerTableSchema::dba_wr_sqltext_schema, + ObInnerTableSchema::cdb_wr_sqltext_schema, + ObInnerTableSchema::gv_ob_active_session_history_schema, + ObInnerTableSchema::v_ob_active_session_history_schema, ObInnerTableSchema::dba_ob_trusted_root_certificate_schema, ObInnerTableSchema::dba_ob_clone_progress_schema, ObInnerTableSchema::role_edges_schema, @@ -4925,6 +5038,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::role_routine_grants_schema, ObInnerTableSchema::func_schema, ObInnerTableSchema::gv_ob_nic_info_schema, + ObInnerTableSchema::gv_ob_query_response_time_histogram_schema, + ObInnerTableSchema::v_ob_query_response_time_histogram_schema, ObInnerTableSchema::dba_scheduler_job_run_details_schema, ObInnerTableSchema::cdb_scheduler_job_run_details_schema, ObInnerTableSchema::cdb_ob_server_space_usage_schema, @@ -4942,6 +5057,10 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::innodb_sys_foreign_cols_schema, ObInnerTableSchema::gv_ob_kv_client_info_schema, ObInnerTableSchema::v_ob_kv_client_info_schema, + ObInnerTableSchema::gv_ob_res_mgr_sysstat_schema, + ObInnerTableSchema::v_ob_res_mgr_sysstat_schema, + ObInnerTableSchema::dba_wr_sql_plan_schema, + ObInnerTableSchema::cdb_wr_sql_plan_schema, ObInnerTableSchema::dba_ob_spm_evo_result_schema, ObInnerTableSchema::cdb_ob_spm_evo_result_schema, ObInnerTableSchema::gv_ob_function_io_stat_schema, @@ -5202,9 +5321,14 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::dba_ob_import_table_job_history_ora_schema, ObInnerTableSchema::dba_ob_import_table_tasks_ora_schema, ObInnerTableSchema::dba_ob_import_table_task_history_ora_schema, + ObInnerTableSchema::dba_wr_system_event_ora_schema, + ObInnerTableSchema::dba_wr_event_name_ora_schema, ObInnerTableSchema::dba_ob_format_outlines_ora_schema, + ObInnerTableSchema::dba_wr_sqlstat_ora_schema, + ObInnerTableSchema::dba_wr_sys_time_model_ora_schema, ObInnerTableSchema::dba_ob_transfer_partition_tasks_ora_schema, ObInnerTableSchema::dba_ob_transfer_partition_task_history_ora_schema, + ObInnerTableSchema::dba_wr_sqltext_ora_schema, ObInnerTableSchema::user_users_schema, ObInnerTableSchema::dba_ob_ls_replica_task_history_ora_schema, ObInnerTableSchema::dba_mview_logs_ora_schema, @@ -5402,8 +5526,17 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::v_ob_pl_cache_object_ora_schema, ObInnerTableSchema::gv_ob_cgroup_config_ora_schema, ObInnerTableSchema::v_ob_cgroup_config_ora_schema, + ObInnerTableSchema::gv_ob_sqlstat_ora_schema, + ObInnerTableSchema::v_ob_sqlstat_ora_schema, + ObInnerTableSchema::gv_ob_sess_time_model_ora_schema, + ObInnerTableSchema::v_ob_sess_time_model_ora_schema, + ObInnerTableSchema::gv_ob_sys_time_model_ora_schema, + ObInnerTableSchema::v_ob_sys_time_model_ora_schema, + ObInnerTableSchema::v_statname_ora_schema, ObInnerTableSchema::dba_ob_aux_statistics_ora_schema, ObInnerTableSchema::dba_ob_sys_variables_ora_schema, + ObInnerTableSchema::gv_ob_active_session_history_ora_schema, + ObInnerTableSchema::v_ob_active_session_history_ora_schema, ObInnerTableSchema::dba_index_usage_ora_schema, ObInnerTableSchema::gv_ob_ls_snapshots_ora_schema, ObInnerTableSchema::v_ob_ls_snapshots_ora_schema, @@ -5422,6 +5555,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::gv_ob_group_io_stat_ora_schema, ObInnerTableSchema::gv_ob_nic_info_ora_schema, ObInnerTableSchema::v_ob_nic_info_ora_schema, + ObInnerTableSchema::gv_ob_query_response_time_histogram_ora_schema, + ObInnerTableSchema::v_ob_query_response_time_histogram_ora_schema, ObInnerTableSchema::dba_ob_spatial_columns_ora_schema, ObInnerTableSchema::dba_ob_table_space_usage_ora_schema, ObInnerTableSchema::gv_ob_log_transport_dest_stat_ora_schema, @@ -5437,6 +5572,9 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::all_plsql_type_attrs_schema, ObInnerTableSchema::dba_plsql_type_attrs_schema, ObInnerTableSchema::user_plsql_type_attrs_schema, + ObInnerTableSchema::gv_ob_res_mgr_sysstat_ora_schema, + ObInnerTableSchema::v_ob_res_mgr_sysstat_ora_schema, + ObInnerTableSchema::dba_wr_sql_plan_ora_schema, ObInnerTableSchema::dba_ob_spm_evo_result_ora_schema, ObInnerTableSchema::gv_ob_function_io_stat_ora_schema, ObInnerTableSchema::v_ob_function_io_stat_ora_schema, @@ -5832,8 +5970,11 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_TID, OB_ALL_CLONE_JOB_TID, OB_ALL_CLONE_JOB_HISTORY_TID, + OB_WR_SYSTEM_EVENT_TID, + OB_WR_EVENT_NAME_TID, OB_ALL_ROUTINE_PRIVILEGE_TID, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID, + OB_WR_SQLSTAT_TID, OB_ALL_NCOMP_DLL_TID, OB_ALL_AUX_STAT_TID, OB_ALL_INDEX_USAGE_INFO_TID, @@ -5842,6 +5983,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TRANSFER_PARTITION_TASK_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TID, OB_ALL_TENANT_SNAPSHOT_JOB_TID, + OB_WR_SQLTEXT_TID, OB_ALL_AUDIT_LOG_FILTER_TID, OB_ALL_AUDIT_LOG_USER_TID, OB_ALL_COLUMN_PRIVILEGE_TID, @@ -5861,6 +6003,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_PKG_TYPE_TID, OB_ALL_PKG_TYPE_ATTR_TID, OB_ALL_PKG_COLL_TYPE_TID, + OB_WR_SQL_PLAN_TID, OB_ALL_NCOMP_DLL_V2_TID, OB_TENANT_VIRTUAL_ALL_TABLE_TID, OB_TENANT_VIRTUAL_TABLE_COLUMN_TID, @@ -5933,6 +6076,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TID, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TID, OB_ALL_VIRTUAL_TABLET_STAT_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID, OB_SESSION_VARIABLES_TID, OB_GLOBAL_STATUS_TID, OB_SESSION_STATUS_TID, @@ -6083,10 +6227,15 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TID, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TID, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TID, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID, + OB_ALL_VIRTUAL_WR_EVENT_NAME_TID, + OB_ALL_VIRTUAL_SQLSTAT_TID, + OB_ALL_VIRTUAL_WR_SQLSTAT_TID, OB_ALL_VIRTUAL_DETECT_LOCK_INFO_TID, OB_ALL_VIRTUAL_CLIENT_TO_SERVER_SESSION_INFO_TID, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TID, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TID, + OB_ALL_VIRTUAL_WR_SQLTEXT_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_TID, @@ -6110,6 +6259,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_SPM_EVO_RESULT_TID, OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_TID, OB_ALL_VIRTUAL_KV_CLIENT_INFO_TID, + OB_ALL_VIRTUAL_WR_SQL_PLAN_TID, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_TID, OB_ALL_VIRTUAL_TEMP_FILE_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, @@ -6379,11 +6529,17 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TID, OB_ALL_VIRTUAL_LS_INFO_ORA_TID, OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TID, + OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TID, + OB_ALL_VIRTUAL_SQLSTAT_ORA_TID, + OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TID, + OB_TENANT_VIRTUAL_STATNAME_ORA_TID, OB_ALL_VIRTUAL_AUX_STAT_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TID, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TID, @@ -6399,6 +6555,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TID, OB_ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID, + OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID, OB_ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TID, @@ -6411,6 +6568,8 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_PKG_TYPE_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TID, OB_ALL_VIRTUAL_TEMP_FILE_ORA_TID, OB_ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT_ORA_TID, @@ -6692,13 +6851,26 @@ const uint64_t tenant_space_tables [] = { OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_TID, OB_GV_OB_CGROUP_CONFIG_TID, OB_V_OB_CGROUP_CONFIG_TID, + OB_DBA_WR_SYSTEM_EVENT_TID, + OB_DBA_WR_EVENT_NAME_TID, OB_DBA_OB_FORMAT_OUTLINES_TID, OB_PROCS_PRIV_TID, + OB_GV_OB_SQLSTAT_TID, + OB_V_OB_SQLSTAT_TID, + OB_DBA_WR_SQLSTAT_TID, + OB_GV_OB_SESS_TIME_MODEL_TID, + OB_V_OB_SESS_TIME_MODEL_TID, + OB_GV_OB_SYS_TIME_MODEL_TID, + OB_V_OB_SYS_TIME_MODEL_TID, + OB_DBA_WR_SYS_TIME_MODEL_TID, OB_DBA_OB_AUX_STATISTICS_TID, OB_DBA_INDEX_USAGE_TID, OB_DBA_OB_SYS_VARIABLES_TID, OB_DBA_OB_TRANSFER_PARTITION_TASKS_TID, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TID, + OB_DBA_WR_SQLTEXT_TID, + OB_GV_OB_ACTIVE_SESSION_HISTORY_TID, + OB_V_OB_ACTIVE_SESSION_HISTORY_TID, OB_ROLE_EDGES_TID, OB_DEFAULT_ROLES_TID, OB_AUDIT_LOG_FILTER_TID, @@ -6760,6 +6932,8 @@ const uint64_t tenant_space_tables [] = { OB_ROLE_ROUTINE_GRANTS_TID, OB_FUNC_TID, OB_GV_OB_NIC_INFO_TID, + OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID, + OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID, OB_DBA_SCHEDULER_JOB_RUN_DETAILS_TID, OB_DBA_OB_TABLE_SPACE_USAGE_TID, OB_GV_OB_LOG_TRANSPORT_DEST_STAT_TID, @@ -6773,6 +6947,9 @@ const uint64_t tenant_space_tables [] = { OB_INNODB_SYS_FOREIGN_COLS_TID, OB_GV_OB_KV_CLIENT_INFO_TID, OB_V_OB_KV_CLIENT_INFO_TID, + OB_GV_OB_RES_MGR_SYSSTAT_TID, + OB_V_OB_RES_MGR_SYSSTAT_TID, + OB_DBA_WR_SQL_PLAN_TID, OB_DBA_OB_SPM_EVO_RESULT_TID, OB_GV_OB_FUNCTION_IO_STAT_TID, OB_V_OB_FUNCTION_IO_STAT_TID, @@ -7031,9 +7208,14 @@ const uint64_t tenant_space_tables [] = { OB_DBA_OB_IMPORT_TABLE_JOB_HISTORY_ORA_TID, OB_DBA_OB_IMPORT_TABLE_TASKS_ORA_TID, OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_ORA_TID, + OB_DBA_WR_SYSTEM_EVENT_ORA_TID, + OB_DBA_WR_EVENT_NAME_ORA_TID, OB_DBA_OB_FORMAT_OUTLINES_ORA_TID, + OB_DBA_WR_SQLSTAT_ORA_TID, + OB_DBA_WR_SYS_TIME_MODEL_ORA_TID, OB_DBA_OB_TRANSFER_PARTITION_TASKS_ORA_TID, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_ORA_TID, + OB_DBA_WR_SQLTEXT_ORA_TID, OB_USER_USERS_TID, OB_DBA_OB_LS_REPLICA_TASK_HISTORY_ORA_TID, OB_DBA_MVIEW_LOGS_ORA_TID, @@ -7231,8 +7413,17 @@ const uint64_t tenant_space_tables [] = { OB_V_OB_PL_CACHE_OBJECT_ORA_TID, OB_GV_OB_CGROUP_CONFIG_ORA_TID, OB_V_OB_CGROUP_CONFIG_ORA_TID, + OB_GV_OB_SQLSTAT_ORA_TID, + OB_V_OB_SQLSTAT_ORA_TID, + OB_GV_OB_SESS_TIME_MODEL_ORA_TID, + OB_V_OB_SESS_TIME_MODEL_ORA_TID, + OB_GV_OB_SYS_TIME_MODEL_ORA_TID, + OB_V_OB_SYS_TIME_MODEL_ORA_TID, + OB_V_STATNAME_ORA_TID, OB_DBA_OB_AUX_STATISTICS_ORA_TID, OB_DBA_OB_SYS_VARIABLES_ORA_TID, + OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TID, + OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TID, OB_DBA_INDEX_USAGE_ORA_TID, OB_GV_OB_LS_SNAPSHOTS_ORA_TID, OB_V_OB_LS_SNAPSHOTS_ORA_TID, @@ -7251,6 +7442,8 @@ const uint64_t tenant_space_tables [] = { OB_GV_OB_GROUP_IO_STAT_ORA_TID, OB_GV_OB_NIC_INFO_ORA_TID, OB_V_OB_NIC_INFO_ORA_TID, + OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID, + OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID, OB_DBA_OB_SPATIAL_COLUMNS_ORA_TID, OB_DBA_OB_TABLE_SPACE_USAGE_ORA_TID, OB_GV_OB_LOG_TRANSPORT_DEST_STAT_ORA_TID, @@ -7266,6 +7459,9 @@ const uint64_t tenant_space_tables [] = { OB_ALL_PLSQL_TYPE_ATTRS_TID, OB_DBA_PLSQL_TYPE_ATTRS_TID, OB_USER_PLSQL_TYPE_ATTRS_TID, + OB_GV_OB_RES_MGR_SYSSTAT_ORA_TID, + OB_V_OB_RES_MGR_SYSSTAT_ORA_TID, + OB_DBA_WR_SQL_PLAN_ORA_TID, OB_DBA_OB_SPM_EVO_RESULT_ORA_TID, OB_GV_OB_FUNCTION_IO_STAT_ORA_TID, OB_V_OB_FUNCTION_IO_STAT_ORA_TID, @@ -7720,8 +7916,11 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_AUX_LOB_META_TID, OB_ALL_CLONE_JOB_AUX_LOB_META_TID, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TID, + OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID, + OB_WR_EVENT_NAME_AUX_LOB_META_TID, OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID, + OB_WR_SQLSTAT_AUX_LOB_META_TID, OB_ALL_NCOMP_DLL_AUX_LOB_META_TID, OB_ALL_AUX_STAT_AUX_LOB_META_TID, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TID, @@ -7730,6 +7929,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TID, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TID, + OB_WR_SQLTEXT_AUX_LOB_META_TID, OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_META_TID, OB_ALL_AUDIT_LOG_USER_AUX_LOB_META_TID, OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID, @@ -7749,6 +7949,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_PKG_TYPE_AUX_LOB_META_TID, OB_ALL_PKG_TYPE_ATTR_AUX_LOB_META_TID, OB_ALL_PKG_COLL_TYPE_AUX_LOB_META_TID, + OB_WR_SQL_PLAN_AUX_LOB_META_TID, OB_ALL_NCOMP_DLL_V2_AUX_LOB_META_TID, OB_ALL_TABLE_AUX_LOB_PIECE_TID, OB_ALL_COLUMN_AUX_LOB_PIECE_TID, @@ -8007,8 +8208,11 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TID, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TID, + OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID, + OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID, OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID, + OB_WR_SQLSTAT_AUX_LOB_PIECE_TID, OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TID, OB_ALL_AUX_STAT_AUX_LOB_PIECE_TID, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TID, @@ -8017,6 +8221,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TID, + OB_WR_SQLTEXT_AUX_LOB_PIECE_TID, OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_PIECE_TID, OB_ALL_AUDIT_LOG_USER_AUX_LOB_PIECE_TID, OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID, @@ -8036,6 +8241,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_PKG_TYPE_AUX_LOB_PIECE_TID, OB_ALL_PKG_TYPE_ATTR_AUX_LOB_PIECE_TID, OB_ALL_PKG_COLL_TYPE_AUX_LOB_PIECE_TID, + OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID, OB_ALL_NCOMP_DLL_V2_AUX_LOB_PIECE_TID, }; const uint64_t all_ora_mapping_virtual_table_org_tables [] = { @@ -8178,7 +8384,13 @@ const uint64_t all_ora_mapping_virtual_table_org_tables [] = { OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_TID, OB_ALL_VIRTUAL_LS_INFO_TID, OB_ALL_VIRTUAL_CGROUP_CONFIG_TID, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID, + OB_ALL_VIRTUAL_WR_EVENT_NAME_TID, + OB_ALL_VIRTUAL_SQLSTAT_TID, + OB_ALL_VIRTUAL_WR_SQLSTAT_TID, + OB_TENANT_VIRTUAL_STATNAME_TID, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TID, + OB_ALL_VIRTUAL_WR_SQLTEXT_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_TID, OB_ALL_VIRTUAL_LS_REPLICA_TASK_HISTORY_TID, @@ -8190,10 +8402,13 @@ const uint64_t all_ora_mapping_virtual_table_org_tables [] = { OB_ALL_VIRTUAL_GROUP_IO_STAT_TID, OB_ALL_VIRTUAL_STORAGE_IO_USAGE_TID, OB_ALL_VIRTUAL_NIC_INFO_TID, + OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_TID, OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_TID, OB_ALL_VIRTUAL_SS_LOCAL_CACHE_INFO_TID, OB_ALL_VIRTUAL_SPM_EVO_RESULT_TID, OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_TID, + OB_ALL_VIRTUAL_WR_SQL_PLAN_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_TID, OB_ALL_VIRTUAL_TEMP_FILE_TID, OB_ALL_VIRTUAL_TABLET_POINTER_STATUS_TID, }; @@ -8337,7 +8552,13 @@ const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_O , OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TID , OB_ALL_VIRTUAL_LS_INFO_ORA_TID , OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID +, OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TID +, OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TID +, OB_ALL_VIRTUAL_SQLSTAT_ORA_TID +, OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TID +, OB_TENANT_VIRTUAL_STATNAME_ORA_TID , OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TID +, OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TID , OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID , OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TID , OB_ALL_VIRTUAL_LS_REPLICA_TASK_HISTORY_ORA_TID @@ -8349,10 +8570,13 @@ const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_O , OB_ALL_VIRTUAL_GROUP_IO_STAT_ORA_TID , OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TID , OB_ALL_VIRTUAL_NIC_INFO_ORA_TID +, OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID , OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TID , OB_ALL_VIRTUAL_SS_LOCAL_CACHE_INFO_ORA_TID , OB_ALL_VIRTUAL_SPM_EVO_RESULT_ORA_TID , OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_ORA_TID +, OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TID +, OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID , OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TID , OB_ALL_VIRTUAL_TEMP_FILE_ORA_TID , OB_ALL_VIRTUAL_TABLET_POINTER_STATUS_ORA_TID @@ -8628,8 +8852,11 @@ const char* const tenant_space_table_names [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_TNAME, OB_ALL_CLONE_JOB_TNAME, OB_ALL_CLONE_JOB_HISTORY_TNAME, + OB_WR_SYSTEM_EVENT_TNAME, + OB_WR_EVENT_NAME_TNAME, OB_ALL_ROUTINE_PRIVILEGE_TNAME, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME, + OB_WR_SQLSTAT_TNAME, OB_ALL_NCOMP_DLL_TNAME, OB_ALL_AUX_STAT_TNAME, OB_ALL_INDEX_USAGE_INFO_TNAME, @@ -8638,6 +8865,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_TRANSFER_PARTITION_TASK_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_TNAME, + OB_WR_SQLTEXT_TNAME, OB_ALL_AUDIT_LOG_FILTER_TNAME, OB_ALL_AUDIT_LOG_USER_TNAME, OB_ALL_COLUMN_PRIVILEGE_TNAME, @@ -8657,6 +8885,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_PKG_TYPE_TNAME, OB_ALL_PKG_TYPE_ATTR_TNAME, OB_ALL_PKG_COLL_TYPE_TNAME, + OB_WR_SQL_PLAN_TNAME, OB_ALL_NCOMP_DLL_V2_TNAME, OB_TENANT_VIRTUAL_ALL_TABLE_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, @@ -8729,6 +8958,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TNAME, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TNAME, OB_ALL_VIRTUAL_TABLET_STAT_TNAME, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TNAME, OB_SESSION_VARIABLES_TNAME, OB_GLOBAL_STATUS_TNAME, OB_SESSION_STATUS_TNAME, @@ -8879,10 +9109,15 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TNAME, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TNAME, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TNAME, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TNAME, + OB_ALL_VIRTUAL_WR_EVENT_NAME_TNAME, + OB_ALL_VIRTUAL_SQLSTAT_TNAME, + OB_ALL_VIRTUAL_WR_SQLSTAT_TNAME, OB_ALL_VIRTUAL_DETECT_LOCK_INFO_TNAME, OB_ALL_VIRTUAL_CLIENT_TO_SERVER_SESSION_INFO_TNAME, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TNAME, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TNAME, + OB_ALL_VIRTUAL_WR_SQLTEXT_TNAME, OB_ALL_VIRTUAL_LS_SNAPSHOT_TNAME, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_TNAME, @@ -8906,6 +9141,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_SPM_EVO_RESULT_TNAME, OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_TNAME, OB_ALL_VIRTUAL_KV_CLIENT_INFO_TNAME, + OB_ALL_VIRTUAL_WR_SQL_PLAN_TNAME, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_TNAME, OB_ALL_VIRTUAL_TEMP_FILE_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME, @@ -9175,11 +9411,17 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TNAME, OB_ALL_VIRTUAL_LS_INFO_ORA_TNAME, OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TNAME, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TNAME, + OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TNAME, + OB_ALL_VIRTUAL_SQLSTAT_ORA_TNAME, + OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TNAME, + OB_TENANT_VIRTUAL_STATNAME_ORA_TNAME, OB_ALL_VIRTUAL_AUX_STAT_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TNAME, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TNAME, + OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TNAME, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TNAME, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TNAME, @@ -9195,6 +9437,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TNAME, OB_ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT_TNAME, OB_ALL_VIRTUAL_NIC_INFO_ORA_TNAME, + OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TNAME, OB_ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TNAME, @@ -9207,6 +9450,8 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_PKG_TYPE_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT_ORA_TNAME, + OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TNAME, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TNAME, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TNAME, OB_ALL_VIRTUAL_TEMP_FILE_ORA_TNAME, OB_ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT_ORA_TNAME, @@ -9488,13 +9733,26 @@ const char* const tenant_space_table_names [] = { OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_TNAME, OB_GV_OB_CGROUP_CONFIG_TNAME, OB_V_OB_CGROUP_CONFIG_TNAME, + OB_DBA_WR_SYSTEM_EVENT_TNAME, + OB_DBA_WR_EVENT_NAME_TNAME, OB_DBA_OB_FORMAT_OUTLINES_TNAME, OB_PROCS_PRIV_TNAME, + OB_GV_OB_SQLSTAT_TNAME, + OB_V_OB_SQLSTAT_TNAME, + OB_DBA_WR_SQLSTAT_TNAME, + OB_GV_OB_SESS_TIME_MODEL_TNAME, + OB_V_OB_SESS_TIME_MODEL_TNAME, + OB_GV_OB_SYS_TIME_MODEL_TNAME, + OB_V_OB_SYS_TIME_MODEL_TNAME, + OB_DBA_WR_SYS_TIME_MODEL_TNAME, OB_DBA_OB_AUX_STATISTICS_TNAME, OB_DBA_INDEX_USAGE_TNAME, OB_DBA_OB_SYS_VARIABLES_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASKS_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME, + OB_DBA_WR_SQLTEXT_TNAME, + OB_GV_OB_ACTIVE_SESSION_HISTORY_TNAME, + OB_V_OB_ACTIVE_SESSION_HISTORY_TNAME, OB_ROLE_EDGES_TNAME, OB_DEFAULT_ROLES_TNAME, OB_AUDIT_LOG_FILTER_TNAME, @@ -9556,6 +9814,8 @@ const char* const tenant_space_table_names [] = { OB_ROLE_ROUTINE_GRANTS_TNAME, OB_FUNC_TNAME, OB_GV_OB_NIC_INFO_TNAME, + OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME, + OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME, OB_DBA_SCHEDULER_JOB_RUN_DETAILS_TNAME, OB_DBA_OB_TABLE_SPACE_USAGE_TNAME, OB_GV_OB_LOG_TRANSPORT_DEST_STAT_TNAME, @@ -9569,6 +9829,9 @@ const char* const tenant_space_table_names [] = { OB_INNODB_SYS_FOREIGN_COLS_TNAME, OB_GV_OB_KV_CLIENT_INFO_TNAME, OB_V_OB_KV_CLIENT_INFO_TNAME, + OB_GV_OB_RES_MGR_SYSSTAT_TNAME, + OB_V_OB_RES_MGR_SYSSTAT_TNAME, + OB_DBA_WR_SQL_PLAN_TNAME, OB_DBA_OB_SPM_EVO_RESULT_TNAME, OB_GV_OB_FUNCTION_IO_STAT_TNAME, OB_V_OB_FUNCTION_IO_STAT_TNAME, @@ -9827,9 +10090,14 @@ const char* const tenant_space_table_names [] = { OB_DBA_OB_IMPORT_TABLE_JOB_HISTORY_ORA_TNAME, OB_DBA_OB_IMPORT_TABLE_TASKS_ORA_TNAME, OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_ORA_TNAME, + OB_DBA_WR_SYSTEM_EVENT_ORA_TNAME, + OB_DBA_WR_EVENT_NAME_ORA_TNAME, OB_DBA_OB_FORMAT_OUTLINES_ORA_TNAME, + OB_DBA_WR_SQLSTAT_ORA_TNAME, + OB_DBA_WR_SYS_TIME_MODEL_ORA_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASKS_ORA_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_ORA_TNAME, + OB_DBA_WR_SQLTEXT_ORA_TNAME, OB_USER_USERS_TNAME, OB_DBA_OB_LS_REPLICA_TASK_HISTORY_ORA_TNAME, OB_DBA_MVIEW_LOGS_ORA_TNAME, @@ -10027,8 +10295,17 @@ const char* const tenant_space_table_names [] = { OB_V_OB_PL_CACHE_OBJECT_ORA_TNAME, OB_GV_OB_CGROUP_CONFIG_ORA_TNAME, OB_V_OB_CGROUP_CONFIG_ORA_TNAME, + OB_GV_OB_SQLSTAT_ORA_TNAME, + OB_V_OB_SQLSTAT_ORA_TNAME, + OB_GV_OB_SESS_TIME_MODEL_ORA_TNAME, + OB_V_OB_SESS_TIME_MODEL_ORA_TNAME, + OB_GV_OB_SYS_TIME_MODEL_ORA_TNAME, + OB_V_OB_SYS_TIME_MODEL_ORA_TNAME, + OB_V_STATNAME_ORA_TNAME, OB_DBA_OB_AUX_STATISTICS_ORA_TNAME, OB_DBA_OB_SYS_VARIABLES_ORA_TNAME, + OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME, + OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME, OB_DBA_INDEX_USAGE_ORA_TNAME, OB_GV_OB_LS_SNAPSHOTS_ORA_TNAME, OB_V_OB_LS_SNAPSHOTS_ORA_TNAME, @@ -10047,6 +10324,8 @@ const char* const tenant_space_table_names [] = { OB_GV_OB_GROUP_IO_STAT_ORA_TNAME, OB_GV_OB_NIC_INFO_ORA_TNAME, OB_V_OB_NIC_INFO_ORA_TNAME, + OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME, + OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME, OB_DBA_OB_SPATIAL_COLUMNS_ORA_TNAME, OB_DBA_OB_TABLE_SPACE_USAGE_ORA_TNAME, OB_GV_OB_LOG_TRANSPORT_DEST_STAT_ORA_TNAME, @@ -10062,6 +10341,9 @@ const char* const tenant_space_table_names [] = { OB_ALL_PLSQL_TYPE_ATTRS_TNAME, OB_DBA_PLSQL_TYPE_ATTRS_TNAME, OB_USER_PLSQL_TYPE_ATTRS_TNAME, + OB_GV_OB_RES_MGR_SYSSTAT_ORA_TNAME, + OB_V_OB_RES_MGR_SYSSTAT_ORA_TNAME, + OB_DBA_WR_SQL_PLAN_ORA_TNAME, OB_DBA_OB_SPM_EVO_RESULT_ORA_TNAME, OB_GV_OB_FUNCTION_IO_STAT_ORA_TNAME, OB_V_OB_FUNCTION_IO_STAT_ORA_TNAME, @@ -10516,8 +10798,11 @@ const char* const tenant_space_table_names [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_AUX_LOB_META_TNAME, OB_ALL_CLONE_JOB_AUX_LOB_META_TNAME, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TNAME, + OB_WR_SYSTEM_EVENT_AUX_LOB_META_TNAME, + OB_WR_EVENT_NAME_AUX_LOB_META_TNAME, OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TNAME, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME, + OB_WR_SQLSTAT_AUX_LOB_META_TNAME, OB_ALL_NCOMP_DLL_AUX_LOB_META_TNAME, OB_ALL_AUX_STAT_AUX_LOB_META_TNAME, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TNAME, @@ -10526,6 +10811,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TNAME, + OB_WR_SQLTEXT_AUX_LOB_META_TNAME, OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_META_TNAME, OB_ALL_AUDIT_LOG_USER_AUX_LOB_META_TNAME, OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TNAME, @@ -10545,6 +10831,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_PKG_TYPE_AUX_LOB_META_TNAME, OB_ALL_PKG_TYPE_ATTR_AUX_LOB_META_TNAME, OB_ALL_PKG_COLL_TYPE_AUX_LOB_META_TNAME, + OB_WR_SQL_PLAN_AUX_LOB_META_TNAME, OB_ALL_NCOMP_DLL_V2_AUX_LOB_META_TNAME, OB_ALL_TABLE_AUX_LOB_PIECE_TNAME, OB_ALL_COLUMN_AUX_LOB_PIECE_TNAME, @@ -10803,8 +11090,11 @@ const char* const tenant_space_table_names [] = { OB_ALL_TABLET_REORGANIZE_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TNAME, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TNAME, + OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TNAME, + OB_WR_EVENT_NAME_AUX_LOB_PIECE_TNAME, OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TNAME, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME, + OB_WR_SQLSTAT_AUX_LOB_PIECE_TNAME, OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TNAME, OB_ALL_AUX_STAT_AUX_LOB_PIECE_TNAME, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TNAME, @@ -10813,6 +11103,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TNAME, + OB_WR_SQLTEXT_AUX_LOB_PIECE_TNAME, OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_PIECE_TNAME, OB_ALL_AUDIT_LOG_USER_AUX_LOB_PIECE_TNAME, OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TNAME, @@ -10832,6 +11123,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_PKG_TYPE_AUX_LOB_PIECE_TNAME, OB_ALL_PKG_TYPE_ATTR_AUX_LOB_PIECE_TNAME, OB_ALL_PKG_COLL_TYPE_AUX_LOB_PIECE_TNAME, + OB_WR_SQL_PLAN_AUX_LOB_PIECE_TNAME, OB_ALL_NCOMP_DLL_V2_AUX_LOB_PIECE_TNAME, }; const uint64_t only_rs_vtables [] = { @@ -10937,6 +11229,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TID, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TID, OB_ALL_VIRTUAL_TABLET_STAT_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID, OB_ALL_VIRTUAL_LOCK_WAIT_STAT_TID, OB_ALL_VIRTUAL_TABLE_MGR_TID, OB_ALL_VIRTUAL_PX_WORKER_STAT_TID, @@ -10987,6 +11280,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TID, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TID, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TID, + OB_ALL_VIRTUAL_SQLSTAT_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_TID, OB_ALL_VIRTUAL_SESSION_PS_INFO_TID, @@ -11071,6 +11365,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID, OB_ALL_VIRTUAL_LS_INFO_ORA_TID, OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID, + OB_ALL_VIRTUAL_SQLSTAT_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TID, OB_ALL_VIRTUAL_SESSION_PS_INFO_ORA_TID, @@ -11079,9 +11374,11 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_TENANT_RESOURCE_LIMIT_DETAIL_ORA_TID, OB_ALL_VIRTUAL_GROUP_IO_STAT_ORA_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID, + OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID, OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TID, OB_ALL_VIRTUAL_SS_LOCAL_CACHE_INFO_ORA_TID, OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_ORA_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TID, OB_ALL_VIRTUAL_TEMP_FILE_ORA_TID, OB_ALL_VIRTUAL_TABLET_POINTER_STATUS_ORA_TID, }; @@ -11205,8 +11502,14 @@ const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_ORA_TID, OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TID, OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID, + OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TID, + OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TID, + OB_ALL_VIRTUAL_SQLSTAT_ORA_TID, + OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TID, + OB_TENANT_VIRTUAL_STATNAME_ORA_TID, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TID, @@ -11222,10 +11525,13 @@ const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TID, OB_ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID, + OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID, OB_ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TID, OB_ALL_VIRTUAL_SS_LOCAL_CACHE_INFO_ORA_TID, OB_ALL_VIRTUAL_VECTOR_INDEX_INFO_ORA_TID, + OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TID, + OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID, OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TID }; @@ -13629,6 +13935,22 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_clone_job_history_aux_lob_piece_schema }, + { + OB_WR_SYSTEM_EVENT_TID, + OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID, + OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID, + ObInnerTableSchema::wr_system_event_aux_lob_meta_schema, + ObInnerTableSchema::wr_system_event_aux_lob_piece_schema + }, + + { + OB_WR_EVENT_NAME_TID, + OB_WR_EVENT_NAME_AUX_LOB_META_TID, + OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID, + ObInnerTableSchema::wr_event_name_aux_lob_meta_schema, + ObInnerTableSchema::wr_event_name_aux_lob_piece_schema + }, + { OB_ALL_ROUTINE_PRIVILEGE_TID, OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID, @@ -13645,6 +13967,14 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_routine_privilege_history_aux_lob_piece_schema }, + { + OB_WR_SQLSTAT_TID, + OB_WR_SQLSTAT_AUX_LOB_META_TID, + OB_WR_SQLSTAT_AUX_LOB_PIECE_TID, + ObInnerTableSchema::wr_sqlstat_aux_lob_meta_schema, + ObInnerTableSchema::wr_sqlstat_aux_lob_piece_schema + }, + { OB_ALL_NCOMP_DLL_TID, OB_ALL_NCOMP_DLL_AUX_LOB_META_TID, @@ -13709,6 +14039,14 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_tenant_snapshot_job_aux_lob_piece_schema }, + { + OB_WR_SQLTEXT_TID, + OB_WR_SQLTEXT_AUX_LOB_META_TID, + OB_WR_SQLTEXT_AUX_LOB_PIECE_TID, + ObInnerTableSchema::wr_sqltext_aux_lob_meta_schema, + ObInnerTableSchema::wr_sqltext_aux_lob_piece_schema + }, + { OB_ALL_TRUSTED_ROOT_CERTIFICATE_TID, OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_META_TID, @@ -13869,6 +14207,14 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_pkg_coll_type_aux_lob_piece_schema }, + { + OB_WR_SQL_PLAN_TID, + OB_WR_SQL_PLAN_AUX_LOB_META_TID, + OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID, + ObInnerTableSchema::wr_sql_plan_aux_lob_meta_schema, + ObInnerTableSchema::wr_sql_plan_aux_lob_piece_schema + }, + { OB_ALL_NCOMP_DLL_V2_TID, OB_ALL_NCOMP_DLL_V2_AUX_LOB_META_TID, @@ -13914,12 +14260,12 @@ static inline int get_sys_table_lob_aux_schema(const uint64_t tid, } const int64_t OB_CORE_TABLE_COUNT = 4; -const int64_t OB_SYS_TABLE_COUNT = 310; -const int64_t OB_VIRTUAL_TABLE_COUNT = 874; -const int64_t OB_SYS_VIEW_COUNT = 987; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 2176; +const int64_t OB_SYS_TABLE_COUNT = 315; +const int64_t OB_VIRTUAL_TABLE_COUNT = 890; +const int64_t OB_SYS_VIEW_COUNT = 1030; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 2240; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 2179; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 2243; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.lob.cpp b/src/share/inner_table/ob_inner_table_schema.lob.cpp index 2d9f72925c..6efd7e8d12 100644 --- a/src/share/inner_table/ob_inner_table_schema.lob.cpp +++ b/src/share/inner_table/ob_inner_table_schema.lob.cpp @@ -21,7 +21,7 @@ inner_lob_map_t inner_lob_map; bool lob_mapping_init() { int ret = OB_SUCCESS; - if (OB_FAIL(inner_lob_map.create(313, ObModIds::OB_INNER_LOB_HASH_SET))) { + if (OB_FAIL(inner_lob_map.create(318, ObModIds::OB_INNER_LOB_HASH_SET))) { SERVER_LOG(WARN, "fail to create inner lob map", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < ARRAYSIZEOF(lob_aux_table_mappings); ++i) { diff --git a/src/share/inner_table/ob_inner_table_schema_constants.h b/src/share/inner_table/ob_inner_table_schema_constants.h index 012897bc3c..df379c8629 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -310,8 +310,11 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_TID = 483; // "__all_sto const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_TID = 484; // "__all_storage_ha_perf_diagnose_history" const uint64_t OB_ALL_CLONE_JOB_TID = 485; // "__all_clone_job" const uint64_t OB_ALL_CLONE_JOB_HISTORY_TID = 486; // "__all_clone_job_history" +const uint64_t OB_WR_SYSTEM_EVENT_TID = 487; // "__wr_system_event" +const uint64_t OB_WR_EVENT_NAME_TID = 488; // "__wr_event_name" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_TID = 490; // "__all_routine_privilege" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID = 491; // "__all_routine_privilege_history" +const uint64_t OB_WR_SQLSTAT_TID = 492; // "__wr_sqlstat" const uint64_t OB_ALL_NCOMP_DLL_TID = 493; // "__all_ncomp_dll" const uint64_t OB_ALL_AUX_STAT_TID = 494; // "__all_aux_stat" const uint64_t OB_ALL_INDEX_USAGE_INFO_TID = 495; // "__all_index_usage_info" @@ -320,6 +323,7 @@ const uint64_t OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_TID = 497; // "__all_client_ const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_TID = 498; // "__all_transfer_partition_task" const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TID = 499; // "__all_transfer_partition_task_history" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_TID = 500; // "__all_tenant_snapshot_job" +const uint64_t OB_WR_SQLTEXT_TID = 501; // "__wr_sqltext" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_TID = 502; // "__all_trusted_root_certificate" const uint64_t OB_ALL_AUDIT_LOG_FILTER_TID = 503; // "__all_audit_log_filter" const uint64_t OB_ALL_AUDIT_LOG_USER_TID = 504; // "__all_audit_log_user" @@ -340,6 +344,7 @@ const uint64_t OB_ALL_SPM_EVO_RESULT_TID = 520; // "__all_spm_evo_result" const uint64_t OB_ALL_PKG_TYPE_TID = 522; // "__all_pkg_type" const uint64_t OB_ALL_PKG_TYPE_ATTR_TID = 523; // "__all_pkg_type_attr" const uint64_t OB_ALL_PKG_COLL_TYPE_TID = 524; // "__all_pkg_coll_type" +const uint64_t OB_WR_SQL_PLAN_TID = 525; // "__wr_sql_plan" const uint64_t OB_ALL_NCOMP_DLL_V2_TID = 528; // "__all_ncomp_dll_v2" const uint64_t OB_TENANT_VIRTUAL_ALL_TABLE_TID = 10001; // "__tenant_virtual_all_table" const uint64_t OB_TENANT_VIRTUAL_TABLE_COLUMN_TID = 10002; // "__tenant_virtual_table_column" @@ -432,6 +437,7 @@ const uint64_t OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TID = 11116; // "_ const uint64_t OB_ALL_VIRTUAL_TABLET_STAT_TID = 11117; // "__all_virtual_tablet_stat" const uint64_t OB_ALL_VIRTUAL_DDL_SIM_POINT_TID = 11118; // "__all_virtual_ddl_sim_point" const uint64_t OB_ALL_VIRTUAL_DDL_SIM_POINT_STAT_TID = 11119; // "__all_virtual_ddl_sim_point_stat" +const uint64_t OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TID = 11120; // "__all_virtual_res_mgr_sysstat" const uint64_t OB_SESSION_VARIABLES_TID = 12001; // "SESSION_VARIABLES" const uint64_t OB_GLOBAL_STATUS_TID = 12006; // "GLOBAL_STATUS" const uint64_t OB_SESSION_STATUS_TID = 12008; // "SESSION_STATUS" @@ -768,9 +774,13 @@ const uint64_t OB_ALL_VIRTUAL_CLONE_JOB_HISTORY_TID = 12436; // "__all_virtual_c const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TID = 12437; // "__all_virtual_checkpoint_diagnose_memtable_info" const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TID = 12438; // "__all_virtual_checkpoint_diagnose_checkpoint_unit_info" const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TID = 12439; // "__all_virtual_checkpoint_diagnose_info" +const uint64_t OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID = 12440; // "__all_virtual_wr_system_event" +const uint64_t OB_ALL_VIRTUAL_WR_EVENT_NAME_TID = 12441; // "__all_virtual_wr_event_name" const uint64_t OB_ALL_VIRTUAL_TENANT_SCHEDULER_RUNNING_JOB_TID = 12442; // "__all_virtual_tenant_scheduler_running_job" const uint64_t OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TID = 12443; // "__all_virtual_routine_privilege" const uint64_t OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TID = 12444; // "__all_virtual_routine_privilege_history" +const uint64_t OB_ALL_VIRTUAL_SQLSTAT_TID = 12445; // "__all_virtual_sqlstat" +const uint64_t OB_ALL_VIRTUAL_WR_SQLSTAT_TID = 12446; // "__all_virtual_wr_sqlstat" const uint64_t OB_ALL_VIRTUAL_AUX_STAT_TID = 12447; // "__all_virtual_aux_stat" const uint64_t OB_ALL_VIRTUAL_DETECT_LOCK_INFO_TID = 12448; // "__all_virtual_detect_lock_info" const uint64_t OB_ALL_VIRTUAL_CLIENT_TO_SERVER_SESSION_INFO_TID = 12449; // "__all_virtual_client_to_server_session_info" @@ -778,6 +788,7 @@ const uint64_t OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TID = 12450; // "__all_ const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_TID = 12451; // "__all_virtual_transfer_partition_task" const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_TID = 12452; // "__all_virtual_transfer_partition_task_history" const uint64_t OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TID = 12453; // "__all_virtual_tenant_snapshot_job" +const uint64_t OB_ALL_VIRTUAL_WR_SQLTEXT_TID = 12454; // "__all_virtual_wr_sqltext" const uint64_t OB_ALL_VIRTUAL_DBMS_LOCK_ALLOCATED_TID = 12456; // "__all_virtual_dbms_lock_allocated" const uint64_t OB_ALL_VIRTUAL_SHARED_STORAGE_COMPACTION_INFO_TID = 12457; // "__all_virtual_shared_storage_compaction_info" const uint64_t OB_ALL_VIRTUAL_LS_SNAPSHOT_TID = 12458; // "__all_virtual_ls_snapshot" @@ -818,6 +829,7 @@ const uint64_t OB_ALL_VIRTUAL_PKG_TYPE_TID = 12497; // "__all_virtual_pkg_type" const uint64_t OB_ALL_VIRTUAL_PKG_TYPE_ATTR_TID = 12498; // "__all_virtual_pkg_type_attr" const uint64_t OB_ALL_VIRTUAL_PKG_COLL_TYPE_TID = 12499; // "__all_virtual_pkg_coll_type" const uint64_t OB_ALL_VIRTUAL_KV_CLIENT_INFO_TID = 12500; // "__all_virtual_kv_client_info" +const uint64_t OB_ALL_VIRTUAL_WR_SQL_PLAN_TID = 12501; // "__all_virtual_wr_sql_plan" const uint64_t OB_ALL_VIRTUAL_FUNCTION_IO_STAT_TID = 12504; // "__all_virtual_function_io_stat" const uint64_t OB_ALL_VIRTUAL_TEMP_FILE_TID = 12505; // "__all_virtual_temp_file" const uint64_t OB_ALL_VIRTUAL_NCOMP_DLL_V2_TID = 12506; // "__all_virtual_ncomp_dll_v2" @@ -1079,11 +1091,17 @@ const uint64_t OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_ORA_TID = 15411; // "ALL_VIRTUAL const uint64_t OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TID = 15412; // "ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA" const uint64_t OB_ALL_VIRTUAL_LS_INFO_ORA_TID = 15414; // "ALL_VIRTUAL_LS_INFO_ORA" const uint64_t OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID = 15418; // "ALL_VIRTUAL_CGROUP_CONFIG_ORA" +const uint64_t OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TID = 15421; // "ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA" +const uint64_t OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TID = 15422; // "ALL_VIRTUAL_WR_EVENT_NAME_ORA" +const uint64_t OB_ALL_VIRTUAL_SQLSTAT_ORA_TID = 15424; // "ALL_VIRTUAL_SQLSTAT_ORA" +const uint64_t OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TID = 15425; // "ALL_VIRTUAL_WR_SQLSTAT_ORA" +const uint64_t OB_TENANT_VIRTUAL_STATNAME_ORA_TID = 15426; // "TENANT_VIRTUAL_STATNAME_ORA" const uint64_t OB_ALL_VIRTUAL_AUX_STAT_REAL_AGENT_ORA_TID = 15427; // "ALL_VIRTUAL_AUX_STAT_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT_ORA_TID = 15428; // "ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TID = 15429; // "ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA" const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TID = 15430; // "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID = 15431; // "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA" +const uint64_t OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TID = 15432; // "ALL_VIRTUAL_WR_SQLTEXT_ORA" const uint64_t OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID = 15439; // "ALL_VIRTUAL_LS_SNAPSHOT_ORA" const uint64_t OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID = 15440; // "ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TID = 15441; // "ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA" @@ -1099,6 +1117,7 @@ const uint64_t OB_ALL_VIRTUAL_GROUP_IO_STAT_ORA_TID = 15452; // "ALL_VIRTUAL_GRO const uint64_t OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TID = 15454; // "ALL_VIRTUAL_STORAGE_IO_USAGE_ORA" const uint64_t OB_ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT_TID = 15455; // "ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT" const uint64_t OB_ALL_VIRTUAL_NIC_INFO_ORA_TID = 15456; // "ALL_VIRTUAL_NIC_INFO_ORA" +const uint64_t OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TID = 15457; // "ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA" const uint64_t OB_ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT_ORA_TID = 15458; // "ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA_TID = 15459; // "ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TID = 15461; // "ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA" @@ -1111,6 +1130,8 @@ const uint64_t OB_ALL_VIRTUAL_PKG_COLL_TYPE_SYS_AGENT_TID = 15470; // "ALL_VIRTU const uint64_t OB_ALL_VIRTUAL_PKG_TYPE_REAL_AGENT_ORA_TID = 15471; // "ALL_VIRTUAL_PKG_TYPE_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT_ORA_TID = 15472; // "ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT_ORA_TID = 15473; // "ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT_ORA" +const uint64_t OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TID = 15481; // "ALL_VIRTUAL_WR_SQL_PLAN_ORA" +const uint64_t OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TID = 15482; // "ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA" const uint64_t OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TID = 15484; // "ALL_VIRTUAL_FUNCTION_IO_STAT_ORA" const uint64_t OB_ALL_VIRTUAL_TEMP_FILE_ORA_TID = 15485; // "ALL_VIRTUAL_TEMP_FILE_ORA" const uint64_t OB_ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT_ORA_TID = 15486; // "ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT_ORA" @@ -1499,8 +1520,22 @@ const uint64_t OB_GV_OB_TENANT_RUNTIME_INFO_TID = 21477; // "GV$OB_TENANT_RUNTIM const uint64_t OB_V_OB_TENANT_RUNTIME_INFO_TID = 21478; // "V$OB_TENANT_RUNTIME_INFO" const uint64_t OB_GV_OB_CGROUP_CONFIG_TID = 21479; // "GV$OB_CGROUP_CONFIG" const uint64_t OB_V_OB_CGROUP_CONFIG_TID = 21480; // "V$OB_CGROUP_CONFIG" +const uint64_t OB_DBA_WR_SYSTEM_EVENT_TID = 21481; // "DBA_WR_SYSTEM_EVENT" +const uint64_t OB_CDB_WR_SYSTEM_EVENT_TID = 21482; // "CDB_WR_SYSTEM_EVENT" +const uint64_t OB_DBA_WR_EVENT_NAME_TID = 21483; // "DBA_WR_EVENT_NAME" +const uint64_t OB_CDB_WR_EVENT_NAME_TID = 21484; // "CDB_WR_EVENT_NAME" const uint64_t OB_DBA_OB_FORMAT_OUTLINES_TID = 21485; // "DBA_OB_FORMAT_OUTLINES" const uint64_t OB_PROCS_PRIV_TID = 21486; // "procs_priv" +const uint64_t OB_GV_OB_SQLSTAT_TID = 21487; // "GV$OB_SQLSTAT" +const uint64_t OB_V_OB_SQLSTAT_TID = 21488; // "V$OB_SQLSTAT" +const uint64_t OB_DBA_WR_SQLSTAT_TID = 21489; // "DBA_WR_SQLSTAT" +const uint64_t OB_CDB_WR_SQLSTAT_TID = 21490; // "CDB_WR_SQLSTAT" +const uint64_t OB_GV_OB_SESS_TIME_MODEL_TID = 21491; // "GV$OB_SESS_TIME_MODEL" +const uint64_t OB_V_OB_SESS_TIME_MODEL_TID = 21492; // "V$OB_SESS_TIME_MODEL" +const uint64_t OB_GV_OB_SYS_TIME_MODEL_TID = 21493; // "GV$OB_SYS_TIME_MODEL" +const uint64_t OB_V_OB_SYS_TIME_MODEL_TID = 21494; // "V$OB_SYS_TIME_MODEL" +const uint64_t OB_DBA_WR_SYS_TIME_MODEL_TID = 21495; // "DBA_WR_SYS_TIME_MODEL" +const uint64_t OB_CDB_WR_SYS_TIME_MODEL_TID = 21496; // "CDB_WR_SYS_TIME_MODEL" const uint64_t OB_DBA_OB_AUX_STATISTICS_TID = 21497; // "DBA_OB_AUX_STATISTICS" const uint64_t OB_CDB_OB_AUX_STATISTICS_TID = 21498; // "CDB_OB_AUX_STATISTICS" const uint64_t OB_DBA_INDEX_USAGE_TID = 21499; // "DBA_INDEX_USAGE" @@ -1509,6 +1544,10 @@ const uint64_t OB_DBA_OB_TRANSFER_PARTITION_TASKS_TID = 21501; // "DBA_OB_TRANSF const uint64_t OB_CDB_OB_TRANSFER_PARTITION_TASKS_TID = 21502; // "CDB_OB_TRANSFER_PARTITION_TASKS" const uint64_t OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TID = 21503; // "DBA_OB_TRANSFER_PARTITION_TASK_HISTORY" const uint64_t OB_CDB_OB_TRANSFER_PARTITION_TASK_HISTORY_TID = 21504; // "CDB_OB_TRANSFER_PARTITION_TASK_HISTORY" +const uint64_t OB_DBA_WR_SQLTEXT_TID = 21505; // "DBA_WR_SQLTEXT" +const uint64_t OB_CDB_WR_SQLTEXT_TID = 21506; // "CDB_WR_SQLTEXT" +const uint64_t OB_GV_OB_ACTIVE_SESSION_HISTORY_TID = 21507; // "GV$OB_ACTIVE_SESSION_HISTORY" +const uint64_t OB_V_OB_ACTIVE_SESSION_HISTORY_TID = 21508; // "V$OB_ACTIVE_SESSION_HISTORY" const uint64_t OB_DBA_OB_TRUSTED_ROOT_CERTIFICATE_TID = 21509; // "DBA_OB_TRUSTED_ROOT_CERTIFICATE" const uint64_t OB_DBA_OB_CLONE_PROGRESS_TID = 21510; // "DBA_OB_CLONE_PROGRESS" const uint64_t OB_ROLE_EDGES_TID = 21511; // "role_edges" @@ -1586,6 +1625,8 @@ const uint64_t OB_ROLE_COLUMN_GRANTS_TID = 21583; // "ROLE_COLUMN_GRANTS" const uint64_t OB_ROLE_ROUTINE_GRANTS_TID = 21584; // "ROLE_ROUTINE_GRANTS" const uint64_t OB_FUNC_TID = 21585; // "func" const uint64_t OB_GV_OB_NIC_INFO_TID = 21586; // "GV$OB_NIC_INFO" +const uint64_t OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID = 21587; // "GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM" +const uint64_t OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TID = 21588; // "V$OB_QUERY_RESPONSE_TIME_HISTOGRAM" const uint64_t OB_DBA_SCHEDULER_JOB_RUN_DETAILS_TID = 21589; // "DBA_SCHEDULER_JOB_RUN_DETAILS" const uint64_t OB_CDB_SCHEDULER_JOB_RUN_DETAILS_TID = 21590; // "CDB_SCHEDULER_JOB_RUN_DETAILS" const uint64_t OB_CDB_OB_SERVER_SPACE_USAGE_TID = 21592; // "CDB_OB_SERVER_SPACE_USAGE" @@ -1603,6 +1644,10 @@ const uint64_t OB_INNODB_SYS_FOREIGN_TID = 21604; // "INNODB_SYS_FOREIGN" const uint64_t OB_INNODB_SYS_FOREIGN_COLS_TID = 21605; // "INNODB_SYS_FOREIGN_COLS" const uint64_t OB_GV_OB_KV_CLIENT_INFO_TID = 21607; // "GV$OB_KV_CLIENT_INFO" const uint64_t OB_V_OB_KV_CLIENT_INFO_TID = 21608; // "V$OB_KV_CLIENT_INFO" +const uint64_t OB_GV_OB_RES_MGR_SYSSTAT_TID = 21610; // "GV$OB_RES_MGR_SYSSTAT" +const uint64_t OB_V_OB_RES_MGR_SYSSTAT_TID = 21611; // "V$OB_RES_MGR_SYSSTAT" +const uint64_t OB_DBA_WR_SQL_PLAN_TID = 21612; // "DBA_WR_SQL_PLAN" +const uint64_t OB_CDB_WR_SQL_PLAN_TID = 21613; // "CDB_WR_SQL_PLAN" const uint64_t OB_DBA_OB_SPM_EVO_RESULT_TID = 21616; // "DBA_OB_SPM_EVO_RESULT" const uint64_t OB_CDB_OB_SPM_EVO_RESULT_TID = 21617; // "CDB_OB_SPM_EVO_RESULT" const uint64_t OB_GV_OB_FUNCTION_IO_STAT_TID = 21620; // "GV$OB_FUNCTION_IO_STAT" @@ -1863,9 +1908,14 @@ const uint64_t OB_DBA_OB_IMPORT_TABLE_JOBS_ORA_TID = 25264; // "DBA_OB_IMPORT_TA const uint64_t OB_DBA_OB_IMPORT_TABLE_JOB_HISTORY_ORA_TID = 25265; // "DBA_OB_IMPORT_TABLE_JOB_HISTORY_ORA" const uint64_t OB_DBA_OB_IMPORT_TABLE_TASKS_ORA_TID = 25266; // "DBA_OB_IMPORT_TABLE_TASKS_ORA" const uint64_t OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_ORA_TID = 25267; // "DBA_OB_IMPORT_TABLE_TASK_HISTORY_ORA" +const uint64_t OB_DBA_WR_SYSTEM_EVENT_ORA_TID = 25269; // "DBA_WR_SYSTEM_EVENT_ORA" +const uint64_t OB_DBA_WR_EVENT_NAME_ORA_TID = 25270; // "DBA_WR_EVENT_NAME_ORA" const uint64_t OB_DBA_OB_FORMAT_OUTLINES_ORA_TID = 25272; // "DBA_OB_FORMAT_OUTLINES_ORA" +const uint64_t OB_DBA_WR_SQLSTAT_ORA_TID = 25273; // "DBA_WR_SQLSTAT_ORA" +const uint64_t OB_DBA_WR_SYS_TIME_MODEL_ORA_TID = 25274; // "DBA_WR_SYS_TIME_MODEL_ORA" const uint64_t OB_DBA_OB_TRANSFER_PARTITION_TASKS_ORA_TID = 25275; // "DBA_OB_TRANSFER_PARTITION_TASKS_ORA" const uint64_t OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_ORA_TID = 25276; // "DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_ORA" +const uint64_t OB_DBA_WR_SQLTEXT_ORA_TID = 25277; // "DBA_WR_SQLTEXT_ORA" const uint64_t OB_USER_USERS_TID = 25278; // "USER_USERS" const uint64_t OB_DBA_OB_LS_REPLICA_TASK_HISTORY_ORA_TID = 25279; // "DBA_OB_LS_REPLICA_TASK_HISTORY_ORA" const uint64_t OB_DBA_MVIEW_LOGS_ORA_TID = 25283; // "DBA_MVIEW_LOGS_ORA" @@ -2063,8 +2113,17 @@ const uint64_t OB_GV_OB_PL_CACHE_OBJECT_ORA_TID = 28198; // "GV$OB_PL_CACHE_OBJE const uint64_t OB_V_OB_PL_CACHE_OBJECT_ORA_TID = 28199; // "V$OB_PL_CACHE_OBJECT_ORA" const uint64_t OB_GV_OB_CGROUP_CONFIG_ORA_TID = 28200; // "GV$OB_CGROUP_CONFIG_ORA" const uint64_t OB_V_OB_CGROUP_CONFIG_ORA_TID = 28201; // "V$OB_CGROUP_CONFIG_ORA" +const uint64_t OB_GV_OB_SQLSTAT_ORA_TID = 28203; // "GV$OB_SQLSTAT_ORA" +const uint64_t OB_V_OB_SQLSTAT_ORA_TID = 28204; // "V$OB_SQLSTAT_ORA" +const uint64_t OB_GV_OB_SESS_TIME_MODEL_ORA_TID = 28205; // "GV$OB_SESS_TIME_MODEL_ORA" +const uint64_t OB_V_OB_SESS_TIME_MODEL_ORA_TID = 28206; // "V$OB_SESS_TIME_MODEL_ORA" +const uint64_t OB_GV_OB_SYS_TIME_MODEL_ORA_TID = 28207; // "GV$OB_SYS_TIME_MODEL_ORA" +const uint64_t OB_V_OB_SYS_TIME_MODEL_ORA_TID = 28208; // "V$OB_SYS_TIME_MODEL_ORA" +const uint64_t OB_V_STATNAME_ORA_TID = 28209; // "V$STATNAME_ORA" const uint64_t OB_DBA_OB_AUX_STATISTICS_ORA_TID = 28210; // "DBA_OB_AUX_STATISTICS_ORA" const uint64_t OB_DBA_OB_SYS_VARIABLES_ORA_TID = 28211; // "DBA_OB_SYS_VARIABLES_ORA" +const uint64_t OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TID = 28212; // "GV$OB_ACTIVE_SESSION_HISTORY_ORA" +const uint64_t OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TID = 28213; // "V$OB_ACTIVE_SESSION_HISTORY_ORA" const uint64_t OB_DBA_INDEX_USAGE_ORA_TID = 28214; // "DBA_INDEX_USAGE_ORA" const uint64_t OB_GV_OB_LS_SNAPSHOTS_ORA_TID = 28215; // "GV$OB_LS_SNAPSHOTS_ORA" const uint64_t OB_V_OB_LS_SNAPSHOTS_ORA_TID = 28216; // "V$OB_LS_SNAPSHOTS_ORA" @@ -2083,6 +2142,8 @@ const uint64_t OB_V_OB_GROUP_IO_STAT_ORA_TID = 28228; // "V$OB_GROUP_IO_STAT_ORA const uint64_t OB_GV_OB_GROUP_IO_STAT_ORA_TID = 28229; // "GV$OB_GROUP_IO_STAT_ORA" const uint64_t OB_GV_OB_NIC_INFO_ORA_TID = 28230; // "GV$OB_NIC_INFO_ORA" const uint64_t OB_V_OB_NIC_INFO_ORA_TID = 28231; // "V$OB_NIC_INFO_ORA" +const uint64_t OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID = 28232; // "GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA" +const uint64_t OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TID = 28233; // "V$OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA" const uint64_t OB_DBA_OB_SPATIAL_COLUMNS_ORA_TID = 28234; // "DBA_OB_SPATIAL_COLUMNS_ORA" const uint64_t OB_DBA_OB_TABLE_SPACE_USAGE_ORA_TID = 28237; // "DBA_OB_TABLE_SPACE_USAGE_ORA" const uint64_t OB_GV_OB_LOG_TRANSPORT_DEST_STAT_ORA_TID = 28238; // "GV$OB_LOG_TRANSPORT_DEST_STAT_ORA" @@ -2098,6 +2159,9 @@ const uint64_t OB_USER_PLSQL_COLL_TYPES_TID = 28249; // "USER_PLSQL_COLL_TYPES" const uint64_t OB_ALL_PLSQL_TYPE_ATTRS_TID = 28250; // "ALL_PLSQL_TYPE_ATTRS" const uint64_t OB_DBA_PLSQL_TYPE_ATTRS_TID = 28251; // "DBA_PLSQL_TYPE_ATTRS" const uint64_t OB_USER_PLSQL_TYPE_ATTRS_TID = 28252; // "USER_PLSQL_TYPE_ATTRS" +const uint64_t OB_GV_OB_RES_MGR_SYSSTAT_ORA_TID = 28257; // "GV$OB_RES_MGR_SYSSTAT_ORA" +const uint64_t OB_V_OB_RES_MGR_SYSSTAT_ORA_TID = 28258; // "V$OB_RES_MGR_SYSSTAT_ORA" +const uint64_t OB_DBA_WR_SQL_PLAN_ORA_TID = 28259; // "DBA_WR_SQL_PLAN_ORA" const uint64_t OB_DBA_OB_SPM_EVO_RESULT_ORA_TID = 28261; // "DBA_OB_SPM_EVO_RESULT_ORA" const uint64_t OB_GV_OB_FUNCTION_IO_STAT_ORA_TID = 28262; // "GV$OB_FUNCTION_IO_STAT_ORA" const uint64_t OB_V_OB_FUNCTION_IO_STAT_ORA_TID = 28263; // "V$OB_FUNCTION_IO_STAT_ORA" @@ -2384,8 +2448,11 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_META_TID = 50483 const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_META_TID = 50484; // "__all_storage_ha_perf_diagnose_history_aux_lob_meta" const uint64_t OB_ALL_CLONE_JOB_AUX_LOB_META_TID = 50485; // "__all_clone_job_aux_lob_meta" const uint64_t OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TID = 50486; // "__all_clone_job_history_aux_lob_meta" +const uint64_t OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID = 50487; // "__wr_system_event_aux_lob_meta" +const uint64_t OB_WR_EVENT_NAME_AUX_LOB_META_TID = 50488; // "__wr_event_name_aux_lob_meta" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID = 50490; // "__all_routine_privilege_aux_lob_meta" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID = 50491; // "__all_routine_privilege_history_aux_lob_meta" +const uint64_t OB_WR_SQLSTAT_AUX_LOB_META_TID = 50492; // "__wr_sqlstat_aux_lob_meta" const uint64_t OB_ALL_NCOMP_DLL_AUX_LOB_META_TID = 50493; // "__all_ncomp_dll_aux_lob_meta" const uint64_t OB_ALL_AUX_STAT_AUX_LOB_META_TID = 50494; // "__all_aux_stat_aux_lob_meta" const uint64_t OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TID = 50495; // "__all_index_usage_info_aux_lob_meta" @@ -2394,6 +2461,7 @@ const uint64_t OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_AUX_LOB_META_TID = 50497; // const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TID = 50498; // "__all_transfer_partition_task_aux_lob_meta" const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TID = 50499; // "__all_transfer_partition_task_history_aux_lob_meta" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TID = 50500; // "__all_tenant_snapshot_job_aux_lob_meta" +const uint64_t OB_WR_SQLTEXT_AUX_LOB_META_TID = 50501; // "__wr_sqltext_aux_lob_meta" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_META_TID = 50502; // "__all_trusted_root_certificate_aux_lob_meta" const uint64_t OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_META_TID = 50503; // "__all_audit_log_filter_aux_lob_meta" const uint64_t OB_ALL_AUDIT_LOG_USER_AUX_LOB_META_TID = 50504; // "__all_audit_log_user_aux_lob_meta" @@ -2414,6 +2482,7 @@ const uint64_t OB_ALL_SPM_EVO_RESULT_AUX_LOB_META_TID = 50520; // "__all_spm_evo const uint64_t OB_ALL_PKG_TYPE_AUX_LOB_META_TID = 50522; // "__all_pkg_type_aux_lob_meta" const uint64_t OB_ALL_PKG_TYPE_ATTR_AUX_LOB_META_TID = 50523; // "__all_pkg_type_attr_aux_lob_meta" const uint64_t OB_ALL_PKG_COLL_TYPE_AUX_LOB_META_TID = 50524; // "__all_pkg_coll_type_aux_lob_meta" +const uint64_t OB_WR_SQL_PLAN_AUX_LOB_META_TID = 50525; // "__wr_sql_plan_aux_lob_meta" const uint64_t OB_ALL_NCOMP_DLL_V2_AUX_LOB_META_TID = 50528; // "__all_ncomp_dll_v2_aux_lob_meta" const uint64_t OB_ALL_TABLE_AUX_LOB_PIECE_TID = 60003; // "__all_table_aux_lob_piece" const uint64_t OB_ALL_COLUMN_AUX_LOB_PIECE_TID = 60004; // "__all_column_aux_lob_piece" @@ -2697,8 +2766,11 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TID = 6048 const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TID = 60484; // "__all_storage_ha_perf_diagnose_history_aux_lob_piece" const uint64_t OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TID = 60485; // "__all_clone_job_aux_lob_piece" const uint64_t OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TID = 60486; // "__all_clone_job_history_aux_lob_piece" +const uint64_t OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID = 60487; // "__wr_system_event_aux_lob_piece" +const uint64_t OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID = 60488; // "__wr_event_name_aux_lob_piece" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID = 60490; // "__all_routine_privilege_aux_lob_piece" const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID = 60491; // "__all_routine_privilege_history_aux_lob_piece" +const uint64_t OB_WR_SQLSTAT_AUX_LOB_PIECE_TID = 60492; // "__wr_sqlstat_aux_lob_piece" const uint64_t OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TID = 60493; // "__all_ncomp_dll_aux_lob_piece" const uint64_t OB_ALL_AUX_STAT_AUX_LOB_PIECE_TID = 60494; // "__all_aux_stat_aux_lob_piece" const uint64_t OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TID = 60495; // "__all_index_usage_info_aux_lob_piece" @@ -2707,6 +2779,7 @@ const uint64_t OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_AUX_LOB_PIECE_TID = 60497; / const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TID = 60498; // "__all_transfer_partition_task_aux_lob_piece" const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TID = 60499; // "__all_transfer_partition_task_history_aux_lob_piece" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TID = 60500; // "__all_tenant_snapshot_job_aux_lob_piece" +const uint64_t OB_WR_SQLTEXT_AUX_LOB_PIECE_TID = 60501; // "__wr_sqltext_aux_lob_piece" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_PIECE_TID = 60502; // "__all_trusted_root_certificate_aux_lob_piece" const uint64_t OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_PIECE_TID = 60503; // "__all_audit_log_filter_aux_lob_piece" const uint64_t OB_ALL_AUDIT_LOG_USER_AUX_LOB_PIECE_TID = 60504; // "__all_audit_log_user_aux_lob_piece" @@ -2727,6 +2800,7 @@ const uint64_t OB_ALL_SPM_EVO_RESULT_AUX_LOB_PIECE_TID = 60520; // "__all_spm_ev const uint64_t OB_ALL_PKG_TYPE_AUX_LOB_PIECE_TID = 60522; // "__all_pkg_type_aux_lob_piece" const uint64_t OB_ALL_PKG_TYPE_ATTR_AUX_LOB_PIECE_TID = 60523; // "__all_pkg_type_attr_aux_lob_piece" const uint64_t OB_ALL_PKG_COLL_TYPE_AUX_LOB_PIECE_TID = 60524; // "__all_pkg_coll_type_aux_lob_piece" +const uint64_t OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID = 60525; // "__wr_sql_plan_aux_lob_piece" const uint64_t OB_ALL_NCOMP_DLL_V2_AUX_LOB_PIECE_TID = 60528; // "__all_ncomp_dll_v2_aux_lob_piece" const uint64_t OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TID = 14999; // "__all_virtual_plan_cache_stat" const uint64_t OB_ALL_VIRTUAL_SESSION_EVENT_ALL_VIRTUAL_SESSION_EVENT_I1_TID = 14998; // "__all_virtual_session_event" @@ -3230,8 +3304,11 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_TNAME = "__all_storag const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_TNAME = "__all_storage_ha_perf_diagnose_history"; const char *const OB_ALL_CLONE_JOB_TNAME = "__all_clone_job"; const char *const OB_ALL_CLONE_JOB_HISTORY_TNAME = "__all_clone_job_history"; +const char *const OB_WR_SYSTEM_EVENT_TNAME = "__wr_system_event"; +const char *const OB_WR_EVENT_NAME_TNAME = "__wr_event_name"; const char *const OB_ALL_ROUTINE_PRIVILEGE_TNAME = "__all_routine_privilege"; const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME = "__all_routine_privilege_history"; +const char *const OB_WR_SQLSTAT_TNAME = "__wr_sqlstat"; const char *const OB_ALL_NCOMP_DLL_TNAME = "__all_ncomp_dll"; const char *const OB_ALL_AUX_STAT_TNAME = "__all_aux_stat"; const char *const OB_ALL_INDEX_USAGE_INFO_TNAME = "__all_index_usage_info"; @@ -3240,6 +3317,7 @@ const char *const OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_TNAME = "__all_client_to_ const char *const OB_ALL_TRANSFER_PARTITION_TASK_TNAME = "__all_transfer_partition_task"; const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "__all_transfer_partition_task_history"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_TNAME = "__all_tenant_snapshot_job"; +const char *const OB_WR_SQLTEXT_TNAME = "__wr_sqltext"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_TNAME = "__all_trusted_root_certificate"; const char *const OB_ALL_AUDIT_LOG_FILTER_TNAME = "__all_audit_log_filter"; const char *const OB_ALL_AUDIT_LOG_USER_TNAME = "__all_audit_log_user"; @@ -3260,6 +3338,7 @@ const char *const OB_ALL_SPM_EVO_RESULT_TNAME = "__all_spm_evo_result"; const char *const OB_ALL_PKG_TYPE_TNAME = "__all_pkg_type"; const char *const OB_ALL_PKG_TYPE_ATTR_TNAME = "__all_pkg_type_attr"; const char *const OB_ALL_PKG_COLL_TYPE_TNAME = "__all_pkg_coll_type"; +const char *const OB_WR_SQL_PLAN_TNAME = "__wr_sql_plan"; const char *const OB_ALL_NCOMP_DLL_V2_TNAME = "__all_ncomp_dll_v2"; const char *const OB_TENANT_VIRTUAL_ALL_TABLE_TNAME = "__tenant_virtual_all_table"; const char *const OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME = "__tenant_virtual_table_column"; @@ -3352,6 +3431,7 @@ const char *const OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TNAME = "__all_ const char *const OB_ALL_VIRTUAL_TABLET_STAT_TNAME = "__all_virtual_tablet_stat"; const char *const OB_ALL_VIRTUAL_DDL_SIM_POINT_TNAME = "__all_virtual_ddl_sim_point"; const char *const OB_ALL_VIRTUAL_DDL_SIM_POINT_STAT_TNAME = "__all_virtual_ddl_sim_point_stat"; +const char *const OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_TNAME = "__all_virtual_res_mgr_sysstat"; const char *const OB_SESSION_VARIABLES_TNAME = "SESSION_VARIABLES"; const char *const OB_GLOBAL_STATUS_TNAME = "GLOBAL_STATUS"; const char *const OB_SESSION_STATUS_TNAME = "SESSION_STATUS"; @@ -3688,9 +3768,13 @@ const char *const OB_ALL_VIRTUAL_CLONE_JOB_HISTORY_TNAME = "__all_virtual_clone_ const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TNAME = "__all_virtual_checkpoint_diagnose_memtable_info"; const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TNAME = "__all_virtual_checkpoint_diagnose_checkpoint_unit_info"; const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TNAME = "__all_virtual_checkpoint_diagnose_info"; +const char *const OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TNAME = "__all_virtual_wr_system_event"; +const char *const OB_ALL_VIRTUAL_WR_EVENT_NAME_TNAME = "__all_virtual_wr_event_name"; const char *const OB_ALL_VIRTUAL_TENANT_SCHEDULER_RUNNING_JOB_TNAME = "__all_virtual_tenant_scheduler_running_job"; const char *const OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TNAME = "__all_virtual_routine_privilege"; const char *const OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TNAME = "__all_virtual_routine_privilege_history"; +const char *const OB_ALL_VIRTUAL_SQLSTAT_TNAME = "__all_virtual_sqlstat"; +const char *const OB_ALL_VIRTUAL_WR_SQLSTAT_TNAME = "__all_virtual_wr_sqlstat"; const char *const OB_ALL_VIRTUAL_AUX_STAT_TNAME = "__all_virtual_aux_stat"; const char *const OB_ALL_VIRTUAL_DETECT_LOCK_INFO_TNAME = "__all_virtual_detect_lock_info"; const char *const OB_ALL_VIRTUAL_CLIENT_TO_SERVER_SESSION_INFO_TNAME = "__all_virtual_client_to_server_session_info"; @@ -3698,6 +3782,7 @@ const char *const OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TNAME = "__all_virtu const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_TNAME = "__all_virtual_transfer_partition_task"; const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "__all_virtual_transfer_partition_task_history"; const char *const OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TNAME = "__all_virtual_tenant_snapshot_job"; +const char *const OB_ALL_VIRTUAL_WR_SQLTEXT_TNAME = "__all_virtual_wr_sqltext"; const char *const OB_ALL_VIRTUAL_DBMS_LOCK_ALLOCATED_TNAME = "__all_virtual_dbms_lock_allocated"; const char *const OB_ALL_VIRTUAL_SHARED_STORAGE_COMPACTION_INFO_TNAME = "__all_virtual_shared_storage_compaction_info"; const char *const OB_ALL_VIRTUAL_LS_SNAPSHOT_TNAME = "__all_virtual_ls_snapshot"; @@ -3738,6 +3823,7 @@ const char *const OB_ALL_VIRTUAL_PKG_TYPE_TNAME = "__all_virtual_pkg_type"; const char *const OB_ALL_VIRTUAL_PKG_TYPE_ATTR_TNAME = "__all_virtual_pkg_type_attr"; const char *const OB_ALL_VIRTUAL_PKG_COLL_TYPE_TNAME = "__all_virtual_pkg_coll_type"; const char *const OB_ALL_VIRTUAL_KV_CLIENT_INFO_TNAME = "__all_virtual_kv_client_info"; +const char *const OB_ALL_VIRTUAL_WR_SQL_PLAN_TNAME = "__all_virtual_wr_sql_plan"; const char *const OB_ALL_VIRTUAL_FUNCTION_IO_STAT_TNAME = "__all_virtual_function_io_stat"; const char *const OB_ALL_VIRTUAL_TEMP_FILE_TNAME = "__all_virtual_temp_file"; const char *const OB_ALL_VIRTUAL_NCOMP_DLL_V2_TNAME = "__all_virtual_ncomp_dll_v2"; @@ -3999,11 +4085,17 @@ const char *const OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_ORA_TNAME = "ALL_VIRTUAL_IMPO const char *const OB_ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY_ORA_TNAME = "ALL_VIRTUAL_IMPORT_TABLE_TASK_HISTORY"; const char *const OB_ALL_VIRTUAL_LS_INFO_ORA_TNAME = "ALL_VIRTUAL_LS_INFO"; const char *const OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TNAME = "ALL_VIRTUAL_CGROUP_CONFIG"; +const char *const OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_ORA_TNAME = "ALL_VIRTUAL_WR_SYSTEM_EVENT"; +const char *const OB_ALL_VIRTUAL_WR_EVENT_NAME_ORA_TNAME = "ALL_VIRTUAL_WR_EVENT_NAME"; +const char *const OB_ALL_VIRTUAL_SQLSTAT_ORA_TNAME = "ALL_VIRTUAL_SQLSTAT"; +const char *const OB_ALL_VIRTUAL_WR_SQLSTAT_ORA_TNAME = "ALL_VIRTUAL_WR_SQLSTAT"; +const char *const OB_TENANT_VIRTUAL_STATNAME_ORA_TNAME = "TENANT_VIRTUAL_STATNAME"; const char *const OB_ALL_VIRTUAL_AUX_STAT_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_AUX_STAT_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TNAME = "ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE"; const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT"; +const char *const OB_ALL_VIRTUAL_WR_SQLTEXT_ORA_TNAME = "ALL_VIRTUAL_WR_SQLTEXT"; const char *const OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TNAME = "ALL_VIRTUAL_LS_SNAPSHOT"; const char *const OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_SHARED_STORAGE_QUOTA_ORA_TNAME = "ALL_VIRTUAL_SHARED_STORAGE_QUOTA"; @@ -4019,6 +4111,7 @@ const char *const OB_ALL_VIRTUAL_GROUP_IO_STAT_ORA_TNAME = "ALL_VIRTUAL_GROUP_IO const char *const OB_ALL_VIRTUAL_STORAGE_IO_USAGE_ORA_TNAME = "ALL_VIRTUAL_STORAGE_IO_USAGE"; const char *const OB_ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT_TNAME = "ALL_VIRTUAL_ZONE_STORAGE_SYS_AGENT"; const char *const OB_ALL_VIRTUAL_NIC_INFO_ORA_TNAME = "ALL_VIRTUAL_NIC_INFO"; +const char *const OB_ALL_VIRTUAL_QUERY_RESPONSE_TIME_ORA_TNAME = "ALL_VIRTUAL_QUERY_RESPONSE_TIME"; const char *const OB_ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT_ORA_TNAME = "ALL_VIRTUAL_LOG_TRANSPORT_DEST_STAT"; @@ -4031,6 +4124,8 @@ const char *const OB_ALL_VIRTUAL_PKG_COLL_TYPE_SYS_AGENT_TNAME = "ALL_VIRTUAL_PK const char *const OB_ALL_VIRTUAL_PKG_TYPE_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_PKG_TYPE_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_PKG_TYPE_ATTR_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT"; +const char *const OB_ALL_VIRTUAL_WR_SQL_PLAN_ORA_TNAME = "ALL_VIRTUAL_WR_SQL_PLAN"; +const char *const OB_ALL_VIRTUAL_RES_MGR_SYSSTAT_ORA_TNAME = "ALL_VIRTUAL_RES_MGR_SYSSTAT"; const char *const OB_ALL_VIRTUAL_FUNCTION_IO_STAT_ORA_TNAME = "ALL_VIRTUAL_FUNCTION_IO_STAT"; const char *const OB_ALL_VIRTUAL_TEMP_FILE_ORA_TNAME = "ALL_VIRTUAL_TEMP_FILE"; const char *const OB_ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_NCOMP_DLL_V2_REAL_AGENT"; @@ -4419,8 +4514,22 @@ const char *const OB_GV_OB_TENANT_RUNTIME_INFO_TNAME = "GV$OB_TENANT_RUNTIME_INF const char *const OB_V_OB_TENANT_RUNTIME_INFO_TNAME = "V$OB_TENANT_RUNTIME_INFO"; const char *const OB_GV_OB_CGROUP_CONFIG_TNAME = "GV$OB_CGROUP_CONFIG"; const char *const OB_V_OB_CGROUP_CONFIG_TNAME = "V$OB_CGROUP_CONFIG"; +const char *const OB_DBA_WR_SYSTEM_EVENT_TNAME = "DBA_WR_SYSTEM_EVENT"; +const char *const OB_CDB_WR_SYSTEM_EVENT_TNAME = "CDB_WR_SYSTEM_EVENT"; +const char *const OB_DBA_WR_EVENT_NAME_TNAME = "DBA_WR_EVENT_NAME"; +const char *const OB_CDB_WR_EVENT_NAME_TNAME = "CDB_WR_EVENT_NAME"; const char *const OB_DBA_OB_FORMAT_OUTLINES_TNAME = "DBA_OB_FORMAT_OUTLINES"; const char *const OB_PROCS_PRIV_TNAME = "procs_priv"; +const char *const OB_GV_OB_SQLSTAT_TNAME = "GV$OB_SQLSTAT"; +const char *const OB_V_OB_SQLSTAT_TNAME = "V$OB_SQLSTAT"; +const char *const OB_DBA_WR_SQLSTAT_TNAME = "DBA_WR_SQLSTAT"; +const char *const OB_CDB_WR_SQLSTAT_TNAME = "CDB_WR_SQLSTAT"; +const char *const OB_GV_OB_SESS_TIME_MODEL_TNAME = "GV$OB_SESS_TIME_MODEL"; +const char *const OB_V_OB_SESS_TIME_MODEL_TNAME = "V$OB_SESS_TIME_MODEL"; +const char *const OB_GV_OB_SYS_TIME_MODEL_TNAME = "GV$OB_SYS_TIME_MODEL"; +const char *const OB_V_OB_SYS_TIME_MODEL_TNAME = "V$OB_SYS_TIME_MODEL"; +const char *const OB_DBA_WR_SYS_TIME_MODEL_TNAME = "DBA_WR_SYS_TIME_MODEL"; +const char *const OB_CDB_WR_SYS_TIME_MODEL_TNAME = "CDB_WR_SYS_TIME_MODEL"; const char *const OB_DBA_OB_AUX_STATISTICS_TNAME = "DBA_OB_AUX_STATISTICS"; const char *const OB_CDB_OB_AUX_STATISTICS_TNAME = "CDB_OB_AUX_STATISTICS"; const char *const OB_DBA_INDEX_USAGE_TNAME = "DBA_INDEX_USAGE"; @@ -4429,6 +4538,10 @@ const char *const OB_DBA_OB_TRANSFER_PARTITION_TASKS_TNAME = "DBA_OB_TRANSFER_PA const char *const OB_CDB_OB_TRANSFER_PARTITION_TASKS_TNAME = "CDB_OB_TRANSFER_PARTITION_TASKS"; const char *const OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "DBA_OB_TRANSFER_PARTITION_TASK_HISTORY"; const char *const OB_CDB_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "CDB_OB_TRANSFER_PARTITION_TASK_HISTORY"; +const char *const OB_DBA_WR_SQLTEXT_TNAME = "DBA_WR_SQLTEXT"; +const char *const OB_CDB_WR_SQLTEXT_TNAME = "CDB_WR_SQLTEXT"; +const char *const OB_GV_OB_ACTIVE_SESSION_HISTORY_TNAME = "GV$OB_ACTIVE_SESSION_HISTORY"; +const char *const OB_V_OB_ACTIVE_SESSION_HISTORY_TNAME = "V$OB_ACTIVE_SESSION_HISTORY"; const char *const OB_DBA_OB_TRUSTED_ROOT_CERTIFICATE_TNAME = "DBA_OB_TRUSTED_ROOT_CERTIFICATE"; const char *const OB_DBA_OB_CLONE_PROGRESS_TNAME = "DBA_OB_CLONE_PROGRESS"; const char *const OB_ROLE_EDGES_TNAME = "role_edges"; @@ -4506,6 +4619,8 @@ const char *const OB_ROLE_COLUMN_GRANTS_TNAME = "ROLE_COLUMN_GRANTS"; const char *const OB_ROLE_ROUTINE_GRANTS_TNAME = "ROLE_ROUTINE_GRANTS"; const char *const OB_FUNC_TNAME = "func"; const char *const OB_GV_OB_NIC_INFO_TNAME = "GV$OB_NIC_INFO"; +const char *const OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME = "GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM"; +const char *const OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_TNAME = "V$OB_QUERY_RESPONSE_TIME_HISTOGRAM"; const char *const OB_DBA_SCHEDULER_JOB_RUN_DETAILS_TNAME = "DBA_SCHEDULER_JOB_RUN_DETAILS"; const char *const OB_CDB_SCHEDULER_JOB_RUN_DETAILS_TNAME = "CDB_SCHEDULER_JOB_RUN_DETAILS"; const char *const OB_CDB_OB_SERVER_SPACE_USAGE_TNAME = "CDB_OB_SERVER_SPACE_USAGE"; @@ -4523,6 +4638,10 @@ const char *const OB_INNODB_SYS_FOREIGN_TNAME = "INNODB_SYS_FOREIGN"; const char *const OB_INNODB_SYS_FOREIGN_COLS_TNAME = "INNODB_SYS_FOREIGN_COLS"; const char *const OB_GV_OB_KV_CLIENT_INFO_TNAME = "GV$OB_KV_CLIENT_INFO"; const char *const OB_V_OB_KV_CLIENT_INFO_TNAME = "V$OB_KV_CLIENT_INFO"; +const char *const OB_GV_OB_RES_MGR_SYSSTAT_TNAME = "GV$OB_RES_MGR_SYSSTAT"; +const char *const OB_V_OB_RES_MGR_SYSSTAT_TNAME = "V$OB_RES_MGR_SYSSTAT"; +const char *const OB_DBA_WR_SQL_PLAN_TNAME = "DBA_WR_SQL_PLAN"; +const char *const OB_CDB_WR_SQL_PLAN_TNAME = "CDB_WR_SQL_PLAN"; const char *const OB_DBA_OB_SPM_EVO_RESULT_TNAME = "DBA_OB_SPM_EVO_RESULT"; const char *const OB_CDB_OB_SPM_EVO_RESULT_TNAME = "CDB_OB_SPM_EVO_RESULT"; const char *const OB_GV_OB_FUNCTION_IO_STAT_TNAME = "GV$OB_FUNCTION_IO_STAT"; @@ -4783,9 +4902,14 @@ const char *const OB_DBA_OB_IMPORT_TABLE_JOBS_ORA_TNAME = "DBA_OB_IMPORT_TABLE_J const char *const OB_DBA_OB_IMPORT_TABLE_JOB_HISTORY_ORA_TNAME = "DBA_OB_IMPORT_TABLE_JOB_HISTORY"; const char *const OB_DBA_OB_IMPORT_TABLE_TASKS_ORA_TNAME = "DBA_OB_IMPORT_TABLE_TASKS"; const char *const OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_ORA_TNAME = "DBA_OB_IMPORT_TABLE_TASK_HISTORY"; +const char *const OB_DBA_WR_SYSTEM_EVENT_ORA_TNAME = "DBA_WR_SYSTEM_EVENT"; +const char *const OB_DBA_WR_EVENT_NAME_ORA_TNAME = "DBA_WR_EVENT_NAME"; const char *const OB_DBA_OB_FORMAT_OUTLINES_ORA_TNAME = "DBA_OB_FORMAT_OUTLINES"; +const char *const OB_DBA_WR_SQLSTAT_ORA_TNAME = "DBA_WR_SQLSTAT"; +const char *const OB_DBA_WR_SYS_TIME_MODEL_ORA_TNAME = "DBA_WR_SYS_TIME_MODEL"; const char *const OB_DBA_OB_TRANSFER_PARTITION_TASKS_ORA_TNAME = "DBA_OB_TRANSFER_PARTITION_TASKS"; const char *const OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_ORA_TNAME = "DBA_OB_TRANSFER_PARTITION_TASK_HISTORY"; +const char *const OB_DBA_WR_SQLTEXT_ORA_TNAME = "DBA_WR_SQLTEXT"; const char *const OB_USER_USERS_TNAME = "USER_USERS"; const char *const OB_DBA_OB_LS_REPLICA_TASK_HISTORY_ORA_TNAME = "DBA_OB_LS_REPLICA_TASK_HISTORY"; const char *const OB_DBA_MVIEW_LOGS_ORA_TNAME = "DBA_MVIEW_LOGS"; @@ -4983,8 +5107,17 @@ const char *const OB_GV_OB_PL_CACHE_OBJECT_ORA_TNAME = "GV$OB_PL_CACHE_OBJECT"; const char *const OB_V_OB_PL_CACHE_OBJECT_ORA_TNAME = "V$OB_PL_CACHE_OBJECT"; const char *const OB_GV_OB_CGROUP_CONFIG_ORA_TNAME = "GV$OB_CGROUP_CONFIG"; const char *const OB_V_OB_CGROUP_CONFIG_ORA_TNAME = "V$OB_CGROUP_CONFIG"; +const char *const OB_GV_OB_SQLSTAT_ORA_TNAME = "GV$OB_SQLSTAT"; +const char *const OB_V_OB_SQLSTAT_ORA_TNAME = "V$OB_SQLSTAT"; +const char *const OB_GV_OB_SESS_TIME_MODEL_ORA_TNAME = "GV$OB_SESS_TIME_MODEL"; +const char *const OB_V_OB_SESS_TIME_MODEL_ORA_TNAME = "V$OB_SESS_TIME_MODEL"; +const char *const OB_GV_OB_SYS_TIME_MODEL_ORA_TNAME = "GV$OB_SYS_TIME_MODEL"; +const char *const OB_V_OB_SYS_TIME_MODEL_ORA_TNAME = "V$OB_SYS_TIME_MODEL"; +const char *const OB_V_STATNAME_ORA_TNAME = "V$STATNAME"; const char *const OB_DBA_OB_AUX_STATISTICS_ORA_TNAME = "DBA_OB_AUX_STATISTICS"; const char *const OB_DBA_OB_SYS_VARIABLES_ORA_TNAME = "DBA_OB_SYS_VARIABLES"; +const char *const OB_GV_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME = "GV$OB_ACTIVE_SESSION_HISTORY"; +const char *const OB_V_OB_ACTIVE_SESSION_HISTORY_ORA_TNAME = "V$OB_ACTIVE_SESSION_HISTORY"; const char *const OB_DBA_INDEX_USAGE_ORA_TNAME = "DBA_INDEX_USAGE"; const char *const OB_GV_OB_LS_SNAPSHOTS_ORA_TNAME = "GV$OB_LS_SNAPSHOTS"; const char *const OB_V_OB_LS_SNAPSHOTS_ORA_TNAME = "V$OB_LS_SNAPSHOTS"; @@ -5003,6 +5136,8 @@ const char *const OB_V_OB_GROUP_IO_STAT_ORA_TNAME = "V$OB_GROUP_IO_STAT"; const char *const OB_GV_OB_GROUP_IO_STAT_ORA_TNAME = "GV$OB_GROUP_IO_STAT"; const char *const OB_GV_OB_NIC_INFO_ORA_TNAME = "GV$OB_NIC_INFO"; const char *const OB_V_OB_NIC_INFO_ORA_TNAME = "V$OB_NIC_INFO"; +const char *const OB_GV_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME = "GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM"; +const char *const OB_V_OB_QUERY_RESPONSE_TIME_HISTOGRAM_ORA_TNAME = "V$OB_QUERY_RESPONSE_TIME_HISTOGRAM"; const char *const OB_DBA_OB_SPATIAL_COLUMNS_ORA_TNAME = "DBA_OB_SPATIAL_COLUMNS"; const char *const OB_DBA_OB_TABLE_SPACE_USAGE_ORA_TNAME = "DBA_OB_TABLE_SPACE_USAGE"; const char *const OB_GV_OB_LOG_TRANSPORT_DEST_STAT_ORA_TNAME = "GV$OB_LOG_TRANSPORT_DEST_STAT"; @@ -5018,6 +5153,9 @@ const char *const OB_USER_PLSQL_COLL_TYPES_TNAME = "USER_PLSQL_COLL_TYPES"; const char *const OB_ALL_PLSQL_TYPE_ATTRS_TNAME = "ALL_PLSQL_TYPE_ATTRS"; const char *const OB_DBA_PLSQL_TYPE_ATTRS_TNAME = "DBA_PLSQL_TYPE_ATTRS"; const char *const OB_USER_PLSQL_TYPE_ATTRS_TNAME = "USER_PLSQL_TYPE_ATTRS"; +const char *const OB_GV_OB_RES_MGR_SYSSTAT_ORA_TNAME = "GV$OB_RES_MGR_SYSSTAT"; +const char *const OB_V_OB_RES_MGR_SYSSTAT_ORA_TNAME = "V$OB_RES_MGR_SYSSTAT"; +const char *const OB_DBA_WR_SQL_PLAN_ORA_TNAME = "DBA_WR_SQL_PLAN"; const char *const OB_DBA_OB_SPM_EVO_RESULT_ORA_TNAME = "DBA_OB_SPM_EVO_RESULT"; const char *const OB_GV_OB_FUNCTION_IO_STAT_ORA_TNAME = "GV$OB_FUNCTION_IO_STAT"; const char *const OB_V_OB_FUNCTION_IO_STAT_ORA_TNAME = "V$OB_FUNCTION_IO_STAT"; @@ -5304,8 +5442,11 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_META_TNAME = const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_META_TNAME = "__all_storage_ha_perf_diagnose_history_aux_lob_meta"; const char *const OB_ALL_CLONE_JOB_AUX_LOB_META_TNAME = "__all_clone_job_aux_lob_meta"; const char *const OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TNAME = "__all_clone_job_history_aux_lob_meta"; +const char *const OB_WR_SYSTEM_EVENT_AUX_LOB_META_TNAME = "__wr_system_event_aux_lob_meta"; +const char *const OB_WR_EVENT_NAME_AUX_LOB_META_TNAME = "__wr_event_name_aux_lob_meta"; const char *const OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TNAME = "__all_routine_privilege_aux_lob_meta"; const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME = "__all_routine_privilege_history_aux_lob_meta"; +const char *const OB_WR_SQLSTAT_AUX_LOB_META_TNAME = "__wr_sqlstat_aux_lob_meta"; const char *const OB_ALL_NCOMP_DLL_AUX_LOB_META_TNAME = "__all_ncomp_dll_aux_lob_meta"; const char *const OB_ALL_AUX_STAT_AUX_LOB_META_TNAME = "__all_aux_stat_aux_lob_meta"; const char *const OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TNAME = "__all_index_usage_info_aux_lob_meta"; @@ -5314,6 +5455,7 @@ const char *const OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_AUX_LOB_META_TNAME = "__a const char *const OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TNAME = "__all_transfer_partition_task_aux_lob_meta"; const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TNAME = "__all_transfer_partition_task_history_aux_lob_meta"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TNAME = "__all_tenant_snapshot_job_aux_lob_meta"; +const char *const OB_WR_SQLTEXT_AUX_LOB_META_TNAME = "__wr_sqltext_aux_lob_meta"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_META_TNAME = "__all_trusted_root_certificate_aux_lob_meta"; const char *const OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_META_TNAME = "__all_audit_log_filter_aux_lob_meta"; const char *const OB_ALL_AUDIT_LOG_USER_AUX_LOB_META_TNAME = "__all_audit_log_user_aux_lob_meta"; @@ -5334,6 +5476,7 @@ const char *const OB_ALL_SPM_EVO_RESULT_AUX_LOB_META_TNAME = "__all_spm_evo_resu const char *const OB_ALL_PKG_TYPE_AUX_LOB_META_TNAME = "__all_pkg_type_aux_lob_meta"; const char *const OB_ALL_PKG_TYPE_ATTR_AUX_LOB_META_TNAME = "__all_pkg_type_attr_aux_lob_meta"; const char *const OB_ALL_PKG_COLL_TYPE_AUX_LOB_META_TNAME = "__all_pkg_coll_type_aux_lob_meta"; +const char *const OB_WR_SQL_PLAN_AUX_LOB_META_TNAME = "__wr_sql_plan_aux_lob_meta"; const char *const OB_ALL_NCOMP_DLL_V2_AUX_LOB_META_TNAME = "__all_ncomp_dll_v2_aux_lob_meta"; const char *const OB_ALL_TABLE_AUX_LOB_PIECE_TNAME = "__all_table_aux_lob_piece"; const char *const OB_ALL_COLUMN_AUX_LOB_PIECE_TNAME = "__all_column_aux_lob_piece"; @@ -5617,8 +5760,11 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TNAME = const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_storage_ha_perf_diagnose_history_aux_lob_piece"; const char *const OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TNAME = "__all_clone_job_aux_lob_piece"; const char *const OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TNAME = "__all_clone_job_history_aux_lob_piece"; +const char *const OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TNAME = "__wr_system_event_aux_lob_piece"; +const char *const OB_WR_EVENT_NAME_AUX_LOB_PIECE_TNAME = "__wr_event_name_aux_lob_piece"; const char *const OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TNAME = "__all_routine_privilege_aux_lob_piece"; const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_routine_privilege_history_aux_lob_piece"; +const char *const OB_WR_SQLSTAT_AUX_LOB_PIECE_TNAME = "__wr_sqlstat_aux_lob_piece"; const char *const OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TNAME = "__all_ncomp_dll_aux_lob_piece"; const char *const OB_ALL_AUX_STAT_AUX_LOB_PIECE_TNAME = "__all_aux_stat_aux_lob_piece"; const char *const OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TNAME = "__all_index_usage_info_aux_lob_piece"; @@ -5627,6 +5773,7 @@ const char *const OB_ALL_CLIENT_TO_SERVER_SESSION_INFO_AUX_LOB_PIECE_TNAME = "__ const char *const OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TNAME = "__all_transfer_partition_task_aux_lob_piece"; const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TNAME = "__all_transfer_partition_task_history_aux_lob_piece"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TNAME = "__all_tenant_snapshot_job_aux_lob_piece"; +const char *const OB_WR_SQLTEXT_AUX_LOB_PIECE_TNAME = "__wr_sqltext_aux_lob_piece"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_PIECE_TNAME = "__all_trusted_root_certificate_aux_lob_piece"; const char *const OB_ALL_AUDIT_LOG_FILTER_AUX_LOB_PIECE_TNAME = "__all_audit_log_filter_aux_lob_piece"; const char *const OB_ALL_AUDIT_LOG_USER_AUX_LOB_PIECE_TNAME = "__all_audit_log_user_aux_lob_piece"; @@ -5647,6 +5794,7 @@ const char *const OB_ALL_SPM_EVO_RESULT_AUX_LOB_PIECE_TNAME = "__all_spm_evo_res const char *const OB_ALL_PKG_TYPE_AUX_LOB_PIECE_TNAME = "__all_pkg_type_aux_lob_piece"; const char *const OB_ALL_PKG_TYPE_ATTR_AUX_LOB_PIECE_TNAME = "__all_pkg_type_attr_aux_lob_piece"; const char *const OB_ALL_PKG_COLL_TYPE_AUX_LOB_PIECE_TNAME = "__all_pkg_coll_type_aux_lob_piece"; +const char *const OB_WR_SQL_PLAN_AUX_LOB_PIECE_TNAME = "__wr_sql_plan_aux_lob_piece"; const char *const OB_ALL_NCOMP_DLL_V2_AUX_LOB_PIECE_TNAME = "__all_ncomp_dll_v2_aux_lob_piece"; const char *const OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TNAME = "__idx_11003_all_virtual_plan_cache_stat_i1"; const char *const OB_ALL_VIRTUAL_SESSION_EVENT_ALL_VIRTUAL_SESSION_EVENT_I1_TNAME = "__idx_11013_all_virtual_session_event_i1"; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 959827181b..ce64961f65 100755 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -7004,8 +7004,58 @@ all_clone_job_history_def = dict( ) def_table_schema(**all_clone_job_history_def) -# 487: __wr_system_event -# 488: __wr_event_name +def_table_schema( + owner = 'roland.qk', + table_id = 487, + table_name = '__wr_system_event', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int'), + ('cluster_id', 'int'), + ('snap_id', 'int'), + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('event_id', 'int'), + ], + + in_tenant_space=True, + is_cluster_private=True, + meta_record_in_sys = False, + + normal_columns = [ + ('total_waits', 'int','true'), + ('total_timeouts', 'int','true'), + ('time_waited_micro', 'int','true'), + ], +) + +def_table_schema( + owner = 'roland.qk', + table_id = 488, + table_name = '__wr_event_name', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int'), + ('cluster_id', 'int'), + ('event_id', 'int'), + ], + + in_tenant_space=True, + is_cluster_private=True, + meta_record_in_sys = False, + + normal_columns = [ + ('event_name', 'varchar:64', 'true'), + ('parameter1', 'varchar:64', 'true'), + ('parameter2', 'varchar:64', 'true'), + ('parameter3', 'varchar:64', 'true'), + ('wait_class_id', 'int', 'true'), + ('wait_class', 'varchar:64', 'true'), + ], +) + # 489: __all_tenant_scheduler_running_job all_routine_privilege_def = dict( owner = 'mingye.swj', @@ -7032,7 +7082,80 @@ all_routine_privilege_def = dict( def_table_schema(**all_routine_privilege_def) def_table_schema(**gen_history_table_def(491, all_routine_privilege_def)) -# 492: __wr_sqlstat +def_table_schema( + owner = 'yuchen.wyc', + table_id = 492, + table_name = '__wr_sqlstat', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int'), + ('cluster_id', 'int'), + ('snap_id', 'int'), + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('sql_id', 'varchar:OB_MAX_SQL_ID_LENGTH'), + ('plan_hash', 'uint'), + ('source_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('source_port', 'int'), + ], + in_tenant_space=True, + is_cluster_private=True, + meta_record_in_sys = False, + normal_columns = [ + ('plan_type', 'int'), + ('module', 'varchar:64', 'true'), + ('action', 'varchar:64', 'true'), + ('parsing_db_id', 'int'), + ('parsing_db_name', 'varchar:OB_MAX_DATABASE_NAME_LENGTH'), + ('parsing_user_id', 'int'), + ('executions_total', 'bigint', 'false', '0'), + ('executions_delta', 'bigint', 'false', '0'), + ('disk_reads_total', 'bigint', 'false', '0'), + ('disk_reads_delta', 'bigint', 'false', '0'), + ('buffer_gets_total', 'bigint', 'false', '0'), + ('buffer_gets_delta', 'bigint', 'false', '0'), + ('elapsed_time_total', 'bigint', 'false', '0'), + ('elapsed_time_delta', 'bigint', 'false', '0'), + ('cpu_time_total', 'bigint', 'false', '0'), + ('cpu_time_delta', 'bigint', 'false', '0'), + ('ccwait_total', 'bigint', 'false', '0'), + ('ccwait_delta', 'bigint', 'false', '0'), + ('userio_wait_total', 'bigint', 'false', '0'), + ('userio_wait_delta', 'bigint', 'false', '0'), + ('apwait_total', 'bigint', 'false', '0'), + ('apwait_delta', 'bigint', 'false', '0'), + ('physical_read_requests_total', 'bigint', 'false', '0'), + ('physical_read_requests_delta', 'bigint', 'false', '0'), + ('physical_read_bytes_total', 'bigint', 'false', '0'), + ('physical_read_bytes_delta', 'bigint', 'false', '0'), + ('write_throttle_total', 'bigint', 'false', '0'), + ('write_throttle_delta', 'bigint', 'false', '0'), + ('rows_processed_total', 'bigint', 'false', '0'), + ('rows_processed_delta', 'bigint', 'false', '0'), + ('memstore_read_rows_total', 'bigint', 'false', '0'), + ('memstore_read_rows_delta', 'bigint', 'false', '0'), + ('minor_ssstore_read_rows_total', 'bigint', 'false', '0'), + ('minor_ssstore_read_rows_delta', 'bigint', 'false', '0'), + ('major_ssstore_read_rows_total', 'bigint', 'false', '0'), + ('major_ssstore_read_rows_delta', 'bigint', 'false', '0'), + ('rpc_total', 'bigint', 'false', '0'), + ('rpc_delta', 'bigint', 'false', '0'), + ('fetches_total', 'bigint', 'false', '0'), + ('fetches_delta', 'bigint', 'false', '0'), + ('retry_total', 'bigint', 'false', '0'), + ('retry_delta', 'bigint', 'false', '0'), + ('partition_total', 'bigint', 'false', '0'), + ('partition_delta', 'bigint', 'false', '0'), + ('nested_sql_total', 'bigint', 'false', '0'), + ('nested_sql_delta', 'bigint', 'false', '0'), + ('route_miss_total', 'bigint', 'false', '0'), + ('route_miss_delta', 'bigint', 'false', '0'), + ('first_load_time', 'timestamp', 'true'), + ('plan_cache_hit_total', 'bigint', 'false', '0'), + ('plan_cache_hit_delta', 'bigint', 'false', '0'), + ], +) all_ncomp_dll = dict( owner = 'hr351303', @@ -7196,7 +7319,26 @@ def_table_schema( ], ) -# 501 : __wr_sqltext +def_table_schema( + owner = 'yuchen.wyc', + table_id = 501, + table_name = '__wr_sqltext', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int'), + ('cluster_id', 'int'), + ('snap_id', 'int'), + ('sql_id', 'varchar:OB_MAX_SQL_ID_LENGTH'), + ], + in_tenant_space=True, + is_cluster_private=True, + meta_record_in_sys = False, + normal_columns = [ + ('query_sql', 'longtext'), + ('sql_type', 'int'), + ], +) def_table_schema( owner = 'tony.wzh', @@ -7645,7 +7787,64 @@ all_coll_type_def = dict( ) def_table_schema(**all_coll_type_def) -# 525: __wr_sql_plan +def_table_schema( + owner = 'zhangyiqiang.zyq', + table_id = 525, + table_name = '__wr_sql_plan', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int'), + ('cluster_id', 'int'), + ('snap_id', 'int'), + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('sql_id', 'varchar:OB_MAX_SQL_ID_LENGTH'), + ('plan_hash', 'uint'), + ('plan_id', 'int'), + ('id', 'uint', 'false', '0'), + ], + in_tenant_space=True, + is_cluster_private=True, + meta_record_in_sys = False, + normal_columns = [ + ('db_id', 'int'), + ('gmt_create', 'timestamp'), + ('operator', 'varchar:255'), + ('options', 'varchar:255'), + ('object_node', 'varchar:40'), + ('object_id', 'int'), + ('object_owner', 'varchar:128'), + ('object_name', 'varchar:128'), + ('object_alias', 'varchar:261'), + ('object_type', 'varchar:20'), + ('optimizer', 'varchar:4000'), + ('parent_id', 'int'), + ('depth', 'int'), + ('position', 'int'), + ('is_last_child', 'int'), + ('cost', 'bigint'), + ('real_cost', 'bigint'), + ('cardinality', 'bigint'), + ('real_cardinality', 'bigint'), + ('bytes', 'bigint'), + ('rowset', 'int'), + ('other_tag', 'varchar:4000'), + ('partition_start', 'varchar:4000'), + ('other', 'varchar:4000'), + ('cpu_cost', 'bigint'), + ('io_cost', 'bigint'), + ('access_predicates', 'varchar:4000'), + ('filter_predicates', 'varchar:4000'), + ('startup_predicates', 'varchar:4000'), + ('projection', 'varchar:4000'), + ('special_predicates', 'varchar:4000'), + ('qblock_name','varchar:128'), + ('remarks', 'varchar:4000'), + ('other_xml', 'varchar:4000') + ], +) + # 526: __wr_res_mgr_sysstat # 527: __all_kv_redis_table @@ -8643,7 +8842,7 @@ def_table_schema( def_table_schema( - owner = 'yuzhong.zhao', + owner = 'roland.qk', tablegroup_id = 'OB_INVALID_ID', table_name = '__all_virtual_sysstat', table_id = '11021', @@ -10411,7 +10610,33 @@ def_table_schema( vtable_route_policy = 'distributed', ) -#11120: __all_virtual_res_mgr_sysstat +def_table_schema( + owner = 'roland.qk', + tablegroup_id = 'OB_INVALID_ID', + table_name = '__all_virtual_res_mgr_sysstat', + table_id = '11120', + table_type = 'VIRTUAL_TABLE', + in_tenant_space = True, + gm_columns = [], + rowkey_columns = [ + ('tenant_id', 'int', 'false'), + ('group_id', 'int', 'false'), + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH', 'false'), + ('svr_port', 'int'), + ('statistic#', 'int', 'false'), + ], + + normal_columns = [ + ('value', 'int', 'false'), + ('value_type', 'varchar:16', 'false'), + ('stat_id', 'int', 'false'), + ('name', 'varchar:64', 'false'), + ('class', 'int', 'false'), + ('can_visible', 'bool', 'false'), + ], + partition_columns = ['svr_ip', 'svr_port'], + vtable_route_policy = 'distributed', +) #11121: __all_virtual_ddl_diagnose_info @@ -12961,7 +13186,7 @@ def_table_schema(**gen_iterate_virtual_table_def( keywords = all_def_keywords['__all_spm_config'])) def_table_schema( - owner = 'xiaochu.yh', + owner = 'roland.qk', tablegroup_id = 'OB_INVALID_ID', table_name = '__all_virtual_ash', table_id = '12302', @@ -14667,8 +14892,17 @@ def_table_schema( vtable_route_policy = 'distributed', ) -# 12440: __all_virtual_wr_system_event -# 12441: __all_virtual_wr_event_name +def_table_schema(**gen_iterate_private_virtual_table_def( + table_id = '12440', + table_name = '__all_virtual_wr_system_event', + in_tenant_space = True, + keywords = all_def_keywords['__wr_system_event'])) + +def_table_schema(**gen_iterate_private_virtual_table_def( + table_id = '12441', + table_name = '__all_virtual_wr_event_name', + in_tenant_space = True, + keywords = all_def_keywords['__wr_event_name'])) def_table_schema( owner = 'fyy280124', @@ -14712,8 +14946,85 @@ def_table_schema(**gen_iterate_virtual_table_def( table_id = '12444', table_name = '__all_virtual_routine_privilege_history', keywords = all_def_keywords['__all_routine_privilege_history'])) -# 12445: __all_virtual_sqlstat -# 12446: __all_virtual_wr_sqlstat +def_table_schema( + owner = 'yuchen.wyc', + table_name = '__all_virtual_sqlstat', + table_id = '12445', + table_type = 'VIRTUAL_TABLE', + gm_columns = [], + rowkey_columns = [], + in_tenant_space=True, + normal_columns = [ + ('SVR_IP', 'varchar:MAX_IP_ADDR_LENGTH'), + ('SVR_PORT', 'int'), + ('TENANT_ID', 'int'), + ('SQL_ID', 'varchar:OB_MAX_SQL_ID_LENGTH'), + ('PLAN_ID', 'int'), + ('PLAN_HASH', 'uint'), + ('PLAN_TYPE', 'int'), + ('QUERY_SQL', 'longtext'), + ("SQL_TYPE", 'int'), + ('MODULE', 'varchar:64', 'true'), + ('ACTION', 'varchar:64', 'true'), + ('PARSING_DB_ID', 'int'), + ('PARSING_DB_NAME', 'varchar:OB_MAX_DATABASE_NAME_LENGTH'), + ('PARSING_USER_ID', 'int'), + ('EXECUTIONS_TOTAL', 'bigint', 'false', '0'), + ('EXECUTIONS_DELTA', 'bigint', 'false', '0'), + ('DISK_READS_TOTAL', 'bigint', 'false', '0'), + ('DISK_READS_DELTA', 'bigint', 'false', '0'), + ('BUFFER_GETS_TOTAL', 'bigint', 'false', '0'), + ('BUFFER_GETS_DELTA', 'bigint', 'false', '0'), + ('ELAPSED_TIME_TOTAL', 'bigint', 'false', '0'), + ('ELAPSED_TIME_DELTA', 'bigint', 'false', '0'), + ('CPU_TIME_TOTAL', 'bigint', 'false', '0'), + ('CPU_TIME_DELTA', 'bigint', 'false', '0'), + ('CCWAIT_TOTAL', 'bigint', 'false', '0'), + ('CCWAIT_DELTA', 'bigint', 'false', '0'), + ('USERIO_WAIT_TOTAL', 'bigint', 'false', '0'), + ('USERIO_WAIT_DELTA', 'bigint', 'false', '0'), + ('APWAIT_TOTAL', 'bigint', 'false', '0'), + ('APWAIT_DELTA', 'bigint', 'false', '0'), + ('PHYSICAL_READ_REQUESTS_TOTAL', 'bigint', 'false', '0'), + ('PHYSICAL_READ_REQUESTS_DELTA', 'bigint', 'false', '0'), + ('PHYSICAL_READ_BYTES_TOTAL', 'bigint', 'false', '0'), + ('PHYSICAL_READ_BYTES_DELTA', 'bigint', 'false', '0'), + ('WRITE_THROTTLE_TOTAL', 'bigint', 'false', '0'), + ('WRITE_THROTTLE_DELTA', 'bigint', 'false', '0'), + ('ROWS_PROCESSED_TOTAL', 'bigint', 'false', '0'), + ('ROWS_PROCESSED_DELTA', 'bigint', 'false', '0'), + ('MEMSTORE_READ_ROWS_TOTAL', 'bigint', 'false', '0'), + ('MEMSTORE_READ_ROWS_DELTA', 'bigint', 'false', '0'), + ('MINOR_SSSTORE_READ_ROWS_TOTAL', 'bigint', 'false', '0'), + ('MINOR_SSSTORE_READ_ROWS_DELTA', 'bigint', 'false', '0'), + ('MAJOR_SSSTORE_READ_ROWS_TOTAL', 'bigint', 'false', '0'), + ('MAJOR_SSSTORE_READ_ROWS_DELTA', 'bigint', 'false', '0'), + ('RPC_TOTAL', 'bigint', 'false', '0'), + ('RPC_DELTA', 'bigint', 'false', '0'), + ('FETCHES_TOTAL', 'bigint', 'false', '0'), + ('FETCHES_DELTA', 'bigint', 'false', '0'), + ('RETRY_TOTAL', 'bigint', 'false', '0'), + ('RETRY_DELTA', 'bigint', 'false', '0'), + ('PARTITION_TOTAL', 'bigint', 'false', '0'), + ('PARTITION_DELTA', 'bigint', 'false', '0'), + ('NESTED_SQL_TOTAL', 'bigint', 'false', '0'), + ('NESTED_SQL_DELTA', 'bigint', 'false', '0'), + ('SOURCE_IP', 'varchar:MAX_IP_ADDR_LENGTH'), + ('SOURCE_PORT', 'int'), + ('ROUTE_MISS_TOTAL', 'bigint', 'false', '0'), + ('ROUTE_MISS_DELTA', 'bigint', 'false', '0'), + ('FIRST_LOAD_TIME', 'timestamp', 'true'), + ('PLAN_CACHE_HIT_TOTAL', 'bigint', 'false', '0'), + ('PLAN_CACHE_HIT_DELTA', 'bigint', 'false', '0'), + ], + partition_columns = ['SVR_IP', 'SVR_PORT'], + vtable_route_policy = 'distributed', +) +def_table_schema(**gen_iterate_private_virtual_table_def( + table_id = '12446', + table_name = '__all_virtual_wr_sqlstat', + in_tenant_space = True, + keywords = all_def_keywords['__wr_sqlstat'])) def_table_schema(**gen_iterate_virtual_table_def( table_id = '12447', table_name = '__all_virtual_aux_stat', @@ -14761,7 +15072,12 @@ def_table_schema(**gen_iterate_private_virtual_table_def( keywords = all_def_keywords['__all_tenant_snapshot_job'], in_tenant_space = True)) -# 12454: __all_virtual_wr_sqltext +def_table_schema(**gen_iterate_private_virtual_table_def( + table_id = '12454', + table_name = '__all_virtual_wr_sqltext', + in_tenant_space = True, + keywords = all_def_keywords['__wr_sqltext'])) + # 12455: __all_virtual_trusted_root_certificate_info # 12456: __all_virtual_dbms_lock_allocated # 12457: __all_virtual_shared_storage_compaction_info @@ -15304,7 +15620,11 @@ def_table_schema( partition_columns = ['svr_ip', 'svr_port'], vtable_route_policy = 'distributed', ) -# 12501: __all_virtual_wr_sql_plan +def_table_schema(**gen_iterate_private_virtual_table_def( + table_id = '12501', + table_name = '__all_virtual_wr_sql_plan', + in_tenant_space = True, + keywords = all_def_keywords['__wr_sql_plan'])) # 12502: __all_virtual_wr_res_mgr_sysstat # 12503: __all_virtual_kv_redis_table @@ -15828,18 +16148,18 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15418' # 15419: abandoned # 15420: abandoned -# 15421: __all_virtual_wr_system_event -# 15422: __all_virtual_wr_event_name +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15421', all_def_keywords['__all_virtual_wr_system_event']))) +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15422', all_def_keywords['__all_virtual_wr_event_name']))) # 15423: __all_virtual_tenant_scheduler_running_job -# 15424: __all_virtual_sqlstat -# 15425: __all_virtual_wr_sqlstat -# 15426: __tenant_virtual_statname +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15424', all_def_keywords['__all_virtual_sqlstat']))) +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15425', all_def_keywords['__all_virtual_wr_sqlstat']))) +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15426', all_def_keywords['__tenant_virtual_statname']))) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15427', all_def_keywords['__all_aux_stat'])) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15428', all_def_keywords['__all_sys_variable'])) def_table_schema(**gen_oracle_mapping_virtual_table_def('15429', all_def_keywords['__all_virtual_sys_variable_default_value'])) def_table_schema(**no_direct_access(gen_oracle_mapping_real_virtual_table_def('15430', all_def_keywords['__all_transfer_partition_task']))) def_table_schema(**no_direct_access(gen_oracle_mapping_real_virtual_table_def('15431', all_def_keywords['__all_transfer_partition_task_history']))) -# 15432: __all_virtual_wr_sqltext +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15432', all_def_keywords['__all_virtual_wr_sqltext']))) # 15433: abandoned # 15434: abandoned # 15435: abandoned @@ -15871,7 +16191,7 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15452' def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15454', all_def_keywords['__all_virtual_storage_io_usage']))) def_table_schema(**no_direct_access(gen_sys_agent_virtual_table_def('15455', all_def_keywords['__all_zone_storage']))) def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15456', all_def_keywords['__all_virtual_nic_info']))) -# 15457: __all_virtual_query_response_time +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15457', all_def_keywords['__all_virtual_query_response_time']))) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15458', all_def_keywords['__all_scheduler_job_run_detail_v2'])) def_table_schema(**no_direct_access(gen_oracle_mapping_real_virtual_table_def('15459', all_def_keywords['__all_spatial_reference_systems']))) # 15460: idx_scheduler_job_run_detail_v2_time_real_agent @@ -15907,8 +16227,8 @@ def_table_schema(**gen_sys_agent_virtual_table_def('15470', all_def_keywords['__ def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15471', all_def_keywords['__all_pkg_type'])) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15472', all_def_keywords['__all_pkg_type_attr'])) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15473', all_def_keywords['__all_pkg_coll_type'])) -# 15481: __all_virtual_wr_sql_plan -# 15482: __all_virtual_res_mgr_sysstat +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15481', all_def_keywords['__all_virtual_wr_sql_plan']))) +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15482', all_def_keywords['__all_virtual_res_mgr_sysstat']))) # 15483: __all_virtual_wr_res_mgr_sysstat def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15484', all_def_keywords['__all_virtual_function_io_stat']))) def_table_schema(**gen_oracle_mapping_virtual_table_def('15485', all_def_keywords['__all_virtual_temp_file'])) @@ -17197,7 +17517,7 @@ def_table_schema( ) def_table_schema( - owner = 'yuzhong.zhao', + owner = 'roland.qk', tablegroup_id = 'OB_INVALID_ID', table_name = 'GV$SYSSTAT', table_id = '21005', @@ -17392,7 +17712,7 @@ def_table_schema( ) def_table_schema( - owner = 'yuzhong.zhao', + owner = 'roland.qk', tablegroup_id = 'OB_INVALID_ID', table_name = 'V$SYSSTAT', table_id = '21012', @@ -17556,7 +17876,9 @@ def_table_schema( stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, - proxy_user as PROXY_USER + proxy_user as PROXY_USER, + seq_num as SEQ_NUM, + network_wait_time as NETWORK_WAIT_TIME from oceanbase.__all_virtual_sql_audit """.replace("\n", " "), @@ -17967,7 +18289,9 @@ def_table_schema( stmt_type as STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, - PROXY_USER + PROXY_USER, + SEQ_NUM, + NETWORK_WAIT_TIME FROM oceanbase.GV$OB_SQL_AUDIT WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() """.replace("\n", " "), @@ -26997,7 +27321,7 @@ def_table_schema( ) def_table_schema( - owner = 'xiaochu.yh', + owner = 'roland.qk', tablegroup_id = 'OB_INVALID_ID', table_name = 'GV$ACTIVE_SESSION_HISTORY', table_id = '21267', @@ -27005,65 +27329,72 @@ def_table_schema( rowkey_columns = [], table_type = 'SYSTEM_VIEW', in_tenant_space = True, - view_definition = """SELECT - CAST(SVR_IP AS CHAR(46)) AS SVR_IP, - CAST(SVR_PORT AS SIGNED) AS SVR_PORT, - CAST(SAMPLE_ID AS SIGNED) AS SAMPLE_ID, - CAST(SAMPLE_TIME AS DATETIME) AS SAMPLE_TIME, - CAST(TENANT_ID AS SIGNED) AS CON_ID, - CAST(USER_ID AS SIGNED) AS USER_ID, - CAST(SESSION_ID AS SIGNED) AS SESSION_ID, - CAST(IF (SESSION_TYPE = 0, 'FOREGROUND', 'BACKGROUND') AS CHAR(10)) AS SESSION_TYPE, - CAST(IF (EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, - CAST(SQL_ID AS CHAR(32)) AS SQL_ID, - CAST(PLAN_ID AS SIGNED) AS PLAN_ID, - CAST(TRACE_ID AS CHAR(64)) AS TRACE_ID, - CAST(NAME AS CHAR(64)) AS EVENT, - CAST(EVENT_NO AS SIGNED) AS EVENT_NO, - CAST(oceanbase.__all_virtual_ash.EVENT_ID AS SIGNED) AS EVENT_ID, - CAST(PARAMETER1 AS CHAR(64)) AS P1TEXT, - CAST(P1 AS SIGNED) AS P1, - CAST(PARAMETER2 AS CHAR(64)) AS P2TEXT, - CAST(P2 AS SIGNED) AS P2, - CAST(PARAMETER3 AS CHAR(64)) AS P3TEXT, - CAST(P3 AS SIGNED) AS P3, - CAST(WAIT_CLASS AS CHAR(64)) AS WAIT_CLASS, - CAST(WAIT_CLASS_ID AS SIGNED) AS WAIT_CLASS_ID, - CAST(TIME_WAITED AS SIGNED) AS TIME_WAITED, - CAST(SQL_PLAN_LINE_ID AS SIGNED) SQL_PLAN_LINE_ID, - CAST(GROUP_ID AS SIGNED) GROUP_ID, - CAST(TX_ID AS SIGNED) TX_ID, - CAST(BLOCKING_SESSION_ID AS SIGNED) BLOCKING_SESSION_ID, - CAST(IF (IN_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PARSE, - CAST(IF (IN_PL_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PL_PARSE, - CAST(IF (IN_PLAN_CACHE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLAN_CACHE, - CAST(IF (IN_SQL_OPTIMIZE = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_OPTIMIZE, - CAST(IF (IN_SQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_EXECUTION, - CAST(IF (IN_PX_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PX_EXECUTION, - CAST(IF (IN_SEQUENCE_LOAD = 1, 'Y', 'N') AS CHAR(1)) AS IN_SEQUENCE_LOAD, - CAST(IF (IN_COMMITTING = 1, 'Y', 'N') AS CHAR(1)) AS IN_COMMITTING, - CAST(IF (IN_STORAGE_READ = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_READ, - CAST(IF (IN_STORAGE_WRITE = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_WRITE, - CAST(IF (IN_REMOTE_DAS_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, - CAST(IF (IN_FILTER_ROWS = 1, 'Y', 'N') AS CHAR(1)) AS IN_FILTER_ROWS, - CAST(PROGRAM AS CHAR(64)) AS PROGRAM, - CAST(MODULE AS CHAR(64)) AS MODULE, - CAST(ACTION AS CHAR(64)) AS ACTION, - CAST(CLIENT_ID AS CHAR(64)) AS CLIENT_ID, - CAST(BACKTRACE AS CHAR(512)) AS BACKTRACE, - CAST(TM_DELTA_TIME AS SIGNED) AS TM_DELTA_TIME, - CAST(TM_DELTA_CPU_TIME AS SIGNED) AS TM_DELTA_CPU_TIME, - CAST(TM_DELTA_DB_TIME AS SIGNED) AS TM_DELTA_DB_TIME, - CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, - CAST(IF (IN_PLSQL_COMPILATION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_COMPILATION, - CAST(IF (IN_PLSQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_EXECUTION, - CAST(PLSQL_ENTRY_OBJECT_ID AS SIGNED) AS PLSQL_ENTRY_OBJECT_ID, - CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS SIGNED) AS PLSQL_ENTRY_SUBPROGRAM_ID, - CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, - CAST(PLSQL_OBJECT_ID AS SIGNED) AS PLSQL_OBJECT_ID, - CAST(PLSQL_SUBPROGRAM_ID AS SIGNED) AS PLSQL_SUBPROGRAM_ID, - CAST(PLSQL_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_SUBPROGRAM_NAME - FROM oceanbase.__all_virtual_ash LEFT JOIN oceanbase.v$event_name on EVENT_NO = `event#` + view_definition = """SELECT SVR_IP, +SVR_PORT, +SAMPLE_ID, +SAMPLE_TIME, +CON_ID, +USER_ID, +SESSION_ID, +SESSION_TYPE, +SESSION_STATE, +SQL_ID, +PLAN_ID, +TRACE_ID, +EVENT, +EVENT_NO, +EVENT_ID, +P1TEXT, +P1, +P2TEXT, +P2, +P3TEXT, +P3, +WAIT_CLASS, +WAIT_CLASS_ID, +TIME_WAITED, +SQL_PLAN_LINE_ID, +GROUP_ID, +PLAN_HASH, +THREAD_ID, +STMT_TYPE, +TIME_MODEL, +IN_PARSE, +IN_PL_PARSE, +IN_PLAN_CACHE, +IN_SQL_OPTIMIZE, +IN_SQL_EXECUTION, +IN_PX_EXECUTION, +IN_SEQUENCE_LOAD, +IN_COMMITTING, +IN_STORAGE_READ, +IN_STORAGE_WRITE, +IN_REMOTE_DAS_EXECUTION, +IN_FILTER_ROWS, +IN_RPC_ENCODE, +IN_RPC_DECODE, +IN_CONNECTION_MGR, +PROGRAM, +MODULE, +ACTION, +CLIENT_ID, +BACKTRACE, +TM_DELTA_TIME, +TM_DELTA_CPU_TIME, +TM_DELTA_DB_TIME, +TOP_LEVEL_SQL_ID, +IN_PLSQL_COMPILATION, +IN_PLSQL_EXECUTION, +PLSQL_ENTRY_OBJECT_ID, +PLSQL_ENTRY_SUBPROGRAM_ID, +PLSQL_ENTRY_SUBPROGRAM_NAME, +PLSQL_OBJECT_ID, +PLSQL_SUBPROGRAM_ID, +PLSQL_SUBPROGRAM_NAME, +TX_ID, +BLOCKING_SESSION_ID, +TABLET_ID, +PROXY_SID FROM oceanbase.GV$OB_ACTIVE_SESSION_HISTORY """.replace("\n", " "), normal_columns = [], ) @@ -27103,8 +27434,10 @@ WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, -TX_ID, -BLOCKING_SESSION_ID, +PLAN_HASH, +THREAD_ID, +STMT_TYPE, +TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, @@ -27117,6 +27450,9 @@ IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, +IN_RPC_ENCODE, +IN_RPC_DECODE, +IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, @@ -27133,7 +27469,12 @@ PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, -PLSQL_SUBPROGRAM_NAME FROM oceanbase.gv$active_session_history WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +PLSQL_SUBPROGRAM_NAME, +TX_ID, +BLOCKING_SESSION_ID, +TABLET_ID, +PROXY_SID +FROM oceanbase.gv$active_session_history WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() """.replace("\n", " "), normal_columns = [], ) @@ -28845,11 +29186,15 @@ def_table_schema( rowkey_columns=[], normal_columns=[], in_tenant_space=True, - view_definition="""select response_time as RESPONSE_TIME, - count as COUNT, - total as TOTAL + view_definition="""select + svr_ip as SVR_IP, + svr_port as SVR_PORT, + response_time as RESPONSE_TIME, + sum(count) as COUNT, + sum(total) as TOTAL from oceanbase.__all_virtual_query_response_time where tenant_id = effective_tenant_id() + group by svr_ip, svr_port, response_time """.replace("\n", " "), ) @@ -32224,6 +32569,9 @@ def_table_schema( ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, + ASH.PLAN_HASH AS PLAN_HASH, + ASH.THREAD_ID AS THREAD_ID, + ASH.STMT_TYPE AS STMT_TYPE, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, @@ -32241,6 +32589,9 @@ def_table_schema( CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, + CAST(CASE WHEN (ASH.TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, + CAST(CASE WHEN (ASH.TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, + CAST(CASE WHEN (ASH.TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, @@ -32260,7 +32611,9 @@ def_table_schema( ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, - ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES + ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, + ASH.TABLET_ID AS TABLET_ID, + ASH.PROXY_SID AS PROXY_SID FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH @@ -32307,6 +32660,9 @@ def_table_schema( ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, ASH.GROUP_ID AS GROUP_ID, + ASH.PLAN_HASH AS PLAN_HASH, + ASH.THREAD_ID AS THREAD_ID, + ASH.STMT_TYPE AS STMT_TYPE, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, ASH.TIME_MODEL AS TIME_MODEL, @@ -32324,6 +32680,9 @@ def_table_schema( CAST(CASE WHEN (ASH.TIME_MODEL & 2048) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN (ASH.TIME_MODEL & 4096) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN (ASH.TIME_MODEL & 8192) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_FILTER_ROWS, + CAST(CASE WHEN (ASH.TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, + CAST(CASE WHEN (ASH.TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, + CAST(CASE WHEN (ASH.TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, @@ -32343,7 +32702,9 @@ def_table_schema( ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, - ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES + ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, + ASH.TABLET_ID AS TABLET_ID, + ASH.PROXY_SID AS PROXY_SID FROM ( OCEANBASE.__ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH @@ -32377,7 +32738,7 @@ def_table_schema( END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME - FROM OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT + FROM oceanbase.__all_virtual_wr_snapshot WHERE STATUS = 0 AND TENANT_ID=EFFECTIVE_TENANT_ID(); """.replace("\n", " ") @@ -32402,7 +32763,7 @@ def_table_schema( END_INTERVAL_TIME, SNAP_FLAG, STARTUP_TIME - FROM OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT + FROM oceanbase.__all_virtual_wr_snapshot WHERE STATUS = 0; """.replace("\n", " ") ) @@ -32422,7 +32783,7 @@ def_table_schema( TENANT_ID, STAT_ID, STAT_NAME - FROM OCEANBASE.__ALL_VIRTUAL_WR_STATNAME + FROM oceanbase.__all_virtual_wr_statname WHERE TENANT_ID=EFFECTIVE_TENANT_ID(); """.replace("\n", " ") ) @@ -32441,7 +32802,7 @@ def_table_schema( TENANT_ID, STAT_ID, STAT_NAME - FROM OCEANBASE.__ALL_VIRTUAL_WR_STATNAME; + FROM oceanbase.__all_virtual_wr_statname; """.replace("\n", " ") ) @@ -32467,8 +32828,8 @@ def_table_schema( STAT.VALUE AS VALUE FROM ( - OCEANBASE.__ALL_VIRTUAL_WR_SYSSTAT STAT - JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP + oceanbase.__all_virtual_wr_sysstat STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID @@ -32499,8 +32860,8 @@ def_table_schema( STAT.VALUE AS VALUE FROM ( - OCEANBASE.__ALL_VIRTUAL_WR_SYSSTAT STAT - JOIN OCEANBASE.__ALL_VIRTUAL_WR_SNAPSHOT SNAP + oceanbase.__all_virtual_wr_sysstat STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID AND STAT.TENANT_ID = SNAP.TENANT_ID AND STAT.SNAP_ID = SNAP.SNAP_ID @@ -33571,7 +33932,7 @@ def_table_schema( SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM - OCEANBASE.__ALL_VIRTUAL_WR_CONTROL SETTING + oceanbase.__all_virtual_wr_control SETTING WHERE SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() """.replace("\n", " ") @@ -33593,7 +33954,7 @@ def_table_schema( SETTING.RETENTION AS RETENTION, SETTING.TOPNSQL AS TOPNSQL FROM - OCEANBASE.__ALL_VIRTUAL_WR_CONTROL SETTING + oceanbase.__all_virtual_wr_control SETTING """.replace("\n", " ") ) def_table_schema( @@ -34574,10 +34935,117 @@ WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() """.replace("\n", " "), ) -#21481: DBA_WR_SYSTEM_EVENT -#21482: CDB_WR_SYSTEM_EVENT -#21483: DBA_WR_EVENT_NAME -#21484: CDB_WR_EVENT_NAME +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_SYSTEM_EVENT', + table_id = '21481', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SETTING.SNAP_ID AS SNAP_ID, + SETTING.SVR_IP AS SVR_IP, + SETTING.SVR_PORT AS SVR_PORT, + SETTING.EVENT_ID AS EVENT_ID, + EN.EVENT_NAME AS EVENT_NAME, + EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, + EN.WAIT_CLASS AS WAIT_CLASS, + SETTING.TOTAL_WAITS AS TOTAL_WAITS, + SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, + SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO + FROM + oceanbase.__all_virtual_wr_system_event SETTING, + oceanbase.__all_virtual_wr_event_name EN + WHERE + SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() + AND EN.EVENT_ID = SETTING.EVENT_ID + AND EN.TENANT_ID = SETTING.TENANT_ID + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'CDB_WR_SYSTEM_EVENT', + table_id = '21482', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = + """ + SELECT + SETTING.TENANT_ID AS TENANT_ID, + SETTING.CLUSTER_ID AS CLUSTER_ID, + SETTING.SNAP_ID AS SNAP_ID, + SETTING.SVR_IP AS SVR_IP, + SETTING.SVR_PORT AS SVR_PORT, + SETTING.EVENT_ID AS EVENT_ID, + EN.EVENT_NAME AS EVENT_NAME, + EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, + EN.WAIT_CLASS AS WAIT_CLASS, + SETTING.TOTAL_WAITS AS TOTAL_WAITS, + SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, + SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO + FROM + oceanbase.__all_virtual_wr_system_event SETTING, + oceanbase.__all_virtual_wr_event_name EN + WHERE + EN.EVENT_ID = SETTING.EVENT_ID + AND EN.TENANT_ID = SETTING.TENANT_ID + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_EVENT_NAME', + table_id = '21483', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SETTING.EVENT_ID AS EVENT_ID, + SETTING.EVENT_NAME AS EVENT_NAME, + SETTING.PARAMETER1 AS PARAMETER1, + SETTING.PARAMETER2 AS PARAMETER2, + SETTING.PARAMETER3 AS PARAMETER3, + SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, + SETTING.WAIT_CLASS AS WAIT_CLASS + FROM + oceanbase.__all_virtual_wr_event_name SETTING + WHERE + SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'CDB_WR_EVENT_NAME', + table_id = '21484', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = + """ + SELECT + SETTING.TENANT_ID AS TENANT_ID, + SETTING.CLUSTER_ID AS CLUSTER_ID, + SETTING.EVENT_ID AS EVENT_ID, + SETTING.EVENT_NAME AS EVENT_NAME, + SETTING.PARAMETER1 AS PARAMETER1, + SETTING.PARAMETER2 AS PARAMETER2, + SETTING.PARAMETER3 AS PARAMETER3, + SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, + SETTING.WAIT_CLASS AS WAIT_CLASS + FROM + oceanbase.__all_virtual_wr_event_name SETTING + """.replace("\n", " ") +) def_table_schema( owner = 'guoyun.lgy', table_name = 'DBA_OB_FORMAT_OUTLINES', @@ -34634,16 +35102,475 @@ def_table_schema( """.replace("\n", " ") ) -#21487: GV$OB_SQLSTAT -#21488: V$OB_SQLSTAT -#21489: DBA_WR_SQLSTAT -#21490: CDB_WR_SQLSTAT -#21491: GV$OB_SESS_TIME_MODEL -#21492: V$OB_SESS_TIME_MODEL -#21493: GV$OB_SYS_TIME_MODEL -#21494: V$OB_SYS_TIME_MODEL -#21495: DBA_WR_SYS_TIME_MODEL -#21496: CDB_WR_SYS_TIME_MODEL +def_table_schema( + owner = 'yuchen.wyc', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'GV$OB_SQLSTAT', + table_id = '21487', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + TENANT_ID AS TENANT_ID, + SQL_ID AS SQL_ID, + PLAN_ID AS PLAN_ID, + PLAN_HASH AS PLAN_HASH, + PLAN_TYPE AS PLAN_TYPE, + QUERY_SQL AS QUERY_SQL, + SQL_TYPE AS SQL_TYPE, + MODULE AS MODULE, + ACTION AS ACTION, + PARSING_DB_ID AS PARSING_DB_ID, + PARSING_DB_NAME AS PARSING_DB_NAME, + PARSING_USER_ID AS PARSING_USER_ID, + EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, + EXECUTIONS_DELTA AS EXECUTIONS_DELTA, + DISK_READS_TOTAL AS DISK_READS_TOTAL, + DISK_READS_DELTA AS DISK_READS_DELTA, + BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, + BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, + ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, + ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, + CPU_TIME_TOTAL AS CPU_TIME_TOTAL, + CPU_TIME_DELTA AS CPU_TIME_DELTA, + CCWAIT_TOTAL AS CCWAIT_TOTAL, + CCWAIT_DELTA AS CCWAIT_DELTA, + USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, + USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, + APWAIT_TOTAL AS APWAIT_TOTAL, + APWAIT_DELTA AS APWAIT_DELTA, + PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, + PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, + PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, + PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, + WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, + WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, + ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, + ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, + MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, + MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, + MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, + MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, + MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, + MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, + RPC_TOTAL AS RPC_TOTAL, + RPC_DELTA AS RPC_DELTA, + FETCHES_TOTAL AS FETCHES_TOTAL, + FETCHES_DELTA AS FETCHES_DELTA, + RETRY_TOTAL AS RETRY_TOTAL, + RETRY_DELTA AS RETRY_DELTA, + PARTITION_TOTAL AS PARTITION_TOTAL, + PARTITION_DELTA AS PARTITION_DELTA, + NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, + NESTED_SQL_DELTA AS NESTED_SQL_DELTA, + SOURCE_IP AS SOURCE_IP, + SOURCE_PORT AS SOURCE_PORT, + ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, + ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, + FIRST_LOAD_TIME AS FIRST_LOAD_TIME, + PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, + PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA + FROM oceanbase.__all_virtual_sqlstat +""".replace("\n", " "), + normal_columns = [], +) +def_table_schema( + owner = 'yuchen.wyc', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'V$OB_SQLSTAT', + table_id = '21488', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT SVR_IP, +SVR_PORT, +TENANT_ID, +SQL_ID, +PLAN_ID, +PLAN_HASH, +PLAN_TYPE, +QUERY_SQL, +SQL_TYPE, +MODULE, +ACTION, +PARSING_DB_ID, +PARSING_DB_NAME, +PARSING_USER_ID, +EXECUTIONS_TOTAL, +EXECUTIONS_DELTA, +DISK_READS_TOTAL, +DISK_READS_DELTA, +BUFFER_GETS_TOTAL, +BUFFER_GETS_DELTA, +ELAPSED_TIME_TOTAL, +ELAPSED_TIME_DELTA, +CPU_TIME_TOTAL, +CPU_TIME_DELTA, +CCWAIT_TOTAL, +CCWAIT_DELTA, +USERIO_WAIT_TOTAL, +USERIO_WAIT_DELTA, +APWAIT_TOTAL, +APWAIT_DELTA, +PHYSICAL_READ_REQUESTS_TOTAL, +PHYSICAL_READ_REQUESTS_DELTA, +PHYSICAL_READ_BYTES_TOTAL, +PHYSICAL_READ_BYTES_DELTA, +WRITE_THROTTLE_TOTAL, +WRITE_THROTTLE_DELTA, +ROWS_PROCESSED_TOTAL, +ROWS_PROCESSED_DELTA, +MEMSTORE_READ_ROWS_TOTAL, +MEMSTORE_READ_ROWS_DELTA, +MINOR_SSSTORE_READ_ROWS_TOTAL, +MINOR_SSSTORE_READ_ROWS_DELTA, +MAJOR_SSSTORE_READ_ROWS_TOTAL, +MAJOR_SSSTORE_READ_ROWS_DELTA, +RPC_TOTAL, +RPC_DELTA, +FETCHES_TOTAL, +FETCHES_DELTA, +RETRY_TOTAL, +RETRY_DELTA, +PARTITION_TOTAL, +PARTITION_DELTA, +NESTED_SQL_TOTAL, +NESTED_SQL_DELTA, +SOURCE_IP, +SOURCE_PORT, +ROUTE_MISS_TOTAL, +ROUTE_MISS_DELTA, +FIRST_LOAD_TIME, +PLAN_CACHE_HIT_TOTAL, +PLAN_CACHE_HIT_DELTA FROM oceanbase.gv$ob_sqlstat WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " "), + normal_columns = [], +) +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'DBA_WR_SQLSTAT', + table_id = '21489', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + STAT.SNAP_ID AS SNAP_ID, + STAT.SVR_IP AS SVR_IP, + STAT.SVR_PORT AS SVR_PORT, + STAT.SQL_ID AS SQL_ID, + STAT.PLAN_HASH AS PLAN_HASH, + STAT.PLAN_TYPE AS PLAN_TYPE, + STAT.MODULE AS MODULE, + STAT.ACTION AS ACTION, + STAT.PARSING_DB_ID AS PARSING_DB_ID, + STAT.PARSING_DB_NAME AS PARSING_DB_NAME, + STAT.PARSING_USER_ID AS PARSING_USER_ID, + STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, + STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, + STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, + STAT.DISK_READS_DELTA AS DISK_READS_DELTA, + STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, + STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, + STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, + STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, + STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, + STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, + STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, + STAT.CCWAIT_DELTA AS CCWAIT_DELTA, + STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, + STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, + STAT.APWAIT_TOTAL AS APWAIT_TOTAL, + STAT.APWAIT_DELTA AS APWAIT_DELTA, + STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, + STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, + STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, + STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, + STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, + STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, + STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, + STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, + STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, + STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, + STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, + STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, + STAT.RPC_TOTAL AS RPC_TOTAL, + STAT.RPC_DELTA AS RPC_DELTA, + STAT.FETCHES_TOTAL AS FETCHES_TOTAL, + STAT.FETCHES_DELTA AS FETCHES_DELTA, + STAT.RETRY_TOTAL AS RETRY_TOTAL, + STAT.RETRY_DELTA AS RETRY_DELTA, + STAT.PARTITION_TOTAL AS PARTITION_TOTAL, + STAT.PARTITION_DELTA AS PARTITION_DELTA, + STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, + STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, + STAT.SOURCE_IP AS SOURCE_IP, + STAT.SOURCE_PORT AS SOURCE_PORT, + STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, + STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, + STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, + STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, + STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA + FROM + ( + oceanbase.__all_virtual_wr_sqlstat STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP + ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + AND STAT.SVR_IP = SNAP.SVR_IP + AND STAT.SVR_PORT = SNAP.SVR_PORT + ) + WHERE + STAT.TENANT_ID = EFFECTIVE_TENANT_ID() + AND SNAP.STATUS = 0 + """.replace("\n", " ") +) +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'CDB_WR_SQLSTAT', + table_id = '21490', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = + """ + SELECT + STAT.TENANT_ID AS TENANT_ID, + STAT.SNAP_ID AS SNAP_ID, + STAT.SVR_IP AS SVR_IP, + STAT.SVR_PORT AS SVR_PORT, + STAT.SQL_ID AS SQL_ID, + STAT.PLAN_HASH AS PLAN_HASH, + STAT.PLAN_TYPE AS PLAN_TYPE, + STAT.MODULE AS MODULE, + STAT.ACTION AS ACTION, + STAT.PARSING_DB_ID AS PARSING_DB_ID, + STAT.PARSING_DB_NAME AS PARSING_DB_NAME, + STAT.PARSING_USER_ID AS PARSING_USER_ID, + STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, + STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, + STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, + STAT.DISK_READS_DELTA AS DISK_READS_DELTA, + STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, + STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, + STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, + STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, + STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, + STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, + STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, + STAT.CCWAIT_DELTA AS CCWAIT_DELTA, + STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, + STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, + STAT.APWAIT_TOTAL AS APWAIT_TOTAL, + STAT.APWAIT_DELTA AS APWAIT_DELTA, + STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, + STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, + STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, + STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, + STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, + STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, + STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, + STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, + STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, + STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, + STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, + STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, + STAT.RPC_TOTAL AS RPC_TOTAL, + STAT.RPC_DELTA AS RPC_DELTA, + STAT.FETCHES_TOTAL AS FETCHES_TOTAL, + STAT.FETCHES_DELTA AS FETCHES_DELTA, + STAT.RETRY_TOTAL AS RETRY_TOTAL, + STAT.RETRY_DELTA AS RETRY_DELTA, + STAT.PARTITION_TOTAL AS PARTITION_TOTAL, + STAT.PARTITION_DELTA AS PARTITION_DELTA, + STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, + STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, + STAT.SOURCE_IP AS SOURCE_IP, + STAT.SOURCE_PORT AS SOURCE_PORT, + STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, + STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, + STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, + STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, + STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA + FROM + ( + oceanbase.__all_virtual_wr_sqlstat STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP + ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + AND STAT.SVR_IP = SNAP.SVR_IP + AND STAT.SVR_PORT = SNAP.SVR_PORT + ) + WHERE + SNAP.STATUS = 0 + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_SESS_TIME_MODEL', + table_id = '21491', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SID AS SID, + gv$sesstat.CON_ID AS TENANT_ID, + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + STAT_ID AS STAT_ID, + NAME AS STAT_NAME, + VALUE AS VALUE + FROM + oceanbase.GV$SESSTAT + left join + oceanbase.v$statname + on gv$sesstat.`statistic#`=v$statname.`statistic#` + WHERE + STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_SESS_TIME_MODEL', + table_id = '21492', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT SID, + TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + STAT_NAME, + VALUE + FROM + oceanbase.GV$OB_SESS_TIME_MODEL + WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_SYS_TIME_MODEL', + table_id = '21493', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + GV$SYSSTAT.CON_ID AS TENANT_ID, + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + STAT_ID AS STAT_ID, + NAME AS STAT_NAME, + VALUE AS VALUE + FROM + oceanbase.GV$SYSSTAT + WHERE + STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_SYS_TIME_MODEL', + table_id = '21494', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + STAT_NAME, + VALUE + FROM + oceanbase.GV$OB_SYS_TIME_MODEL + WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT(); +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_SYS_TIME_MODEL', + table_id = '21495', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SNAP_ID AS SNAP_ID, + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + oceanbase.DBA_WR_SYSSTAT.STAT_ID AS STAT_ID, + STAT_NAME AS STAT_NAME, + VALUE AS VALUE + FROM + oceanbase.DBA_WR_SYSSTAT + left join + oceanbase.DBA_WR_STATNAME + on oceanbase.DBA_WR_SYSSTAT.STAT_ID=oceanbase.DBA_WR_STATNAME.STAT_ID + WHERE + oceanbase.DBA_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'CDB_WR_SYS_TIME_MODEL', + table_id = '21496', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = """ + SELECT + oceanbase.CDB_WR_SYSSTAT.CLUSTER_ID AS CLUSTER_ID, + oceanbase.CDB_WR_SYSSTAT.TENANT_ID AS TENANT_ID, + SNAP_ID AS SNAP_ID, + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + oceanbase.CDB_WR_SYSSTAT.STAT_ID AS STAT_ID, + STAT_NAME AS STAT_NAME, + VALUE AS VALUE + FROM + oceanbase.CDB_WR_SYSSTAT + left join + oceanbase.DBA_WR_STATNAME + on oceanbase.CDB_WR_SYSSTAT.STAT_ID=oceanbase.DBA_WR_STATNAME.STAT_ID + WHERE + oceanbase.CDB_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); +""".replace("\n", " "), +) def_table_schema( owner = 'zhenling.zzg', @@ -34855,10 +35782,227 @@ def_table_schema( """.replace("\n", " "), ) -#21505: DBA_WR_SQLTEXT -#21506: CDB_WR_SQLTEXT -#21507: GV$OB_ACTIVE_SESSION_HISTORY -#21508: V$OB_ACTIVE_SESSION_HISTORY +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'DBA_WR_SQLTEXT', + table_id = '21505', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + STAT.SNAP_ID AS SNAP_ID, + STAT.SQL_ID AS SQL_ID, + STAT.QUERY_SQL AS QUERY_SQL, + STAT.SQL_TYPE AS SQL_TYPE + FROM + ( + oceanbase.__all_virtual_wr_sqltext STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP + ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + ) + WHERE + STAT.TENANT_ID = EFFECTIVE_TENANT_ID() + AND SNAP.STATUS = 0 + """.replace("\n", " ") +) +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'CDB_WR_SQLTEXT', + table_id = '21506', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = + """ + SELECT + STAT.TENANT_ID AS TENANT_ID, + STAT.SNAP_ID AS SNAP_ID, + STAT.SQL_ID AS SQL_ID, + STAT.QUERY_SQL AS QUERY_SQL, + STAT.SQL_TYPE AS SQL_TYPE + FROM + ( + oceanbase.__all_virtual_wr_sqltext STAT + JOIN oceanbase.__all_virtual_wr_snapshot SNAP + ON STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + ) + WHERE + SNAP.STATUS = 0 + """.replace("\n", " ") +) + +def_table_schema( + owner = 'roland.qk', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'GV$OB_ACTIVE_SESSION_HISTORY', + table_id = '21507', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT + CAST(SVR_IP AS CHAR(46)) AS SVR_IP, + CAST(SVR_PORT AS SIGNED) AS SVR_PORT, + CAST(SAMPLE_ID AS SIGNED) AS SAMPLE_ID, + SAMPLE_TIME AS SAMPLE_TIME, + CAST(TENANT_ID AS SIGNED) AS CON_ID, + CAST(USER_ID AS SIGNED) AS USER_ID, + CAST(SESSION_ID AS SIGNED) AS SESSION_ID, + CAST(IF (SESSION_TYPE = 0, 'FOREGROUND', 'BACKGROUND') AS CHAR(10)) AS SESSION_TYPE, + CAST(IF (EVENT_NO = 0, 'ON CPU', 'WAITING') AS CHAR(7)) AS SESSION_STATE, + CAST(SQL_ID AS CHAR(32)) AS SQL_ID, + CAST(PLAN_ID AS SIGNED) AS PLAN_ID, + CAST(TRACE_ID AS CHAR(64)) AS TRACE_ID, + CAST(NAME AS CHAR(64)) AS EVENT, + CAST(EVENT_NO AS SIGNED) AS EVENT_NO, + CAST(ASH.EVENT_ID AS SIGNED) AS EVENT_ID, + CAST(PARAMETER1 AS CHAR(64)) AS P1TEXT, + CAST(P1 AS SIGNED) AS P1, + CAST(PARAMETER2 AS CHAR(64)) AS P2TEXT, + CAST(P2 AS SIGNED) AS P2, + CAST(PARAMETER3 AS CHAR(64)) AS P3TEXT, + CAST(P3 AS SIGNED) AS P3, + CAST(WAIT_CLASS AS CHAR(64)) AS WAIT_CLASS, + CAST(WAIT_CLASS_ID AS SIGNED) AS WAIT_CLASS_ID, + CAST(TIME_WAITED AS SIGNED) AS TIME_WAITED, + CAST(SQL_PLAN_LINE_ID AS SIGNED) SQL_PLAN_LINE_ID, + CAST(GROUP_ID AS SIGNED) GROUP_ID, + CAST(PLAN_HASH AS UNSIGNED) PLAN_HASH, + CAST(THREAD_ID AS SIGNED) THREAD_ID, + CAST(STMT_TYPE AS SIGNED) STMT_TYPE, + CAST(TIME_MODEL AS SIGNED) TIME_MODEL, + CAST(IF (IN_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PARSE, + CAST(IF (IN_PL_PARSE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PL_PARSE, + CAST(IF (IN_PLAN_CACHE = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLAN_CACHE, + CAST(IF (IN_SQL_OPTIMIZE = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_OPTIMIZE, + CAST(IF (IN_SQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_SQL_EXECUTION, + CAST(IF (IN_PX_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PX_EXECUTION, + CAST(IF (IN_SEQUENCE_LOAD = 1, 'Y', 'N') AS CHAR(1)) AS IN_SEQUENCE_LOAD, + CAST(IF (IN_COMMITTING = 1, 'Y', 'N') AS CHAR(1)) AS IN_COMMITTING, + CAST(IF (IN_STORAGE_READ = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_READ, + CAST(IF (IN_STORAGE_WRITE = 1, 'Y', 'N') AS CHAR(1)) AS IN_STORAGE_WRITE, + CAST(IF (IN_REMOTE_DAS_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_REMOTE_DAS_EXECUTION, + CAST(IF (IN_FILTER_ROWS = 1, 'Y', 'N') AS CHAR(1)) AS IN_FILTER_ROWS, + CAST(CASE WHEN (TIME_MODEL & 16384) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_ENCODE, + CAST(CASE WHEN (TIME_MODEL & 32768) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_RPC_DECODE, + CAST(CASE WHEN (TIME_MODEL & 65536) > 0 THEN 'Y' ELSE 'N' END AS CHAR(1)) AS IN_CONNECTION_MGR, + CAST(PROGRAM AS CHAR(64)) AS PROGRAM, + CAST(MODULE AS CHAR(64)) AS MODULE, + CAST(ACTION AS CHAR(64)) AS ACTION, + CAST(CLIENT_ID AS CHAR(64)) AS CLIENT_ID, + CAST(BACKTRACE AS CHAR(512)) AS BACKTRACE, + CAST(TM_DELTA_TIME AS SIGNED) AS TM_DELTA_TIME, + CAST(TM_DELTA_CPU_TIME AS SIGNED) AS TM_DELTA_CPU_TIME, + CAST(TM_DELTA_DB_TIME AS SIGNED) AS TM_DELTA_DB_TIME, + CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, + CAST(IF (IN_PLSQL_COMPILATION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_COMPILATION, + CAST(IF (IN_PLSQL_EXECUTION = 1, 'Y', 'N') AS CHAR(1)) AS IN_PLSQL_EXECUTION, + CAST(PLSQL_ENTRY_OBJECT_ID AS SIGNED) AS PLSQL_ENTRY_OBJECT_ID, + CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS SIGNED) AS PLSQL_ENTRY_SUBPROGRAM_ID, + CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, + CAST(PLSQL_OBJECT_ID AS SIGNED) AS PLSQL_OBJECT_ID, + CAST(PLSQL_SUBPROGRAM_ID AS SIGNED) AS PLSQL_SUBPROGRAM_ID, + CAST(PLSQL_SUBPROGRAM_NAME AS CHAR(32)) AS PLSQL_SUBPROGRAM_NAME, + CAST(TX_ID AS SIGNED) AS TX_ID, + CAST(BLOCKING_SESSION_ID AS SIGNED) AS BLOCKING_SESSION_ID, + CAST(TABLET_ID AS SIGNED) AS TABLET_ID, + CAST(PROXY_SID AS SIGNED) AS PROXY_SID + FROM oceanbase.__all_virtual_ash ASH LEFT JOIN oceanbase.v$event_name on EVENT_NO = `event#` +""".replace("\n", " "), + normal_columns = [], +) + + +def_table_schema( + owner = 'roland.qk', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'V$OB_ACTIVE_SESSION_HISTORY', + table_id = '21508', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT + SVR_IP, + SVR_PORT, + SAMPLE_ID, + SAMPLE_TIME, + CON_ID, + USER_ID, + SESSION_ID, + SESSION_TYPE, + SESSION_STATE, + SQL_ID, + PLAN_ID, + TRACE_ID, + EVENT, + EVENT_NO, + EVENT_ID, + P1TEXT, + P1, + P2TEXT, + P2, + P3TEXT, + P3, + WAIT_CLASS, + WAIT_CLASS_ID, + TIME_WAITED, + SQL_PLAN_LINE_ID, + GROUP_ID, + PLAN_HASH, + THREAD_ID, + STMT_TYPE, + TIME_MODEL, + IN_PARSE, + IN_PL_PARSE, + IN_PLAN_CACHE, + IN_SQL_OPTIMIZE, + IN_SQL_EXECUTION, + IN_PX_EXECUTION, + IN_SEQUENCE_LOAD, + IN_COMMITTING, + IN_STORAGE_READ, + IN_STORAGE_WRITE, + IN_REMOTE_DAS_EXECUTION, + IN_FILTER_ROWS, + IN_RPC_ENCODE, + IN_RPC_DECODE, + IN_CONNECTION_MGR, + PROGRAM, + MODULE, + ACTION, + CLIENT_ID, + BACKTRACE, + TM_DELTA_TIME, + TM_DELTA_CPU_TIME, + TM_DELTA_DB_TIME, + TOP_LEVEL_SQL_ID, + IN_PLSQL_COMPILATION, + IN_PLSQL_EXECUTION, + PLSQL_ENTRY_OBJECT_ID, + PLSQL_ENTRY_SUBPROGRAM_ID, + PLSQL_ENTRY_SUBPROGRAM_NAME, + PLSQL_OBJECT_ID, + PLSQL_SUBPROGRAM_ID, + PLSQL_SUBPROGRAM_NAME, + TX_ID, + BLOCKING_SESSION_ID, + TABLET_ID, + PROXY_SID + FROM oceanbase.GV$OB_ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " "), + normal_columns = [], +) + def_table_schema( owner = 'tony.wzh', table_name = 'DBA_OB_TRUSTED_ROOT_CERTIFICATE', @@ -37595,8 +38739,51 @@ def_table_schema( FROM oceanbase.__all_virtual_nic_info """.replace("\n", " ") ) -# 21587: GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM -# 21588: V$OB_QUERY_RESPONSE_TIME_HISTOGRAM +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM', + table_id = '21587', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + svr_ip as SVR_IP, + svr_port as SVR_PORT, + tenant_id as TENANT_ID, + sql_type as SQL_TYPE, + cast ((response_time/1000000 ) as decimal(24,6)) as RESPONSE_TIME, + count as COUNT, + cast ((total/1000000) as decimal(24,6)) as TOTAL + FROM oceanbase.__all_virtual_query_response_time +""".replace("\n", " "), +) + +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'V$OB_QUERY_RESPONSE_TIME_HISTOGRAM', + table_id = '21588', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SVR_IP, + SVR_PORT, + TENANT_ID, + SQL_TYPE, + RESPONSE_TIME, + COUNT, + TOTAL + FROM + oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM + WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() +""".replace("\n", " "), +) def_table_schema( owner = 'fyy280124', @@ -38310,10 +39497,184 @@ def_table_schema( """.replace("\n", " ") ) # 21609: V$OB_VARIABLES_BY_SESSION -# 21610: GV$OB_RES_MGR_SYSSTAT -# 21611: V$OB_RES_MGR_SYSSTAT -# 21612: DBA_WR_SQL_PLAN -# 21613: CDB_WR_SQL_PLAN +def_table_schema( + owner = 'roland.qk', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'GV$OB_RES_MGR_SYSSTAT', + table_id = '21610', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """ + select tenant_id as CON_ID, + group_id as GROUP_ID, + svr_ip as SVR_IP, + svr_port as SVR_PORT, + `statistic#` as `STATISTIC#`, + name as NAME, + class as CLASS, + value as VALUE, + value_type as VALUE_TYPE, + stat_id as STAT_ID + from oceanbase.__all_virtual_res_mgr_sysstat + where can_visible = true +""".replace("\n", " "), + + normal_columns = [ + ], +) + +def_table_schema( + owner = 'roland.qk', + tablegroup_id = 'OB_INVALID_ID', + table_name = 'V$OB_RES_MGR_SYSSTAT', + table_id = '21611', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT CON_ID, + GROUP_ID, + SVR_IP, + SVR_PORT, + `STATISTIC#`, + NAME, + CLASS, + VALUE, + VALUE_TYPE, + STAT_ID FROM OCEANBASE.GV$OB_RES_MGR_SYSSTAT + WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " "), + + normal_columns = [], +) + +def_table_schema( + owner = 'zhangyiqiang.zyq', + table_name = 'DBA_WR_SQL_PLAN', + table_id = '21612', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SQLPLAN.TENANT_ID AS TENANT_ID, + SQLPLAN.CLUSTER_ID AS CLUSTER_ID, + SQLPLAN.SNAP_ID AS SNAP_ID, + SQLPLAN.SVR_IP AS SVR_IP, + SQLPLAN.SVR_PORT AS SVR_PORT, + SQLPLAN.SQL_ID AS SQL_ID, + SQLPLAN.PLAN_HASH AS PLAN_HASH, + SQLPLAN.PLAN_ID AS PLAN_ID, + SQLPLAN.ID AS ID, + SQLPLAN.DB_ID AS DB_ID, + SQLPLAN.GMT_CREATE AS GMT_CREATE, + SQLPLAN.OPERATOR AS OPERATOR, + SQLPLAN.OPTIONS AS OPTIONS, + SQLPLAN.OBJECT_NODE AS OBJECT_NODE, + SQLPLAN.OBJECT_ID AS OBJECT_ID, + SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, + SQLPLAN.OBJECT_NAME AS OBJECT_NAME, + SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, + SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, + SQLPLAN.OPTIMIZER AS OPTIMIZER, + SQLPLAN.PARENT_ID AS PARENT_ID, + SQLPLAN.DEPTH AS DEPTH, + SQLPLAN.POSITION AS POSITION, + SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, + SQLPLAN.COST AS COST, + SQLPLAN.REAL_COST AS REAL_COST, + SQLPLAN.CARDINALITY AS CARDINALITY, + SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, + SQLPLAN.BYTES AS BYTES, + SQLPLAN.ROWSET AS ROWSET, + SQLPLAN.OTHER_TAG AS OTHER_TAG, + SQLPLAN.PARTITION_START AS PARTITION_START, + SQLPLAN.other AS OTHER, + SQLPLAN.CPU_COST AS CPU_COST, + SQLPLAN.IO_COST AS IO_COST, + SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, + SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, + SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, + SQLPLAN.PROJECTION AS PROJECTION, + SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, + SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, + SQLPLAN.REMARKS AS REMARKS, + SQLPLAN.OTHER_XML AS OTHER_XML + FROM + ( + oceanbase.__all_virtual_wr_sql_plan SQLPLAN + ) + WHERE + SQLPLAN.TENANT_ID = EFFECTIVE_TENANT_ID() + """.replace("\n", " ") +) + +def_table_schema( + owner = 'zhangyiqiang.zyq', + table_name = 'CDB_WR_SQL_PLAN', + table_id = '21613', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + view_definition = + """ + SELECT + SQLPLAN.TENANT_ID AS TENANT_ID, + SQLPLAN.CLUSTER_ID AS CLUSTER_ID, + SQLPLAN.SNAP_ID AS SNAP_ID, + SQLPLAN.SVR_IP AS SVR_IP, + SQLPLAN.SVR_PORT AS SVR_PORT, + SQLPLAN.SQL_ID AS SQL_ID, + SQLPLAN.PLAN_HASH AS PLAN_HASH, + SQLPLAN.PLAN_ID AS PLAN_ID, + SQLPLAN.ID AS ID, + SQLPLAN.DB_ID AS DB_ID, + SQLPLAN.GMT_CREATE AS GMT_CREATE, + SQLPLAN.OPERATOR AS OPERATOR, + SQLPLAN.OPTIONS AS OPTIONS, + SQLPLAN.OBJECT_NODE AS OBJECT_NODE, + SQLPLAN.OBJECT_ID AS OBJECT_ID, + SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, + SQLPLAN.OBJECT_NAME AS OBJECT_NAME, + SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, + SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, + SQLPLAN.OPTIMIZER AS OPTIMIZER, + SQLPLAN.PARENT_ID AS PARENT_ID, + SQLPLAN.DEPTH AS DEPTH, + SQLPLAN.POSITION AS POSITION, + SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, + SQLPLAN.COST AS COST, + SQLPLAN.REAL_COST AS REAL_COST, + SQLPLAN.CARDINALITY AS CARDINALITY, + SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, + SQLPLAN.BYTES AS BYTES, + SQLPLAN.ROWSET AS ROWSET, + SQLPLAN.OTHER_TAG AS OTHER_TAG, + SQLPLAN.PARTITION_START AS PARTITION_START, + SQLPLAN.other AS OTHER, + SQLPLAN.CPU_COST AS CPU_COST, + SQLPLAN.IO_COST AS IO_COST, + SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, + SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, + SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, + SQLPLAN.PROJECTION AS PROJECTION, + SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, + SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, + SQLPLAN.REMARKS AS REMARKS, + SQLPLAN.OTHER_XML AS OTHER_XML + FROM + ( + oceanbase.__all_virtual_wr_sql_plan SQLPLAN + ) + """.replace("\n", " ") +) + # 21614: DBA_WR_RES_MGR_SYSSTAT # 21615: CDB_WR_RES_MGR_SYSSTAT @@ -56469,6 +57830,9 @@ def_table_schema( ASH.P2 AS P2, ASH.P3 AS P3, ASH.SQL_PLAN_LINE_ID AS SQL_PLAN_LINE_ID, + ASH.PLAN_HASH AS PLAN_HASH, + ASH.THREAD_ID AS THREAD_ID, + ASH.STMT_TYPE AS STMT_TYPE, ASH.GROUP_ID AS GROUP_ID, ASH.TX_ID AS TX_ID, ASH.BLOCKING_SESSION_ID AS BLOCKING_SESSION_ID, @@ -56487,6 +57851,9 @@ def_table_schema( CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 2048) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 4096) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 8192) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_FILTER_ROWS, + CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 16384) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_ENCODE, + CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 32768) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_DECODE, + CAST(CASE WHEN BITAND(ASH.TIME_MODEL , 65536) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_CONNECTION_MGR, ASH.PROGRAM AS PROGRAM, ASH.MODULE AS MODULE, ASH.ACTION AS ACTION, @@ -56506,7 +57873,9 @@ def_table_schema( ASH.DELTA_READ_IO_REQUESTS AS DELTA_READ_IO_REQUESTS, ASH.DELTA_READ_IO_BYTES AS DELTA_READ_IO_BYTES, ASH.DELTA_WRITE_IO_REQUESTS AS DELTA_WRITE_IO_REQUESTS, - ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES + ASH.DELTA_WRITE_IO_BYTES AS DELTA_WRITE_IO_BYTES, + ASH.TABLET_ID AS TABLET_ID, + ASH.PROXY_SID AS PROXY_SID FROM SYS.ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY ASH, SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP @@ -57657,8 +59026,65 @@ def_table_schema( ) # 25268: DBA_OB_IMPORT_STMT_EXEC_HISTORY -# 25269: DBA_WR_SYSTEM_EVENT -# 25270: DBA_WR_EVENT_NAME +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_SYSTEM_EVENT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25269', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SETTING.SNAP_ID AS SNAP_ID, + SETTING.SVR_IP AS SVR_IP, + SETTING.SVR_PORT AS SVR_PORT, + SETTING.EVENT_ID AS EVENT_ID, + EN.EVENT_NAME AS EVENT_NAME, + EN.WAIT_CLASS_ID AS WAIT_CLASS_ID, + EN.WAIT_CLASS AS WAIT_CLASS, + SETTING.TOTAL_WAITS AS TOTAL_WAITS, + SETTING.TOTAL_TIMEOUTS AS TOTAL_TIMEOUTS, + SETTING.TIME_WAITED_MICRO AS TIME_WAITED_MICRO + FROM + SYS.ALL_VIRTUAL_WR_SYSTEM_EVENT SETTING, + SYS.ALL_VIRTUAL_WR_EVENT_NAME EN + WHERE + SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() + AND EN.EVENT_ID = SETTING.EVENT_ID + AND EN.TENANT_ID = SETTING.TENANT_ID + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_EVENT_NAME', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25270', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SETTING.EVENT_ID AS EVENT_ID, + SETTING.EVENT_NAME AS EVENT_NAME, + SETTING.PARAMETER1 AS PARAMETER1, + SETTING.PARAMETER2 AS PARAMETER2, + SETTING.PARAMETER3 AS PARAMETER3, + SETTING.WAIT_CLASS_ID AS WAIT_CLASS_ID, + SETTING.WAIT_CLASS AS WAIT_CLASS + FROM + SYS.ALL_VIRTUAL_WR_EVENT_NAME SETTING + WHERE + SETTING.TENANT_ID = EFFECTIVE_TENANT_ID() + """.replace("\n", " ") +) + # 25271: DBA_SCHEDULER_RUNNING_JOBS def_table_schema( @@ -57689,12 +59115,124 @@ def_table_schema( FROM SYS.TENANT_VIRTUAL_OUTLINE_AGENT A, SYS.ALL_VIRTUAL_OUTLINE_REAL_AGENT B WHERE A.OUTLINE_ID = B.OUTLINE_ID AND B.FORMAT_OUTLINE != 0; """.replace("\n", " "), - normal_columns = [ - ], + normal_columns = [ + ], +) + +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'DBA_WR_SQLSTAT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25273', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + STAT.SNAP_ID AS SNAP_ID, + STAT.SVR_IP AS SVR_IP, + STAT.SVR_PORT AS SVR_PORT, + STAT.SQL_ID AS SQL_ID, + STAT.PLAN_HASH AS PLAN_HASH, + STAT.PLAN_TYPE AS PLAN_TYPE, + STAT.MODULE AS MODULE, + STAT.ACTION AS ACTION, + STAT.PARSING_DB_ID AS PARSING_DB_ID, + STAT.PARSING_DB_NAME AS PARSING_DB_NAME, + STAT.PARSING_USER_ID AS PARSING_USER_ID, + STAT.EXECUTIONS_TOTAL AS EXECUTIONS_TOTAL, + STAT.EXECUTIONS_DELTA AS EXECUTIONS_DELTA, + STAT.DISK_READS_TOTAL AS DISK_READS_TOTAL, + STAT.DISK_READS_DELTA AS DISK_READS_DELTA, + STAT.BUFFER_GETS_TOTAL AS BUFFER_GETS_TOTAL, + STAT.BUFFER_GETS_DELTA AS BUFFER_GETS_DELTA, + STAT.ELAPSED_TIME_TOTAL AS ELAPSED_TIME_TOTAL, + STAT.ELAPSED_TIME_DELTA AS ELAPSED_TIME_DELTA, + STAT.CPU_TIME_TOTAL AS CPU_TIME_TOTAL, + STAT.CPU_TIME_DELTA AS CPU_TIME_DELTA, + STAT.CCWAIT_TOTAL AS CCWAIT_TOTAL, + STAT.CCWAIT_DELTA AS CCWAIT_DELTA, + STAT.USERIO_WAIT_TOTAL AS USERIO_WAIT_TOTAL, + STAT.USERIO_WAIT_DELTA AS USERIO_WAIT_DELTA, + STAT.APWAIT_TOTAL AS APWAIT_TOTAL, + STAT.APWAIT_DELTA AS APWAIT_DELTA, + STAT.PHYSICAL_READ_REQUESTS_TOTAL AS PHYSICAL_READ_REQUESTS_TOTAL, + STAT.PHYSICAL_READ_REQUESTS_DELTA AS PHYSICAL_READ_REQUESTS_DELTA, + STAT.PHYSICAL_READ_BYTES_TOTAL AS PHYSICAL_READ_BYTES_TOTAL, + STAT.PHYSICAL_READ_BYTES_DELTA AS PHYSICAL_READ_BYTES_DELTA, + STAT.WRITE_THROTTLE_TOTAL AS WRITE_THROTTLE_TOTAL, + STAT.WRITE_THROTTLE_DELTA AS WRITE_THROTTLE_DELTA, + STAT.ROWS_PROCESSED_TOTAL AS ROWS_PROCESSED_TOTAL, + STAT.ROWS_PROCESSED_DELTA AS ROWS_PROCESSED_DELTA, + STAT.MEMSTORE_READ_ROWS_TOTAL AS MEMSTORE_READ_ROWS_TOTAL, + STAT.MEMSTORE_READ_ROWS_DELTA AS MEMSTORE_READ_ROWS_DELTA, + STAT.MINOR_SSSTORE_READ_ROWS_TOTAL AS MINOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MINOR_SSSTORE_READ_ROWS_DELTA AS MINOR_SSSTORE_READ_ROWS_DELTA, + STAT.MAJOR_SSSTORE_READ_ROWS_TOTAL AS MAJOR_SSSTORE_READ_ROWS_TOTAL, + STAT.MAJOR_SSSTORE_READ_ROWS_DELTA AS MAJOR_SSSTORE_READ_ROWS_DELTA, + STAT.RPC_TOTAL AS RPC_TOTAL, + STAT.RPC_DELTA AS RPC_DELTA, + STAT.FETCHES_TOTAL AS FETCHES_TOTAL, + STAT.FETCHES_DELTA AS FETCHES_DELTA, + STAT.RETRY_TOTAL AS RETRY_TOTAL, + STAT.RETRY_DELTA AS RETRY_DELTA, + STAT.PARTITION_TOTAL AS PARTITION_TOTAL, + STAT.PARTITION_DELTA AS PARTITION_DELTA, + STAT.NESTED_SQL_TOTAL AS NESTED_SQL_TOTAL, + STAT.NESTED_SQL_DELTA AS NESTED_SQL_DELTA, + STAT.SOURCE_IP AS SOURCE_IP, + STAT.SOURCE_PORT AS SOURCE_PORT, + STAT.ROUTE_MISS_TOTAL AS ROUTE_MISS_TOTAL, + STAT.ROUTE_MISS_DELTA AS ROUTE_MISS_DELTA, + STAT.FIRST_LOAD_TIME AS FIRST_LOAD_TIME, + STAT.PLAN_CACHE_HIT_TOTAL AS PLAN_CACHE_HIT_TOTAL, + STAT.PLAN_CACHE_HIT_DELTA AS PLAN_CACHE_HIT_DELTA + FROM + SYS.ALL_VIRTUAL_WR_SQLSTAT STAT, + SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP + WHERE + STAT.TENANT_ID = EFFECTIVE_TENANT_ID() + AND STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + AND STAT.SVR_IP = SNAP.SVR_IP + AND STAT.SVR_PORT = SNAP.SVR_PORT + AND SNAP.STATUS = 0 + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'DBA_WR_SYS_TIME_MODEL', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25274', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + SNAP_ID AS SNAP_ID, + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + SYS.DBA_WR_SYSSTAT.STAT_ID AS STAT_ID, + STAT_NAME AS STAT_NAME, + VALUE AS VALUE + FROM + SYS.DBA_WR_SYSSTAT + left join + SYS.DBA_WR_STATNAME + on SYS.DBA_WR_SYSSTAT.STAT_ID=SYS.DBA_WR_STATNAME.STAT_ID + WHERE + SYS.DBA_WR_SYSSTAT.STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); +""".replace("\n", " ") ) -# 25273: DBA_WR_SQLSTAT -# 25274: DBA_WR_SYS_TIME_MODEL def_table_schema( owner = 'msy164651', table_name = 'DBA_OB_TRANSFER_PARTITION_TASKS', @@ -57748,8 +59286,35 @@ def_table_schema( FROM SYS.ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT """.replace("\n", " "), ) -# 25277: DBA_WR_SQLTEXT - +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'DBA_WR_SQLTEXT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25277', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + STAT.SNAP_ID AS SNAP_ID, + STAT.SQL_ID AS SQL_ID, + STAT.QUERY_SQL AS QUERY_SQL, + STAT.SQL_TYPE AS SQL_TYPE + FROM + SYS.ALL_VIRTUAL_WR_SQLTEXT STAT, + SYS.ALL_VIRTUAL_WR_SNAPSHOT SNAP + WHERE + STAT.TENANT_ID = EFFECTIVE_TENANT_ID() + AND STAT.CLUSTER_ID = SNAP.CLUSTER_ID + AND STAT.TENANT_ID = SNAP.TENANT_ID + AND STAT.SNAP_ID = SNAP.SNAP_ID + AND SNAP.STATUS = 0 + """.replace("\n", " ") +) def_table_schema( owner = 'sean.yyj', table_name = 'USER_USERS', @@ -59281,7 +60846,9 @@ def_table_schema( stmt_type as STMT_TYPE, total_memstore_read_row_count as TOTAL_MEMSTORE_READ_ROW_COUNT, total_ssstore_read_row_count as TOTAL_SSSTORE_READ_ROW_COUNT, - proxy_user as PROXY_USER + proxy_user as PROXY_USER, + seq_num as SEQ_NUM, + network_wait_time as NETWORK_WAIT_TIME FROM SYS.ALL_VIRTUAL_SQL_AUDIT """.replace("\n", " ") ) @@ -59396,7 +60963,9 @@ FORMAT_SQL_ID, STMT_TYPE, TOTAL_MEMSTORE_READ_ROW_COUNT, TOTAL_SSSTORE_READ_ROW_COUNT, -PROXY_USER FROM SYS.GV$OB_SQL_AUDIT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +PROXY_USER, +SEQ_NUM, +NETWORK_WAIT_TIME FROM SYS.GV$OB_SQL_AUDIT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() """.replace("\n", " ") ) @@ -60013,7 +61582,7 @@ def_table_schema( def_table_schema( - owner = 'yuzhong.zhao', + owner = 'roland.qk', table_name = 'GV$SYSSTAT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -60037,7 +61606,7 @@ def_table_schema( ) def_table_schema( - owner = 'yuzhong.zhao', + owner = 'roland.qk', table_name = 'V$SYSSTAT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -64583,7 +66152,7 @@ FROM SYS.TENANT_VIRTUAL_EVENT_NAME def_table_schema( - owner = 'xiaochu.yh', + owner = 'roland.qk', table_name = 'GV$ACTIVE_SESSION_HISTORY', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -64594,80 +66163,7 @@ def_table_schema( gm_columns = [], in_tenant_space = True, view_definition = """SELECT - CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, - CAST(SVR_PORT AS NUMBER) AS SVR_PORT, - CAST(SAMPLE_ID AS NUMBER) AS SAMPLE_ID, - CAST(SAMPLE_TIME AS TIMESTAMP) AS SAMPLE_TIME, - CAST(TENANT_ID AS NUMBER) AS CON_ID, - CAST(USER_ID AS NUMBER) AS USER_ID, - CAST(SESSION_ID AS NUMBER) AS SESSION_ID, - CAST(DECODE(SESSION_TYPE, 0, 'FOREGROUND', 'BACKGROUND') AS VARCHAR2(10)) AS SESSION_TYPE, - CAST(DECODE(EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, - CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, - CAST(PLAN_ID AS NUMBER) AS PLAN_ID, - CAST(TRACE_ID AS VARCHAR(64)) AS TRACE_ID, - CAST(NAME AS VARCHAR2(64)) AS EVENT, - CAST(EVENT_NO AS NUMBER) AS EVENT_NO, - CAST(SYS.ALL_VIRTUAL_ASH.EVENT_ID AS NUMBER) AS EVENT_ID, - CAST(PARAMETER1 AS VARCHAR2(64)) AS P1TEXT, - CAST(P1 AS NUMBER) AS P1, - CAST(PARAMETER2 AS VARCHAR2(64)) AS P2TEXT, - CAST(P2 AS NUMBER) AS P2, - CAST(PARAMETER3 AS VARCHAR2(64)) AS P3TEXT, - CAST(P3 AS NUMBER) AS P3, - CAST(WAIT_CLASS AS VARCHAR2(64)) AS WAIT_CLASS, - CAST(WAIT_CLASS_ID AS NUMBER) AS WAIT_CLASS_ID, - CAST(TIME_WAITED AS NUMBER) AS TIME_WAITED, - CAST(SQL_PLAN_LINE_ID AS NUMBER) SQL_PLAN_LINE_ID, - CAST(GROUP_ID AS NUMBER) GROUP_ID, - CAST(TX_ID AS NUMBER) TX_ID, - CAST(BLOCKING_SESSION_ID AS NUMBER) BLOCKING_SESSION_ID, - CAST(DECODE(IN_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PARSE, - CAST(DECODE(IN_PL_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PL_PARSE, - CAST(DECODE(IN_PLAN_CACHE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLAN_CACHE, - CAST(DECODE(IN_SQL_OPTIMIZE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, - CAST(DECODE(IN_SQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_EXECUTION, - CAST(DECODE(IN_PX_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PX_EXECUTION, - CAST(DECODE(IN_SEQUENCE_LOAD, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, - CAST(DECODE(IN_COMMITTING, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_COMMITTING, - CAST(DECODE(IN_STORAGE_READ, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_READ, - CAST(DECODE(IN_STORAGE_WRITE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_WRITE, - CAST(DECODE(IN_REMOTE_DAS_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, - CAST(DECODE(IN_FILTER_ROWS, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_FILTER_ROWS, - CAST(PROGRAM AS VARCHAR2(64)) AS PROGRAM, - CAST(MODULE AS VARCHAR2(64)) AS MODULE, - CAST(ACTION AS VARCHAR2(64)) AS ACTION, - CAST(CLIENT_ID AS VARCHAR2(64)) AS CLIENT_ID, - CAST(BACKTRACE AS VARCHAR2(512)) AS BACKTRACE, - CAST(TM_DELTA_TIME AS NUMBER) AS TM_DELTA_TIME, - CAST(TM_DELTA_CPU_TIME AS NUMBER) AS TM_DELTA_CPU_TIME, - CAST(TM_DELTA_DB_TIME AS NUMBER) AS TM_DELTA_DB_TIME, - CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, - CAST(DECODE(IN_PLSQL_COMPILATION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, - CAST(DECODE(IN_PLSQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, - CAST(PLSQL_ENTRY_OBJECT_ID AS NUMBER) AS PLSQL_ENTRY_OBJECT_ID, - CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS NUMBER) AS PLSQL_ENTRY_SUBPROGRAM_ID, - CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, - CAST(PLSQL_OBJECT_ID AS NUMBER) AS PLSQL_OBJECT_ID, - CAST(PLSQL_SUBPROGRAM_ID AS NUMBER) AS PLSQL_SUBPROGRAM_ID, - CAST(PLSQL_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_SUBPROGRAM_NAME - FROM SYS.ALL_VIRTUAL_ASH LEFT JOIN SYS.V$EVENT_NAME on EVENT_NO = "EVENT#" -""".replace("\n", " "), -) - -def_table_schema( - owner = 'xiaochu.yh', - table_name = 'V$ACTIVE_SESSION_HISTORY', - name_postfix = '_ORA', - database_id = 'OB_ORA_SYS_DATABASE_ID', - table_id = '28140', - table_type = 'SYSTEM_VIEW', - rowkey_columns = [], - normal_columns = [], - gm_columns = [], - in_tenant_space = True, - view_definition = """SELECT - SVR_IP, +SVR_IP, SVR_PORT, SAMPLE_ID, SAMPLE_TIME, @@ -64693,8 +66189,10 @@ WAIT_CLASS_ID, TIME_WAITED, SQL_PLAN_LINE_ID, GROUP_ID, -TX_ID, -BLOCKING_SESSION_ID, +PLAN_HASH, +THREAD_ID, +STMT_TYPE, +TIME_MODEL, IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, @@ -64707,6 +66205,9 @@ IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION, IN_FILTER_ROWS, +IN_RPC_ENCODE, +IN_RPC_DECODE, +IN_CONNECTION_MGR, PROGRAM, MODULE, ACTION, @@ -64723,7 +66224,92 @@ PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_ENTRY_SUBPROGRAM_NAME, PLSQL_OBJECT_ID, PLSQL_SUBPROGRAM_ID, -PLSQL_SUBPROGRAM_NAME FROM SYS.GV$ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +PLSQL_SUBPROGRAM_NAME, +TX_ID, +BLOCKING_SESSION_ID, +TABLET_ID, +PROXY_SID FROM SYS.GV$OB_ACTIVE_SESSION_HISTORY +""".replace("\n", " "), +) + +def_table_schema( + owner = 'xiaochu.yh', + table_name = 'V$ACTIVE_SESSION_HISTORY', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28140', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + SVR_IP, + SVR_PORT, + SAMPLE_ID, + SAMPLE_TIME, + CON_ID, + USER_ID, + SESSION_ID, + SESSION_TYPE, + SESSION_STATE, + SQL_ID, + PLAN_ID, + TRACE_ID, + EVENT, + EVENT_NO, + EVENT_ID, + P1TEXT, + P1, + P2TEXT, + P2, + P3TEXT, + P3, + WAIT_CLASS, + WAIT_CLASS_ID, + TIME_WAITED, + SQL_PLAN_LINE_ID, + GROUP_ID, + PLAN_HASH, + THREAD_ID, + STMT_TYPE, + TIME_MODEL, + IN_PARSE, + IN_PL_PARSE, + IN_PLAN_CACHE, + IN_SQL_OPTIMIZE, + IN_SQL_EXECUTION, + IN_PX_EXECUTION, + IN_SEQUENCE_LOAD, + IN_COMMITTING, + IN_STORAGE_READ, + IN_STORAGE_WRITE, + IN_REMOTE_DAS_EXECUTION, + IN_FILTER_ROWS, + IN_RPC_ENCODE, + IN_RPC_DECODE, + IN_CONNECTION_MGR, + PROGRAM, + MODULE, + ACTION, + CLIENT_ID, + BACKTRACE, + TM_DELTA_TIME, + TM_DELTA_CPU_TIME, + TM_DELTA_DB_TIME, + TOP_LEVEL_SQL_ID, + IN_PLSQL_COMPILATION, + IN_PLSQL_EXECUTION, + PLSQL_ENTRY_OBJECT_ID, + PLSQL_ENTRY_SUBPROGRAM_ID, + PLSQL_ENTRY_SUBPROGRAM_NAME, + PLSQL_OBJECT_ID, + PLSQL_SUBPROGRAM_ID, + PLSQL_SUBPROGRAM_NAME, + TX_ID, + BLOCKING_SESSION_ID, + TABLET_ID, + PROXY_SID FROM SYS.GV$ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() """.replace("\n", " "), ) @@ -66394,13 +67980,286 @@ FROM SYS.GV$OB_CGROUP_CONFIG WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() """.replace("\n", " "), ) -# 28203: GV$OB_SQLSTAT -# 28204: V$OB_SQLSTAT -# 28205: GV$OB_SESS_TIME_MODEL -# 28206: V$OB_SESS_TIME_MODEL -# 28207: GV$OB_SYS_TIME_MODEL -# 28208: V$OB_SYS_TIME_MODEL -# 28209: V$STATNAME + +def_table_schema( + owner = 'yuchen.wyc', + table_name = 'GV$OB_SQLSTAT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28203', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, + CAST(SVR_PORT AS NUMBER) AS SVR_PORT, + CAST(TENANT_ID AS NUMBER) AS TENANT_ID, + CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, + CAST(PLAN_ID AS NUMBER) AS PLAN_ID, + CAST(PLAN_HASH AS NUMBER) AS PLAN_HASH, + CAST(PLAN_TYPE AS NUMBER) AS PLAN_TYPE, + TO_CLOB(QUERY_SQL) AS QUERY_SQL, + CAST(MODULE AS VARCHAR(64)) AS MODULE, + CAST(ACTION AS VARCHAR(64)) AS ACTION, + CAST(PARSING_DB_ID AS NUMBER) AS PARSING_DB_ID, + CAST(PARSING_DB_NAME AS VARCHAR(128)) AS PARSING_DB_NAME, + CAST(PARSING_USER_ID AS NUMBER) AS PARSING_USER_ID, + CAST(EXECUTIONS_TOTAL AS NUMBER) AS EXECUTIONS_TOTAL, + CAST(EXECUTIONS_DELTA AS NUMBER) AS EXECUTIONS_DELTA, + CAST(DISK_READS_TOTAL AS NUMBER) AS DISK_READS_TOTAL, + CAST(DISK_READS_DELTA AS NUMBER) AS DISK_READS_DELTA, + CAST(BUFFER_GETS_TOTAL AS NUMBER) AS BUFFER_GETS_TOTAL, + CAST(BUFFER_GETS_DELTA AS NUMBER) AS BUFFER_GETS_DELTA, + CAST(ELAPSED_TIME_TOTAL AS NUMBER) AS ELAPSED_TIME_TOTAL, + CAST(ELAPSED_TIME_DELTA AS NUMBER) AS ELAPSED_TIME_DELTA, + CAST(CPU_TIME_TOTAL AS NUMBER) AS CPU_TIME_TOTAL, + CAST(CPU_TIME_DELTA AS NUMBER) AS CPU_TIME_DELTA, + CAST(CCWAIT_TOTAL AS NUMBER) AS CCWAIT_TOTAL, + CAST(CCWAIT_DELTA AS NUMBER) AS CCWAIT_DELTA, + CAST(USERIO_WAIT_TOTAL AS NUMBER) AS USERIO_WAIT_TOTAL, + CAST(USERIO_WAIT_DELTA AS NUMBER) AS USERIO_WAIT_DELTA, + CAST(APWAIT_TOTAL AS NUMBER) AS APWAIT_TOTAL, + CAST(APWAIT_DELTA AS NUMBER) AS APWAIT_DELTA, + CAST(PHYSICAL_READ_REQUESTS_TOTAL AS NUMBER) AS PHYSICAL_READ_REQUESTS_TOTAL, + CAST(PHYSICAL_READ_REQUESTS_DELTA AS NUMBER) AS PHYSICAL_READ_REQUESTS_DELTA, + CAST(PHYSICAL_READ_BYTES_TOTAL AS NUMBER) AS PHYSICAL_READ_BYTES_TOTAL, + CAST(PHYSICAL_READ_BYTES_DELTA AS NUMBER) AS PHYSICAL_READ_BYTES_DELTA, + CAST(WRITE_THROTTLE_TOTAL AS NUMBER) AS WRITE_THROTTLE_TOTAL, + CAST(WRITE_THROTTLE_DELTA AS NUMBER) AS WRITE_THROTTLE_DELTA, + CAST(ROWS_PROCESSED_TOTAL AS NUMBER) AS ROWS_PROCESSED_TOTAL, + CAST(ROWS_PROCESSED_DELTA AS NUMBER) AS ROWS_PROCESSED_DELTA, + CAST(MEMSTORE_READ_ROWS_TOTAL AS NUMBER) AS MEMSTORE_READ_ROWS_TOTAL, + CAST(MEMSTORE_READ_ROWS_DELTA AS NUMBER) AS MEMSTORE_READ_ROWS_DELTA, + CAST(MINOR_SSSTORE_READ_ROWS_TOTAL AS NUMBER) AS MINOR_SSSTORE_READ_ROWS_TOTAL, + CAST(MINOR_SSSTORE_READ_ROWS_DELTA AS NUMBER) AS MINOR_SSSTORE_READ_ROWS_DELTA, + CAST(MAJOR_SSSTORE_READ_ROWS_TOTAL AS NUMBER) AS MAJOR_SSSTORE_READ_ROWS_TOTAL, + CAST(MAJOR_SSSTORE_READ_ROWS_DELTA AS NUMBER) AS MAJOR_SSSTORE_READ_ROWS_DELTA, + CAST(RPC_TOTAL AS NUMBER) AS RPC_TOTAL, + CAST(RPC_DELTA AS NUMBER) AS RPC_DELTA, + CAST(FETCHES_TOTAL AS NUMBER) AS FETCHES_TOTAL, + CAST(FETCHES_DELTA AS NUMBER) AS FETCHES_DELTA, + CAST(RETRY_TOTAL AS NUMBER) AS RETRY_TOTAL, + CAST(RETRY_DELTA AS NUMBER) AS RETRY_DELTA, + CAST(PARTITION_TOTAL AS NUMBER) AS PARTITION_TOTAL, + CAST(PARTITION_DELTA AS NUMBER) AS PARTITION_DELTA, + CAST(NESTED_SQL_TOTAL AS NUMBER) AS NESTED_SQL_TOTAL, + CAST(NESTED_SQL_DELTA AS NUMBER) AS NESTED_SQL_DELTA, + CAST(SOURCE_IP AS CHAR(46)) AS SOURCE_IP, + CAST(SOURCE_PORT AS NUMBER) AS SOURCE_PORT, + CAST(ROUTE_MISS_TOTAL AS NUMBER) AS ROUTE_MISS_TOTAL, + CAST(ROUTE_MISS_DELTA AS NUMBER) AS ROUTE_MISS_DELTA, + CAST(FIRST_LOAD_TIME AS TIMESTAMP(6)) AS FIRST_LOAD_TIME, + CAST(PLAN_CACHE_HIT_TOTAL AS NUMBER) AS PLAN_CACHE_HIT_TOTAL, + CAST(PLAN_CACHE_HIT_DELTA AS NUMBER) AS PLAN_CACHE_HIT_DELTA + FROM SYS.ALL_VIRTUAL_SQLSTAT +""".replace("\n", " "), +) + +def_table_schema( + owner = 'yuchen.wyc', + table_name = 'V$OB_SQLSTAT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28204', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT SVR_IP, +SVR_PORT, +TENANT_ID, +SQL_ID, +PLAN_ID, +PLAN_HASH, +PLAN_TYPE, +QUERY_SQL, +MODULE, +ACTION, +PARSING_DB_ID, +PARSING_DB_NAME, +PARSING_USER_ID, +EXECUTIONS_TOTAL, +EXECUTIONS_DELTA, +DISK_READS_TOTAL, +DISK_READS_DELTA, +BUFFER_GETS_TOTAL, +BUFFER_GETS_DELTA, +ELAPSED_TIME_TOTAL, +ELAPSED_TIME_DELTA, +CPU_TIME_TOTAL, +CPU_TIME_DELTA, +CCWAIT_TOTAL, +CCWAIT_DELTA, +USERIO_WAIT_TOTAL, +USERIO_WAIT_DELTA, +APWAIT_TOTAL, +APWAIT_DELTA, +PHYSICAL_READ_REQUESTS_TOTAL, +PHYSICAL_READ_REQUESTS_DELTA, +PHYSICAL_READ_BYTES_TOTAL, +PHYSICAL_READ_BYTES_DELTA, +WRITE_THROTTLE_TOTAL, +WRITE_THROTTLE_DELTA, +ROWS_PROCESSED_TOTAL, +ROWS_PROCESSED_DELTA, +MEMSTORE_READ_ROWS_TOTAL, +MEMSTORE_READ_ROWS_DELTA, +MINOR_SSSTORE_READ_ROWS_TOTAL, +MINOR_SSSTORE_READ_ROWS_DELTA, +MAJOR_SSSTORE_READ_ROWS_TOTAL, +MAJOR_SSSTORE_READ_ROWS_DELTA, +RPC_TOTAL, +RPC_DELTA, +FETCHES_TOTAL, +FETCHES_DELTA, +RETRY_TOTAL, +RETRY_DELTA, +PARTITION_TOTAL, +PARTITION_DELTA, +NESTED_SQL_TOTAL, +NESTED_SQL_DELTA, +SOURCE_IP, +SOURCE_PORT, +ROUTE_MISS_TOTAL, +ROUTE_MISS_DELTA, +FIRST_LOAD_TIME, +PLAN_CACHE_HIT_TOTAL, +PLAN_CACHE_HIT_DELTA FROM SYS.GV$OB_SQLSTAT WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_SESS_TIME_MODEL', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28205', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SID, + CAST(GV$SESSTAT.CON_ID AS NUMBER) AS TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + CAST(NAME AS VARCHAR2(64)) AS STAT_NAME, + VALUE + FROM + SYS.GV$SESSTAT + left join + SYS.v$statname + on SYS.GV$SESSTAT.statistic#=SYS.v$statname.statistic# + WHERE + STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_SESS_TIME_MODEL', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28206', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SID, + TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + STAT_NAME, + VALUE + FROM + SYS.GV$OB_SESS_TIME_MODEL + WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT(); + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_SYS_TIME_MODEL', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28207', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + CON_ID AS TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + CAST(NAME AS VARCHAR2(64)) AS STAT_NAME, + VALUE + FROM + SYS.GV$SYSSTAT + WHERE + STAT_ID in (200001, 200002, 200010, 200011, 200005, 200006); + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_SYS_TIME_MODEL', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28208', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + TENANT_ID, + SVR_IP, + SVR_PORT, + STAT_ID, + STAT_NAME, + VALUE + FROM + SYS.GV$OB_SYS_TIME_MODEL + WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT(); + """.replace("\n", " ") +) +def_table_schema( + owner = 'roland.qk', + table_name = 'V$STATNAME', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28209', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + select CAST(TENANT_ID AS NUMBER) AS CON_ID, + CAST(STAT_ID AS NUMBER) as STAT_ID, + CAST("STATISTIC#" AS NUMBER) as "STATISTIC#", + CAST(NAME AS VARCHAR2(64)) AS NAME, + CAST(DISPLAY_NAME AS VARCHAR2(64)) AS DISPLAY_NAME, + CAST(CLASS AS NUMBER) AS CLASS + from SYS.TENANT_VIRTUAL_STATNAME + """.replace("\n", " ") +) def_table_schema( owner = 'zhenling.zzg', @@ -66460,8 +68319,168 @@ def_table_schema( WHERE A.NAME = B.VARIABLE_NAME; """.replace("\n", " "), ) -# 28212: GV$OB_ACTIVE_SESSION_HISTORY -# 28213: V$OB_ACTIVE_SESSION_HISTORY +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_ACTIVE_SESSION_HISTORY', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28212', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + CAST(SVR_IP AS VARCHAR2(46)) AS SVR_IP, + CAST(SVR_PORT AS NUMBER) AS SVR_PORT, + CAST(SAMPLE_ID AS NUMBER) AS SAMPLE_ID, + SAMPLE_TIME AS SAMPLE_TIME, + CAST(TENANT_ID AS NUMBER) AS CON_ID, + CAST(USER_ID AS NUMBER) AS USER_ID, + CAST(SESSION_ID AS NUMBER) AS SESSION_ID, + CAST(DECODE(SESSION_TYPE, 0, 'FOREGROUND', 'BACKGROUND') AS VARCHAR2(10)) AS SESSION_TYPE, + CAST(DECODE(EVENT_NO, 0, 'ON CPU', 'WAITING') AS VARCHAR2(7)) AS SESSION_STATE, + CAST(SQL_ID AS VARCHAR(32)) AS SQL_ID, + CAST(PLAN_ID AS NUMBER) AS PLAN_ID, + CAST(TRACE_ID AS VARCHAR(64)) AS TRACE_ID, + CAST(NAME AS VARCHAR2(64)) AS EVENT, + CAST(EVENT_NO AS NUMBER) AS EVENT_NO, + CAST(SYS.ALL_VIRTUAL_ASH.EVENT_ID AS NUMBER) AS EVENT_ID, + CAST(PARAMETER1 AS VARCHAR2(64)) AS P1TEXT, + CAST(P1 AS NUMBER) AS P1, + CAST(PARAMETER2 AS VARCHAR2(64)) AS P2TEXT, + CAST(P2 AS NUMBER) AS P2, + CAST(PARAMETER3 AS VARCHAR2(64)) AS P3TEXT, + CAST(P3 AS NUMBER) AS P3, + CAST(WAIT_CLASS AS VARCHAR2(64)) AS WAIT_CLASS, + CAST(WAIT_CLASS_ID AS NUMBER) AS WAIT_CLASS_ID, + CAST(TIME_WAITED AS NUMBER) AS TIME_WAITED, + CAST(SQL_PLAN_LINE_ID AS NUMBER) SQL_PLAN_LINE_ID, + CAST(GROUP_ID AS NUMBER) GROUP_ID, + CAST(PLAN_HASH AS NUMBER) PLAN_HASH, + CAST(THREAD_ID AS NUMBER) THREAD_ID, + CAST(STMT_TYPE AS NUMBER) STMT_TYPE, + CAST(TIME_MODEL AS NUMBER) TIME_MODEL, + CAST(DECODE(IN_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PARSE, + CAST(DECODE(IN_PL_PARSE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PL_PARSE, + CAST(DECODE(IN_PLAN_CACHE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLAN_CACHE, + CAST(DECODE(IN_SQL_OPTIMIZE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_OPTIMIZE, + CAST(DECODE(IN_SQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SQL_EXECUTION, + CAST(DECODE(IN_PX_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PX_EXECUTION, + CAST(DECODE(IN_SEQUENCE_LOAD, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_SEQUENCE_LOAD, + CAST(DECODE(IN_COMMITTING, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_COMMITTING, + CAST(DECODE(IN_STORAGE_READ, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_READ, + CAST(DECODE(IN_STORAGE_WRITE, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_STORAGE_WRITE, + CAST(DECODE(IN_REMOTE_DAS_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_REMOTE_DAS_EXECUTION, + CAST(DECODE(IN_FILTER_ROWS, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_FILTER_ROWS, + CAST(CASE WHEN BITAND(TIME_MODEL , 16384) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_ENCODE, + CAST(CASE WHEN BITAND(TIME_MODEL , 32768) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_RPC_DECODE, + CAST(CASE WHEN BITAND(TIME_MODEL , 65536) > 0 THEN 'Y' ELSE 'N' END AS VARCHAR2(1)) AS IN_CONNECTION_MGR, + CAST(PROGRAM AS VARCHAR2(64)) AS PROGRAM, + CAST(MODULE AS VARCHAR2(64)) AS MODULE, + CAST(ACTION AS VARCHAR2(64)) AS ACTION, + CAST(CLIENT_ID AS VARCHAR2(64)) AS CLIENT_ID, + CAST(BACKTRACE AS VARCHAR2(512)) AS BACKTRACE, + CAST(TM_DELTA_TIME AS NUMBER) AS TM_DELTA_TIME, + CAST(TM_DELTA_CPU_TIME AS NUMBER) AS TM_DELTA_CPU_TIME, + CAST(TM_DELTA_DB_TIME AS NUMBER) AS TM_DELTA_DB_TIME, + CAST(TOP_LEVEL_SQL_ID AS CHAR(32)) AS TOP_LEVEL_SQL_ID, + CAST(DECODE(IN_PLSQL_COMPILATION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_COMPILATION, + CAST(DECODE(IN_PLSQL_EXECUTION, 1, 'Y', 'N') AS VARCHAR2(1)) AS IN_PLSQL_EXECUTION, + CAST(PLSQL_ENTRY_OBJECT_ID AS NUMBER) AS PLSQL_ENTRY_OBJECT_ID, + CAST(PLSQL_ENTRY_SUBPROGRAM_ID AS NUMBER) AS PLSQL_ENTRY_SUBPROGRAM_ID, + CAST(PLSQL_ENTRY_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_ENTRY_SUBPROGRAM_NAME, + CAST(PLSQL_OBJECT_ID AS NUMBER) AS PLSQL_OBJECT_ID, + CAST(PLSQL_SUBPROGRAM_ID AS NUMBER) AS PLSQL_SUBPROGRAM_ID, + CAST(PLSQL_SUBPROGRAM_NAME AS VARCHAR2(32)) AS PLSQL_SUBPROGRAM_NAME, + CAST(TX_ID AS NUMBER) AS TX_ID, + CAST(BLOCKING_SESSION_ID AS NUMBER) AS BLOCKING_SESSION_ID, + CAST(TABLET_ID AS NUMBER) AS TABLET_ID, + CAST(PROXY_SID AS NUMBER) AS PROXY_SID + FROM SYS.ALL_VIRTUAL_ASH LEFT JOIN SYS.V$EVENT_NAME on EVENT_NO = "EVENT#" +""".replace("\n", " "), +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_ACTIVE_SESSION_HISTORY', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28213', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT SVR_IP, +SVR_PORT, +SAMPLE_ID, +SAMPLE_TIME, +CON_ID, +USER_ID, +SESSION_ID, +SESSION_TYPE, +SESSION_STATE, +SQL_ID, +PLAN_ID, +TRACE_ID, +EVENT, +EVENT_NO, +EVENT_ID, +P1TEXT, +P1, +P2TEXT, +P2, +P3TEXT, +P3, +WAIT_CLASS, +WAIT_CLASS_ID, +TIME_WAITED, +SQL_PLAN_LINE_ID, +GROUP_ID, +PLAN_HASH, +THREAD_ID, +STMT_TYPE, +TIME_MODEL, +IN_PARSE, +IN_PL_PARSE, +IN_PLAN_CACHE, +IN_SQL_OPTIMIZE, +IN_SQL_EXECUTION, +IN_PX_EXECUTION, +IN_SEQUENCE_LOAD, +IN_COMMITTING, +IN_STORAGE_READ, +IN_STORAGE_WRITE, +IN_REMOTE_DAS_EXECUTION, +IN_FILTER_ROWS, +IN_RPC_ENCODE, +IN_RPC_DECODE, +IN_CONNECTION_MGR, +PROGRAM, +MODULE, +ACTION, +CLIENT_ID, +BACKTRACE, +TM_DELTA_TIME, +TM_DELTA_CPU_TIME, +TM_DELTA_DB_TIME, +TOP_LEVEL_SQL_ID, +IN_PLSQL_COMPILATION, +IN_PLSQL_EXECUTION, +PLSQL_ENTRY_OBJECT_ID, +PLSQL_ENTRY_SUBPROGRAM_ID, +PLSQL_ENTRY_SUBPROGRAM_NAME, +PLSQL_OBJECT_ID, +PLSQL_SUBPROGRAM_ID, +PLSQL_SUBPROGRAM_NAME, +TX_ID, +BLOCKING_SESSION_ID, +TABLET_ID, +PROXY_SID +FROM SYS.GV$OB_ACTIVE_SESSION_HISTORY WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " "), +) def_table_schema( owner = 'yangjiali.yjl', @@ -67012,8 +69031,58 @@ def_table_schema( WHERE SVR_IP = host_ip() AND SVR_PORT = rpc_port() """.replace("\n", " ") ) -# 28232: GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM -# 28233: V$OB_QUERY_RESPONSE_TIME_HISTOGRAM +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28232', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [], + view_definition = """ + + SELECT + SVR_IP AS SVR_IP, + SVR_PORT AS SVR_PORT, + TENANT_ID AS TENANT_ID, + SQL_TYPE AS SQL_TYPE, + RESPONSE_TIME / 1000000 AS RESPONSE_TIME, + COUNT AS COUNT, + TOTAL / 1000000 AS TOTAL + FROM SYS.ALL_VIRTUAL_QUERY_RESPONSE_TIME +""".replace("\n", " "), + normal_columns = [ + ], +) + +def_table_schema( + owner = 'jiajingzhe.jjz', + table_name = 'V$OB_QUERY_RESPONSE_TIME_HISTOGRAM', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28233', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [], + view_definition = """ + SELECT + SVR_IP, + SVR_PORT, + TENANT_ID, + SQL_TYPE, + RESPONSE_TIME, + COUNT, + TOTAL + FROM SYS.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM WHERE SVR_IP =HOST_IP() AND SVR_PORT = RPC_PORT() +""".replace("\n", " "), + + + normal_columns = [ + ], +) def_table_schema( owner = 'wuxingying.wxy', @@ -67311,11 +69380,6 @@ def_table_schema( # 28254: GV$OB_KV_CLIENT_INFO # 28255: V$OB_KV_CLIENT_INFO # 28256: V$OB_VARIABLES_BY_SESSION -# 28257: GV$OB_RES_MGR_SYSSTAT -# 28258: V$OB_RES_MGR_SYSSTAT -# 28259: DBA_WR_SQL_PLAN -# 28260: DBA_WR_RES_MGR_SYSSTAT - def_table_schema( owner = 'webber.wb', table_name='ALL_PLSQL_TYPES', @@ -69429,6 +71493,125 @@ def_table_schema( """.replace("\n", " "), ) +def_table_schema( + owner = 'roland.qk', + table_name = 'GV$OB_RES_MGR_SYSSTAT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28257', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT CAST(TENANT_ID AS NUMBER) as CON_ID, + CAST(GROUP_ID AS NUMBER) as GROUP_ID, + SVR_IP as SVR_IP, + SVR_PORT as SVR_PORT, + CAST("STATISTIC#" AS NUMBER) as "STATISTIC#", + CAST(NAME AS VARCHAR2(64)) as NAME, + CAST(CLASS AS NUMBER) as CLASS, + CAST(VALUE AS NUMBER) as VALUE, + CAST(VALUE_TYPE AS VARCHAR2(16)) as VALUE_TYPE, + CAST(STAT_ID AS NUMBER) as STAT_ID + FROM SYS.ALL_VIRTUAL_RES_MGR_SYSSTAT +""".replace("\n", " ") +) + +def_table_schema( + owner = 'roland.qk', + table_name = 'V$OB_RES_MGR_SYSSTAT', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28258', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT CON_ID, + GROUP_ID, + SVR_IP, + SVR_PORT, + "STATISTIC#", + NAME, + CLASS, + VALUE, + VALUE_TYPE, + STAT_ID + FROM SYS.GV$OB_RES_MGR_SYSSTAT + WHERE SVR_IP = HOST_IP() AND SVR_PORT = RPC_PORT() +""".replace("\n", " ") +) + +def_table_schema( + owner = 'zhangyiqiang.zyq', + table_name = 'DBA_WR_SQL_PLAN', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28259', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + rowkey_columns = [], + normal_columns = [], + in_tenant_space = True, + view_definition = + """ + SELECT + SQLPLAN.TENANT_ID AS TENANT_ID, + SQLPLAN.CLUSTER_ID AS CLUSTER_ID, + SQLPLAN.SNAP_ID AS SNAP_ID, + SQLPLAN.SVR_IP AS SVR_IP, + SQLPLAN.SVR_PORT AS SVR_PORT, + SQLPLAN.SQL_ID AS SQL_ID, + SQLPLAN.PLAN_HASH AS PLAN_HASH, + SQLPLAN.PLAN_ID AS PLAN_ID, + SQLPLAN.ID AS ID, + SQLPLAN.DB_ID AS DB_ID, + SQLPLAN.GMT_CREATE AS GMT_CREATE, + SQLPLAN.OPERATOR AS OPERATOR, + SQLPLAN.OPTIONS AS OPTIONS, + SQLPLAN.OBJECT_NODE AS OBJECT_NODE, + SQLPLAN.OBJECT_ID AS OBJECT_ID, + SQLPLAN.OBJECT_OWNER AS OBJECT_OWNER, + SQLPLAN.OBJECT_NAME AS OBJECT_NAME, + SQLPLAN.OBJECT_ALIAS AS OBJECT_ALIAS, + SQLPLAN.OBJECT_TYPE AS OBJECT_TYPE, + SQLPLAN.OPTIMIZER AS OPTIMIZER, + SQLPLAN.PARENT_ID AS PARENT_ID, + SQLPLAN.DEPTH AS DEPTH, + SQLPLAN.POSITION AS POSITION, + SQLPLAN.IS_LAST_CHILD AS IS_LAST_CHILD, + SQLPLAN.COST AS COST, + SQLPLAN.REAL_COST AS REAL_COST, + SQLPLAN.CARDINALITY AS CARDINALITY, + SQLPLAN.REAL_CARDINALITY AS REAL_CARDINALITY, + SQLPLAN.BYTES AS BYTES, + SQLPLAN.ROWSET AS ROWSET, + SQLPLAN.OTHER_TAG AS OTHER_TAG, + SQLPLAN.PARTITION_START AS PARTITION_START, + SQLPLAN.other AS OTHER, + SQLPLAN.CPU_COST AS CPU_COST, + SQLPLAN.IO_COST AS IO_COST, + SQLPLAN.ACCESS_PREDICATES AS ACCESS_PREDICATES, + SQLPLAN.FILTER_PREDICATES AS FILTER_PREDICATES, + SQLPLAN.STARTUP_PREDICATES AS STARTUP_PREDICATES, + SQLPLAN.PROJECTION AS PROJECTION, + SQLPLAN.SPECIAL_PREDICATES AS SPECIAL_PREDICATES, + SQLPLAN.QBLOCK_NAME AS QBLOCK_NAME, + SQLPLAN.REMARKS AS REMARKS, + SQLPLAN.OTHER_XML AS OTHER_XML + FROM + SYS.ALL_VIRTUAL_WR_SQL_PLAN SQLPLAN + WHERE + SQLPLAN.TENANT_ID = EFFECTIVE_TENANT_ID() + """.replace("\n", " ") +) + +# 28260: DBA_WR_RES_MGR_SYSSTAT + def_table_schema( owner = 'yibo.tyf', table_name = 'DBA_OB_SPM_EVO_RESULT', diff --git a/src/share/inner_table/ob_inner_table_schema_misc.ipp b/src/share/inner_table/ob_inner_table_schema_misc.ipp index 4b1348a934..81dcb67298 100644 --- a/src/share/inner_table/ob_inner_table_schema_misc.ipp +++ b/src/share/inner_table/ob_inner_table_schema_misc.ipp @@ -600,9 +600,14 @@ case OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID: case OB_ALL_VIRTUAL_TENANT_USER_FAILED_LOGIN_STAT_TID: case OB_ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY_TID: case OB_ALL_VIRTUAL_WR_CONTROL_TID: +case OB_ALL_VIRTUAL_WR_EVENT_NAME_TID: case OB_ALL_VIRTUAL_WR_SNAPSHOT_TID: +case OB_ALL_VIRTUAL_WR_SQL_PLAN_TID: +case OB_ALL_VIRTUAL_WR_SQLSTAT_TID: +case OB_ALL_VIRTUAL_WR_SQLTEXT_TID: case OB_ALL_VIRTUAL_WR_STATNAME_TID: case OB_ALL_VIRTUAL_WR_SYSSTAT_TID: +case OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID: case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: #endif @@ -1865,6 +1870,22 @@ case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: break; } + case OB_ALL_VIRTUAL_WR_EVENT_NAME_TID: { + ObIteratePrivateVirtualTable *iter = NULL; + const bool meta_record_in_sys = false; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIteratePrivateVirtualTable, iter))) { + SERVER_LOG(WARN, "create iterate private virtual table iterator failed", KR(ret)); + } else if (OB_FAIL(iter->init(OB_WR_EVENT_NAME_TID, meta_record_in_sys, index_schema, params))) { + SERVER_LOG(WARN, "iterate private virtual table iter init failed", KR(ret)); + iter->~ObIteratePrivateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + case OB_ALL_VIRTUAL_WR_SNAPSHOT_TID: { ObIteratePrivateVirtualTable *iter = NULL; const bool meta_record_in_sys = false; @@ -1880,6 +1901,56 @@ case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA + case OB_ALL_VIRTUAL_WR_SQL_PLAN_TID: { + ObIteratePrivateVirtualTable *iter = NULL; + const bool meta_record_in_sys = false; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIteratePrivateVirtualTable, iter))) { + SERVER_LOG(WARN, "create iterate private virtual table iterator failed", KR(ret)); + } else if (OB_FAIL(iter->init(OB_WR_SQL_PLAN_TID, meta_record_in_sys, index_schema, params))) { + SERVER_LOG(WARN, "iterate private virtual table iter init failed", KR(ret)); + iter->~ObIteratePrivateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + + case OB_ALL_VIRTUAL_WR_SQLSTAT_TID: { + ObIteratePrivateVirtualTable *iter = NULL; + const bool meta_record_in_sys = false; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIteratePrivateVirtualTable, iter))) { + SERVER_LOG(WARN, "create iterate private virtual table iterator failed", KR(ret)); + } else if (OB_FAIL(iter->init(OB_WR_SQLSTAT_TID, meta_record_in_sys, index_schema, params))) { + SERVER_LOG(WARN, "iterate private virtual table iter init failed", KR(ret)); + iter->~ObIteratePrivateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + + case OB_ALL_VIRTUAL_WR_SQLTEXT_TID: { + ObIteratePrivateVirtualTable *iter = NULL; + const bool meta_record_in_sys = false; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIteratePrivateVirtualTable, iter))) { + SERVER_LOG(WARN, "create iterate private virtual table iterator failed", KR(ret)); + } else if (OB_FAIL(iter->init(OB_WR_SQLTEXT_TID, meta_record_in_sys, index_schema, params))) { + SERVER_LOG(WARN, "iterate private virtual table iter init failed", KR(ret)); + iter->~ObIteratePrivateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } case OB_ALL_VIRTUAL_WR_STATNAME_TID: { ObIteratePrivateVirtualTable *iter = NULL; @@ -1896,9 +1967,7 @@ case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_WR_SYSSTAT_TID: { ObIteratePrivateVirtualTable *iter = NULL; const bool meta_record_in_sys = false; @@ -1915,6 +1984,22 @@ case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: break; } + case OB_ALL_VIRTUAL_WR_SYSTEM_EVENT_TID: { + ObIteratePrivateVirtualTable *iter = NULL; + const bool meta_record_in_sys = false; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIteratePrivateVirtualTable, iter))) { + SERVER_LOG(WARN, "create iterate private virtual table iterator failed", KR(ret)); + } else if (OB_FAIL(iter->init(OB_WR_SYSTEM_EVENT_TID, meta_record_in_sys, index_schema, params))) { + SERVER_LOG(WARN, "iterate private virtual table iter init failed", KR(ret)); + iter->~ObIteratePrivateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + case OB_ALL_VIRTUAL_ZONE_MERGE_INFO_TID: { ObIteratePrivateVirtualTable *iter = NULL; const bool meta_record_in_sys = false; @@ -5215,15 +5300,30 @@ case OB_WR_ACTIVE_SESSION_HISTORY_AUX_LOB_PIECE_TID: case OB_WR_CONTROL_TID: case OB_WR_CONTROL_AUX_LOB_META_TID: case OB_WR_CONTROL_AUX_LOB_PIECE_TID: +case OB_WR_EVENT_NAME_TID: +case OB_WR_EVENT_NAME_AUX_LOB_META_TID: +case OB_WR_EVENT_NAME_AUX_LOB_PIECE_TID: case OB_WR_SNAPSHOT_TID: case OB_WR_SNAPSHOT_AUX_LOB_META_TID: case OB_WR_SNAPSHOT_AUX_LOB_PIECE_TID: +case OB_WR_SQL_PLAN_TID: +case OB_WR_SQL_PLAN_AUX_LOB_META_TID: +case OB_WR_SQL_PLAN_AUX_LOB_PIECE_TID: +case OB_WR_SQLSTAT_TID: +case OB_WR_SQLSTAT_AUX_LOB_META_TID: +case OB_WR_SQLSTAT_AUX_LOB_PIECE_TID: +case OB_WR_SQLTEXT_TID: +case OB_WR_SQLTEXT_AUX_LOB_META_TID: +case OB_WR_SQLTEXT_AUX_LOB_PIECE_TID: case OB_WR_STATNAME_TID: case OB_WR_STATNAME_AUX_LOB_META_TID: case OB_WR_STATNAME_AUX_LOB_PIECE_TID: case OB_WR_SYSSTAT_TID: case OB_WR_SYSSTAT_AUX_LOB_META_TID: case OB_WR_SYSSTAT_AUX_LOB_PIECE_TID: +case OB_WR_SYSTEM_EVENT_TID: +case OB_WR_SYSTEM_EVENT_AUX_LOB_META_TID: +case OB_WR_SYSTEM_EVENT_AUX_LOB_PIECE_TID: #endif diff --git a/src/share/inner_table/sys_package/dbms_ash_internal_body.sql b/src/share/inner_table/sys_package/dbms_ash_internal_body.sql index 2244d3b550..7dec2ad5db 100644 --- a/src/share/inner_table/sys_package/dbms_ash_internal_body.sql +++ b/src/share/inner_table/sys_package/dbms_ash_internal_body.sql @@ -16,6 +16,7 @@ CREATE OR REPLACE PACKAGE BODY dbms_ash_internal AS ' a.session_id, ' || ' a.session_type, ' || ' a.session_state, ' || + ' a.top_level_sql_id, ' || ' a.sql_id, ' || ' plan_id, ' || ' a.trace_id, ' || @@ -39,6 +40,14 @@ CREATE OR REPLACE PACKAGE BODY dbms_ash_internal AS ' a.in_storage_read, ' || ' a.in_storage_write, ' || ' a.in_remote_das_execution, ' || + ' a.in_plsql_execution, ' || + ' a.in_plsql_compilation, ' || + ' a.plsql_entry_object_id, ' || + ' a.plsql_entry_subprogram_id, ' || + ' a.plsql_entry_subprogram_name, ' || + ' a.plsql_object_id, ' || + ' a.plsql_subprogram_id, ' || + ' a.plsql_subprogram_name, ' || ' a.module, a.action, a.client_id ' || 'FROM GV$ACTIVE_SESSION_HISTORY a ' || 'WHERE 1=1 '; diff --git a/src/share/inner_table/sys_package/dbms_workload_repository.sql b/src/share/inner_table/sys_package/dbms_workload_repository.sql index 5a491118aa..736db2675e 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository.sql @@ -7,36 +7,27 @@ -- CREATE OR REPLACE PACKAGE dbms_workload_repository AUTHID CURRENT_USER AS - -- Type declare - -- SUBTYPE OUTPUT_TYPE IS VARCHAR2(4000 CHAR); - TYPE awrrpt_text_type_table IS TABLE OF VARCHAR2(4096 CHAR) INDEX BY BINARY_INTEGER; - RPT_ROWS awrrpt_text_type_table; - - - TYPE SEC_REC IS RECORD( - TITLE VARCHAR2(4000 CHAR), - TITLE_TYPE VARCHAR2(1 CHAR) - ); - - TYPE SEC_REC_TAB IS TABLE OF SEC_REC - INDEX BY BINARY_INTEGER; - - TEST_ROW SEC_REC_TAB; - - PROCEDURE ASH_REPORT(BTIME IN DATE, - ETIME IN DATE, + PROCEDURE ASH_REPORT(BTIME IN TIMESTAMP, + ETIME IN TIMESTAMP, SQL_ID IN VARCHAR2 DEFAULT NULL, TRACE_ID IN VARCHAR2 DEFAULT NULL, WAIT_CLASS IN VARCHAR2 DEFAULT NULL, - REPORT_TYPE IN VARCHAR2 DEFAULT 'text' + REPORT_TYPE IN VARCHAR2 DEFAULT 'text', + SVR_IP IN VARCHAR2 DEFAULT NULL, + SVR_PORT IN NUMBER DEFAULT NULL, + TENANT_ID IN NUMBER DEFAULT NULL ); - FUNCTION ASH_REPORT_TEXT(L_BTIME IN DATE, - L_ETIME IN DATE, + FUNCTION ASH_REPORT_TEXT(L_BTIME IN TIMESTAMP, + L_ETIME IN TIMESTAMP, SQL_ID IN VARCHAR2 DEFAULT NULL, TRACE_ID IN VARCHAR2 DEFAULT NULL, - WAIT_CLASS IN VARCHAR2 DEFAULT NULL + WAIT_CLASS IN VARCHAR2 DEFAULT NULL, + SVR_IP IN VARCHAR2 DEFAULT NULL, + SVR_PORT IN NUMBER DEFAULT NULL, + TENANT_ID IN NUMBER DEFAULT NULL, + REPORT_TYPE IN VARCHAR2 DEFAULT 'text' ) - RETURN awrrpt_text_type_table; + RETURN CLOB; END dbms_workload_repository; diff --git a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql index a8c550baa4..74c30ab8ae 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql @@ -1,688 +1,55 @@ CREATE OR REPLACE PACKAGE BODY dbms_workload_repository AS -TYPE COLUMN_CONTENT_ARRAY IS VARRAY(20) OF VARCHAR2(4096); -TYPE COLUMN_WIDTH_ARRAY IS VARRAY(20) OF INTEGER; - -DIG_3_FM VARCHAR2(20) := 'FM999999990.000'; -DIG_2_FM VARCHAR2(20) := 'FM999999990.00'; - --- helper functions -PROCEDURE APPEND_ROW(ROW IN VARCHAR2) -IS -BEGIN - RPT_ROWS(RPT_ROWS.COUNT) := ROW; -END APPEND_ROW; - -PROCEDURE REPORT_CLEANUP -IS -BEGIN - IF (RPT_ROWS.COUNT > 0) THEN - RPT_ROWS.DELETE; - END IF; -END REPORT_CLEANUP; - -FUNCTION FORMAT_ROW(column_content IN COLUMN_CONTENT_ARRAY, - column_width IN COLUMN_WIDTH_ARRAY, - pad IN VARCHAR2, - sep IN VARCHAR2) -RETURN VARCHAR2 -IS - RES VARCHAR2(4000 CHAR); -BEGIN - RES := ''; - FOR i IN 1 .. column_content.count LOOP - RES := RES || LPAD(column_content(i), column_width(i), pad) || sep; - END LOOP; - RETURN RES; -END FORMAT_ROW; - - -- main function -FUNCTION ASH_REPORT_TEXT(L_BTIME IN DATE, - L_ETIME IN DATE, +FUNCTION ASH_REPORT_TEXT(L_BTIME IN TIMESTAMP, + L_ETIME IN TIMESTAMP, SQL_ID IN VARCHAR2 DEFAULT NULL, TRACE_ID IN VARCHAR2 DEFAULT NULL, - WAIT_CLASS IN VARCHAR2 DEFAULT NULL + WAIT_CLASS IN VARCHAR2 DEFAULT NULL, + SVR_IP IN VARCHAR2 DEFAULT NULL, + SVR_PORT IN NUMBER DEFAULT NULL, + TENANT_ID IN NUMBER DEFAULT NULL, + REPORT_TYPE IN VARCHAR2 DEFAULT 'text' ) -RETURN awrrpt_text_type_table -IS - DYN_SQL VARCHAR2(15000); - NULL_NUM NUMBER := NULL; - NULL_CHAR VARCHAR2(10) := NULL; + RETURN CLOB; + PRAGMA INTERFACE(C, GENERATE_ASH_REPORT_TEXT); - TYPE TopEventCursor IS REF CURSOR; - top_event_cv TopEventCursor; - - TYPE SummaryRecord IS RECORD ( - SAMPLE_CNT NUMBER, - EVENT_CNT NUMBER - ); - sample_rec SummaryRecord; - - TYPE TopEventRecord IS RECORD ( - EVENT SYS.V$ACTIVE_SESSION_HISTORY.EVENT%TYPE, - WAIT_CLASS SYS.V$ACTIVE_SESSION_HISTORY.WAIT_CLASS%TYPE, - EVENT_CNT NUMBER - ); - top_event_rec TopEventRecord; - - TYPE TopEventPvalRecord IS RECORD ( - EVENT SYS.V$ACTIVE_SESSION_HISTORY.EVENT%TYPE, - EVENT_CNT NUMBER, - SAMPLE_CNT NUMBER, - P1 SYS.V$ACTIVE_SESSION_HISTORY.P1%TYPE, - P2 SYS.V$ACTIVE_SESSION_HISTORY.P2%TYPE, - P3 SYS.V$ACTIVE_SESSION_HISTORY.P3%TYPE, - P1TEXT SYS.V$ACTIVE_SESSION_HISTORY.P1TEXT%TYPE, - P2TEXT SYS.V$ACTIVE_SESSION_HISTORY.P2TEXT%TYPE, - P3TEXT SYS.V$ACTIVE_SESSION_HISTORY.P3TEXT%TYPE - ); - top_event_pval_rec TopEventPvalRecord; - - TYPE TopAppInfoRecord IS RECORD ( - MODULE SYS.V$ACTIVE_SESSION_HISTORY.MODULE%TYPE, - ACTION SYS.V$ACTIVE_SESSION_HISTORY.ACTION%TYPE, - SAMPLE_CNT NUMBER - ); - top_appinfo_rec TopAppInfoRecord; - - TYPE TopPhaseOfExecutionRecord IS RECORD ( - EXECUTION_PHASE VARCHAR2(40), - SAMPLE_CNT NUMBER - ); - top_phase_rec TopPhaseOfExecutionRecord; - - TYPE TopSQLRecord IS RECORD ( - SQL_ID SYS.V$ACTIVE_SESSION_HISTORY.SQL_ID%TYPE, - PLAN_ID NUMBER, - EVENT_CNT NUMBER, - EVENT SYS.V$ACTIVE_SESSION_HISTORY.EVENT%TYPE, - QUERY_SQL SYS.V$OB_PLAN_CACHE_PLAN_STAT.QUERY_SQL%TYPE - ); - top_sql_rec TopSQLRecord; - - TYPE CompleteSQLRecord IS RECORD ( - SQL_ID SYS.V$ACTIVE_SESSION_HISTORY.SQL_ID%TYPE, - PLAN_ID SYS.V$ACTIVE_SESSION_HISTORY.PLAN_ID%TYPE, - QUERY_SQL SYS.V$OB_PLAN_CACHE_PLAN_STAT.QUERY_SQL%TYPE - ); - complete_sql_rec CompleteSQLRecord; - - - TYPE TopSessionRecord IS RECORD ( - SESSION_ID SYS.V$ACTIVE_SESSION_HISTORY.SESSION_ID%TYPE, - EVENT SYS.V$ACTIVE_SESSION_HISTORY.EVENT%TYPE, - EVENT_CNT NUMBER, - SAMPLE_CNT NUMBER, - USER_NAME SYS.ALL_USERS.USERNAME%TYPE - ); - top_sess_rec TopSessionRecord; - - TYPE TopLatchRecord IS RECORD ( - EVENT SYS.V$ACTIVE_SESSION_HISTORY.EVENT%TYPE, - SAMPLE_CNT NUMBER - ); - top_latch_rec TopLatchRecord; - - TYPE NodeLoadCursor IS REF CURSOR; - node_load_cv NodeLoadCursor; - TYPE NodeLoadRecord IS RECORD ( - SVR_IP SYS.V$ACTIVE_SESSION_HISTORY.SVR_IP%TYPE, - SVR_PORT SYS.V$ACTIVE_SESSION_HISTORY.SVR_PORT%TYPE, - SAMPLE_CNT NUMBER, - IDLE_WAIT_CNT NUMBER - ); - node_load_rec NodeLoadRecord; - - - - column_content COLUMN_CONTENT_ARRAY; - column_widths COLUMN_WIDTH_ARRAY; - - ASH_END_TIME Date; - ASH_BEGIN_TIME Date; - DUR_ELAPSED Number; - NUM_SAMPLES Number; - NUM_EVENTS Number; -- One event may cross many samples - - FILTER_EVENT_STR CONSTANT VARCHAR2(100) := '1'; -BEGIN - REPORT_CLEANUP(); - - DBMS_OUTPUT.PUT_LINE(''); - DBMS_OUTPUT.PUT_LINE('# ASH Report'); - DBMS_OUTPUT.PUT_LINE(''); - - DYN_SQL := 'SELECT MIN(SAMPLE_TIME), MAX(SAMPLE_TIME) ' || - 'FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event '; - EXECUTE IMMEDIATE DYN_SQL - INTO ASH_BEGIN_TIME, ASH_END_TIME - USING L_BTIME, L_ETIME, - L_BTIME, L_ETIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - - DYN_SQL := 'SELECT COUNT(1) NUM_SAMPLES, SUM(' || FILTER_EVENT_STR || ') NUM_EVENTS ' || - 'FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event '; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO sample_rec; - EXIT WHEN top_event_cv%NOTFOUND; - NUM_SAMPLES := sample_rec.SAMPLE_CNT; - NUM_EVENTS := sample_rec.EVENT_CNT; - END LOOP; - CLOSE top_event_cv; - - DUR_ELAPSED := ROUND((ASH_END_TIME - ASH_BEGIN_TIME) * 24 * 60 * 60, 0); -- in seconds - APPEND_ROW('----'); - APPEND_ROW(' Sample Begin: ' || TO_CHAR(L_BTIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' Sample End: ' || TO_CHAR(L_ETIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' ----------'); - APPEND_ROW(' Analysis Begin Time: ' || TO_CHAR(ASH_BEGIN_TIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' Analysis End Time: ' || TO_CHAR(ASH_END_TIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED) || '(secs)'); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)'); - APPEND_ROW(' Num of Sample: ' || TO_CHAR(NUM_SAMPLES)); - APPEND_ROW(' Num of Events: ' || TO_CHAR(NUM_EVENTS)); - APPEND_ROW('Average Active Sessions: ' || TO_CHAR(ROUND(NUM_SAMPLES/DUR_ELAPSED,2), DIG_3_FM)); - APPEND_ROW('----'); - - IF (ASH_BEGIN_TIME IS NULL OR NUM_SAMPLES = 0) THEN - return RPT_ROWS; - END IF; - - IF DUR_ELAPSED <= 0 THEN - DUR_ELAPSED := 1; -- avoid zero division - END IF; - IF NUM_SAMPLES <= 0 THEN - NUM_SAMPLES := 1; - END IF; - IF NUM_EVENTS <= 0 THEN - NUM_EVENTS := 1; - END IF; - - - APPEND_ROW(' '); - APPEND_ROW('## Top User Events:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 20, 9); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', '% Event'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_event_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - top_event_rec.EVENT, - top_event_rec.WAIT_CLASS, - TO_CHAR(ROUND(100 * top_event_rec.EVENT_CNT/NUM_EVENTS,2), DIG_2_FM) || '%' - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - APPEND_ROW(' '); - APPEND_ROW('## Top Events P1/P2/P3 Value:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 10, 12, 50, 20, 20, 20); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Event', '% Event', '% Activity', 'Max P1/P2/P3', 'Parameter 1', 'Parameter 2', 'Parameter 3'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT * FROM (SELECT EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT, MAX(P1) P1, MAX(P2) P2, MAX(P3) P3, MAX(P1TEXT) P1TEXT, MAX(P2TEXT) P2TEXT, MAX(P3TEXT) P3TEXT ' || - 'FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - 'GROUP BY EVENT, WAIT_CLASS ORDER BY 2 DESC) WHERE ROWNUM < 10'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_event_pval_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW( - FORMAT_ROW( - COLUMN_CONTENT_ARRAY( - top_event_pval_rec.EVENT, - TO_CHAR(ROUND(100 * top_event_pval_rec.EVENT_CNT/NUM_EVENTS,2), DIG_2_FM) || '%', - TO_CHAR(ROUND(100 * top_event_pval_rec.SAMPLE_CNT/NUM_SAMPLES,3), DIG_3_FM) || '%', - '"' || TO_CHAR(top_event_pval_rec.P1) || '","' || TO_CHAR(top_event_pval_rec.P2) || '","' || TO_CHAR(top_event_pval_rec.P3) || '"', - NVL(top_event_pval_rec.P1TEXT, ' '), - NVL(top_event_pval_rec.P2TEXT, ' '), - NVL(top_event_pval_rec.P3TEXT, ' ') - ), - column_widths, ' ', '|' - ) - ); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - -- Not implemented yet - -- APPEND_ROW(' '); - -- APPEND_ROW('## Top Service/Module:'); - -- column_widths := COLUMN_WIDTH_ARRAY(40, 40, 12, 40, 12); - -- column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - -- APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - -- column_content := COLUMN_CONTENT_ARRAY('Service', 'Module', '% Activity', 'Action', '% Action'); - -- APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - -- column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - -- APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - -- DYN_SQL := 'SELECT * FROM (SELECT MODULE, ACTION, COUNT(1) SAMPLE_CNT ' || - -- 'FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - -- 'GROUP BY MODULE, ROLLUP(ACTION) ORDER BY MODULE, SAMPLE_CNT DESC) ' || - -- 'WHERE SAMPLE_CNT / :num_samples_param > -0.01'; - -- OPEN top_event_cv FOR DYN_SQL - -- USING ASH_BEGIN_TIME, ASH_END_TIME, - -- ASH_BEGIN_TIME, ASH_END_TIME, - -- NULL_CHAR, NULL_CHAR, - -- NULL_CHAR, NULL_CHAR, - -- NULL_CHAR, NULL_CHAR, - -- NULL_CHAR, NULL_CHAR, - -- NULL_CHAR, NULL_CHAR, - -- NULL_CHAR, NULL_CHAR, - -- NUM_SAMPLES; - -- LOOP - -- FETCH top_event_cv INTO top_appinfo_rec; - -- EXIT WHEN top_event_cv%NOTFOUND; - -- APPEND_ROW( - -- FORMAT_ROW( - -- COLUMN_CONTENT_ARRAY( - -- '*', - -- NVL(top_appinfo_rec.MODULE, ' '), - -- TO_CHAR(ROUND(100 * top_appinfo_rec.SAMPLE_CNT/DUR_ELAPSED, 3), DIG_3_FM) || '%', - -- NVL(top_appinfo_rec.ACTION, ' '), - -- TO_CHAR(ROUND(100 * top_appinfo_rec.SAMPLE_CNT/NUM_SAMPLES,2), DIG_2_FM) || '%' - -- ), - -- column_widths, ' ', '|' - -- ) - -- ); - -- END LOOP; - -- CLOSE top_event_cv; - -- column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - -- APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - - APPEND_ROW(' '); - APPEND_ROW('## Top Phase of Execution:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 12, 14, 40); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Phase of Execution', '% Activity', 'Sample Count', 'Avg Active Sessions'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT * FROM (SELECT ' || - ' SUM(CASE IN_PARSE WHEN ''N'' THEN 0 ELSE 1 END) IN_PARSE, ' || - ' SUM(CASE IN_PL_PARSE WHEN ''N'' THEN 0 ELSE 1 END) IN_PL_PARSE, ' || - ' SUM(CASE IN_PLAN_CACHE WHEN ''N'' THEN 0 ELSE 1 END) IN_PLAN_CACHE, ' || - ' SUM(CASE IN_SQL_OPTIMIZE WHEN ''N'' THEN 0 ELSE 1 END) IN_SQL_OPTIMIZE, ' || - ' SUM(CASE IN_SQL_EXECUTION WHEN ''N'' THEN 0 ELSE 1 END) IN_SQL_EXECUTION, ' || - ' SUM(CASE IN_PX_EXECUTION WHEN ''N'' THEN 0 ELSE 1 END) IN_PX_EXECUTION, ' || - ' SUM(CASE IN_SEQUENCE_LOAD WHEN ''N'' THEN 0 ELSE 1 END) IN_SEQUENCE_LOAD, ' || - ' SUM(CASE IN_COMMITTING WHEN ''N'' THEN 0 ELSE 1 END) IN_COMMITTING, ' || - ' SUM(CASE IN_STORAGE_READ WHEN ''N'' THEN 0 ELSE 1 END) IN_STORAGE_READ, ' || - ' SUM(CASE IN_STORAGE_WRITE WHEN ''N'' THEN 0 ELSE 1 END) IN_STORAGE_WRITE, ' || - ' SUM(CASE IN_REMOTE_DAS_EXECUTION WHEN ''N'' THEN 0 ELSE 1 END) IN_REMOTE_DAS_EXECUTION ' || - 'FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ) phases ' || - ' unpivot ' || - ' (' || - ' SAMPLES_CNT FOR EXECUTION_PHASE IN (IN_PARSE, IN_PL_PARSE, IN_PLAN_CACHE, IN_SQL_OPTIMIZE, IN_SQL_EXECUTION,IN_PX_EXECUTION, IN_SEQUENCE_LOAD, IN_COMMITTING, IN_STORAGE_READ, IN_STORAGE_WRITE, IN_REMOTE_DAS_EXECUTION )' || - ' ) ORDER BY SAMPLES_CNT DESC'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_phase_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW( - FORMAT_ROW( - COLUMN_CONTENT_ARRAY( - top_phase_rec.EXECUTION_PHASE, - TO_CHAR(ROUND(100 * top_phase_rec.SAMPLE_CNT/NUM_SAMPLES, 3), DIG_3_FM) || '%', - TO_CHAR(top_phase_rec.SAMPLE_CNT), - TO_CHAR(ROUND(top_phase_rec.SAMPLE_CNT/DUR_ELAPSED,2), DIG_2_FM) - ), - column_widths, ' ', '|' - ) - ); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - - APPEND_ROW(' '); - APPEND_ROW('## Top SQL with Top Events'); - APPEND_ROW(' - All events included.'); - APPEND_ROW(' - Empty ''SQL Text'' if it is PL/SQL query'); - column_widths := COLUMN_WIDTH_ARRAY(40, 12, 25, 40, 12, 60); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('SQL ID', 'PLAN ID', 'Sampled # of Executions', 'Event', '% Event', 'SQL Text'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT SQL_ID, PLAN_ID, EVENT_CNT, EVENT, QUERY_SQL FROM (SELECT ash.*, SUBSTR(TRIM(REPLACE(pc.QUERY_SQL, CHR(10), '''')), 0, 55) QUERY_SQL ' || - 'FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || - DBMS_ASH_INTERNAL.ASH_VIEW_SQL || - ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 20'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_sql_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - NVL(top_sql_rec.SQL_ID, ' '), - NVL(TO_CHAR(top_sql_rec.PLAN_ID), ' '), - NVL(TO_CHAR(top_sql_rec.EVENT_CNT), ' '), - top_sql_rec.EVENT, - TO_CHAR(ROUND(100 * top_sql_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - NVL(top_sql_rec.QUERY_SQL, ' ') - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - - - APPEND_ROW(' '); - APPEND_ROW('## Top SQL with Top Blocking Events'); - APPEND_ROW(' - Empty result if no event other than On CPU sampled'); - APPEND_ROW(' - Empty ''SQL Text'' if it is PL/SQL query'); - column_widths := COLUMN_WIDTH_ARRAY(40, 12, 25, 40, 12, 60); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('SQL ID', 'PLAN ID', 'Sampled # of Executions', 'Event', '% Event', 'SQL Text'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT SQL_ID, PLAN_ID, EVENT_CNT, EVENT, QUERY_SQL ' || - 'FROM (SELECT ash.*, SUBSTR(REPLACE(pc.QUERY_SQL, CHR(10), '' ''), 0, 55) QUERY_SQL ' || - ' FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || - DBMS_ASH_INTERNAL.ASH_VIEW_SQL || - ' ) top_event WHERE wait_class_id != 100 GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 20'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_sql_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - top_sql_rec.SQL_ID, - TO_CHAR(top_sql_rec.PLAN_ID), - TO_CHAR(top_sql_rec.EVENT_CNT), - top_sql_rec.EVENT, - TO_CHAR(ROUND(100 * top_sql_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - NVL(top_sql_rec.QUERY_SQL, ' ') - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - -- complete List of SQL Text - APPEND_ROW(' '); - APPEND_ROW('## Complete List of SQL Text'); - DYN_SQL := 'SELECT SQL_ID, PLAN_ID, QUERY_SQL FROM (SELECT pc.SQL_ID SQL_ID, pc.PLAN_ID, pc.QUERY_SQL QUERY_SQL ' || - 'FROM (SELECT SQL_ID, PLAN_ID, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 20'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO complete_sql_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(' SQL ID: ' || NVL(complete_sql_rec.SQL_ID, ' ')); - APPEND_ROW(' PLAN ID: ' || TO_CHAR(complete_sql_rec.PLAN_ID)); - APPEND_ROW('SQL Text: ' || NVL(SUBSTR(complete_sql_rec.QUERY_SQL, 0, 4000), ' ')); - APPEND_ROW(''); - END LOOP; - CLOSE top_event_cv; - - - APPEND_ROW(' '); - APPEND_ROW('## Top Sessions:'); - APPEND_ROW(' - ''# Samples Active'' shows the number of ASH samples in which the session was found waiting for that particular event. The percentage shown in this column is calculated with respect to wall time.'); - column_widths := COLUMN_WIDTH_ARRAY(20, 22, 40, 12, 12, 20, '20'); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Sid', '% Activity', 'Event', 'Event Count', '% Event', 'User', '# Samples Active'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || - ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_sess_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - TO_CHAR(top_sess_rec.SESSION_ID), - TO_CHAR(ROUND(100 * top_sess_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%', - top_sess_rec.EVENT, - TO_CHAR(top_sess_rec.EVENT_CNT), - TO_CHAR(ROUND(100 * top_sess_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - NVL(top_sess_rec.USER_NAME, ' '), - TO_CHAR(top_sess_rec.EVENT_CNT) || '/' || TO_CHAR(DUR_ELAPSED) || '[' || TO_CHAR(ROUND(100*top_sess_rec.EVENT_CNT/DUR_ELAPSED, 2), DIG_2_FM) || '%]' - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - - - APPEND_ROW(' '); - APPEND_ROW('## Top Blocking Sessions:'); - APPEND_ROW(' - Blocking session activity percentages are calculated with respect to waits on latches and locks only.'); - APPEND_ROW(' - ''# Samples Active'' shows the number of ASH samples in which the blocking session was found active.'); - column_widths := COLUMN_WIDTH_ARRAY(20, 22, 40, 12, 12, 20, '20'); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Blocking Sid', '% Activity', 'Event Caused', 'Event Count', '% Event', 'User', '# Samples Active'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || - ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_sess_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - TO_CHAR(top_sess_rec.SESSION_ID), - TO_CHAR(ROUND(100 * top_sess_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%', - top_sess_rec.EVENT, - TO_CHAR(top_sess_rec.EVENT_CNT), - TO_CHAR(ROUND(100 * top_sess_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - NVL(top_sess_rec.USER_NAME, ' '), - TO_CHAR(top_sess_rec.EVENT_CNT) || '/' || TO_CHAR(DUR_ELAPSED) || '[' || TO_CHAR(ROUND(100*top_sess_rec.EVENT_CNT/DUR_ELAPSED, 2), DIG_2_FM) || '%]' - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - - APPEND_ROW(' '); - APPEND_ROW('## Top latches:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 20, 20); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Latch', 'Sampled Count', '% Activity'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT * FROM (SELECT EVENT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100'; - OPEN top_event_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH top_event_cv INTO top_latch_rec; - EXIT WHEN top_event_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - TO_CHAR(top_latch_rec.EVENT), - TO_CHAR(top_latch_rec.SAMPLE_CNT), - TO_CHAR(ROUND(100 * top_latch_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%' - ), column_widths, ' ', '|')); - END LOOP; - CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - APPEND_ROW(' '); - APPEND_ROW('## Node Load:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 20, 20, 20, 30); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('SVR IP', 'SVR PORT', 'Sampled Count', 'Idle Wait Count', 'Load'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT SVR_IP, SVR_PORT, count(1) SAMPLE_CNT , SUM(CASE WHEN wait_class_id = 106 THEN 1 ELSE 0 END) IDLE_WAIT_CNT FROM(' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - 'GROUP BY SVR_IP, SVR_PORT'; - OPEN node_load_cv FOR DYN_SQL - USING ASH_BEGIN_TIME, ASH_END_TIME, - ASH_BEGIN_TIME, ASH_END_TIME, - SQL_ID, SQL_ID, - TRACE_ID, TRACE_ID, - WAIT_CLASS, WAIT_CLASS, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR; - LOOP - FETCH node_load_cv INTO node_load_rec; - EXIT WHEN node_load_cv%NOTFOUND; - APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - TO_CHAR(node_load_rec.SVR_IP), - TO_CHAR(node_load_rec.SVR_PORT), - TO_CHAR(node_load_rec.SAMPLE_CNT), - TO_CHAR(node_load_rec.IDLE_WAIT_CNT), - TO_CHAR(ROUND((node_load_rec.SAMPLE_CNT - node_load_rec.IDLE_WAIT_CNT)/DUR_ELAPSED, 2), DIG_2_FM) - ), column_widths, ' ', '|')); - END LOOP; - CLOSE node_load_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-', '-'); - APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - - - return RPT_ROWS; - -END ASH_REPORT_TEXT; - - --- entry function -PROCEDURE ASH_REPORT(BTIME IN DATE, - ETIME IN DATE, +PROCEDURE ASH_REPORT(BTIME IN TIMESTAMP, + ETIME IN TIMESTAMP, SQL_ID IN VARCHAR2 DEFAULT NULL, TRACE_ID IN VARCHAR2 DEFAULT NULL, WAIT_CLASS IN VARCHAR2 DEFAULT NULL, - REPORT_TYPE IN VARCHAR2 DEFAULT 'text' + REPORT_TYPE IN VARCHAR2 DEFAULT 'text', + SVR_IP IN VARCHAR2 DEFAULT NULL, + SVR_PORT IN NUMBER DEFAULT NULL, + TENANT_ID IN NUMBER DEFAULT NULL ) IS - -- REPORT_TYPE is reserved for 'text'/'html', currently only 'text' supported - res AWRRPT_TEXT_TYPE_TABLE; + res CLOB; + clob_length INTEGER; + begin_offset INTEGER := 1; + end_offset INTEGER := 1; + line CLOB; + newline_char CHAR(1) := CHR(10); -- Newline character (LF) BEGIN DBMS_OUTPUT.ENABLE(NULL); - res := DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(BTIME, ETIME, SQL_ID, WAIT_CLASS); - for i in res.first .. res.last loop - DBMS_OUTPUT.put_line(res(i)); - end loop; + IF (LOWER(REPORT_TYPE) = 'text' OR LOWER(REPORT_TYPE) = 'html') THEN + res := DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(BTIME, ETIME, SQL_ID, TRACE_ID, WAIT_CLASS, SVR_IP, SVR_PORT, TENANT_ID, LOWER(REPORT_TYPE)); + clob_length := DBMS_LOB.GETLENGTH(res); + WHILE end_offset <= clob_length LOOP + end_offset := DBMS_LOB.INSTR(res, newline_char, begin_offset, 1); + IF end_offset = 0 THEN + DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(res, 32767, begin_offset)); + EXIT; + END IF; + line := DBMS_LOB.SUBSTR(res, end_offset - begin_offset, begin_offset); + DBMS_OUTPUT.PUT_LINE(line); + begin_offset := end_offset + 1; + END LOOP; + ELSE + DBMS_OUTPUT.PUT_LINE('Other formats are not currently supported besides text and html'); + END IF; + -- DBMS_OUTPUT.NEW_LINE(); END ASH_REPORT; - - END dbms_workload_repository; diff --git a/src/share/inner_table/sys_package/dbms_workload_repository_body_mysql.sql b/src/share/inner_table/sys_package/dbms_workload_repository_body_mysql.sql index 0f5ead165c..fdc0b6a579 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository_body_mysql.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository_body_mysql.sql @@ -15,29 +15,37 @@ CREATE OR REPLACE PACKAGE BODY dbms_workload_repository PROCEDURE MODIFY_SNAPSHOT_SETTINGS( retention INT DEFAULT NULL, - interval INT DEFAULT NULL); + interval INT DEFAULT NULL, + topnsql INT DEFAULT NULL); PRAGMA INTERFACE(C, WR_MODIFY_SNAPSHOT_SETTINGS); - FUNCTION ASH_REPORT_TEXT(BTIME DATETIME, - ETIME DATETIME, + FUNCTION ASH_REPORT_TEXT(BTIME TIMESTAMP, + ETIME TIMESTAMP, SQL_ID VARCHAR(64) DEFAULT NULL, TRACE_ID VARCHAR(64) DEFAULT NULL, - WAIT_CLASS VARCHAR(64) DEFAULT NULL + WAIT_CLASS VARCHAR(64) DEFAULT NULL, + SVR_IP VARCHAR(64) DEFAULT NULL, + SVR_PORT INT DEFAULT NULL, + TENANT_ID INT DEFAULT NULL, + REPORT_TYPE VARCHAR(64) DEFAULT 'text' )RETURN TEXT; PRAGMA INTERFACE(C, GENERATE_ASH_REPORT_TEXT); PROCEDURE ASH_REPORT( - BTIME DATETIME, - ETIME DATETIME, + BTIME TIMESTAMP, + ETIME TIMESTAMP, SQL_ID VARCHAR(64) DEFAULT NULL, TRACE_ID VARCHAR(64) DEFAULT NULL, WAIT_CLASS VARCHAR(64) DEFAULT NULL, - REPORT_TYPE VARCHAR(64) DEFAULT 'text') + REPORT_TYPE VARCHAR(64) DEFAULT 'text', + SVR_IP VARCHAR(64) DEFAULT NULL, + SVR_PORT INT DEFAULT NULL, + TENANT_ID INT DEFAULT NULL) BEGIN - IF LOWER(REPORT_TYPE) = 'text' THEN - SELECT DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(BTIME, ETIME,SQL_ID,TRACE_ID,WAIT_CLASS) AS REPORT ; + IF (LOWER(REPORT_TYPE) = 'text' OR LOWER(REPORT_TYPE) = 'html') THEN + SELECT DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(BTIME, ETIME,SQL_ID,TRACE_ID,WAIT_CLASS, SVR_IP, SVR_PORT, TENANT_ID, LOWER(REPORT_TYPE)) AS REPORT ; ELSE - SELECT "Other formats are not currently supported besides TEXT" AS Message; + SELECT "Other formats are not currently supported besides text and html" AS Message; END IF; END ; diff --git a/src/share/inner_table/sys_package/dbms_workload_repository_mysql.sql b/src/share/inner_table/sys_package/dbms_workload_repository_mysql.sql index 5ad95c8be4..4ae33f76e8 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository_mysql.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository_mysql.sql @@ -12,20 +12,28 @@ CREATE OR REPLACE PACKAGE dbms_workload_repository AUTHID CURRENT_USER PROCEDURE MODIFY_SNAPSHOT_SETTINGS( retention INT DEFAULT NULL, - interval INT DEFAULT NULL); + interval INT DEFAULT NULL, + topnsql INT DEFAULT NULL); - FUNCTION ASH_REPORT_TEXT(BTIME DATETIME, - ETIME DATETIME, + FUNCTION ASH_REPORT_TEXT(BTIME TIMESTAMP, + ETIME TIMESTAMP, SQL_ID VARCHAR(64) DEFAULT NULL, TRACE_ID VARCHAR(64) DEFAULT NULL, - WAIT_CLASS VARCHAR(64) DEFAULT NULL + WAIT_CLASS VARCHAR(64) DEFAULT NULL, + SVR_IP VARCHAR(64) DEFAULT NULL, + SVR_PORT INT DEFAULT NULL, + TENANT_ID INT DEFAULT NULL, + REPORT_TYPE VARCHAR(64) DEFAULT 'text' )RETURN TEXT ; - PROCEDURE ASH_REPORT(BTIME DATETIME, - ETIME DATETIME, + PROCEDURE ASH_REPORT(BTIME TIMESTAMP, + ETIME TIMESTAMP, SQL_ID VARCHAR(64) DEFAULT NULL, TRACE_ID VARCHAR(64) DEFAULT NULL, WAIT_CLASS VARCHAR(64) DEFAULT NULL, - REPORT_TYPE VARCHAR(64) DEFAULT 'text'); + REPORT_TYPE VARCHAR(64) DEFAULT 'text', + SVR_IP VARCHAR(64) DEFAULT NULL, + SVR_PORT INT DEFAULT NULL, + TENANT_ID INT DEFAULT NULL); END dbms_workload_repository; diff --git a/src/share/inner_table/table_id_to_name b/src/share/inner_table/table_id_to_name index 7eb366aa2c..b7b786e0f6 100644 --- a/src/share/inner_table/table_id_to_name +++ b/src/share/inner_table/table_id_to_name @@ -334,9 +334,12 @@ # 484: __all_storage_ha_perf_diagnose_history # 485: __all_clone_job # 486: __all_clone_job_history +# 487: __wr_system_event +# 488: __wr_event_name # 490: __all_routine_privilege # 491: __all_routine_privilege_history # 491: __all_routine_privilege # BASE_TABLE_NAME +# 492: __wr_sqlstat # 493: __all_ncomp_dll # 494: __all_aux_stat # 495: __all_index_usage_info @@ -346,6 +349,7 @@ # 499: __all_transfer_partition_task_history # 499: __all_transfer_partition_task # BASE_TABLE_NAME # 500: __all_tenant_snapshot_job +# 501: __wr_sqltext # 502: __all_trusted_root_certificate # 503: __all_audit_log_filter # 504: __all_audit_log_user @@ -369,6 +373,7 @@ # 522: __all_pkg_type # 523: __all_pkg_type_attr # 524: __all_pkg_coll_type +# 525: __wr_sql_plan # 528: __all_ncomp_dll_v2 # 10001: __tenant_virtual_all_table # 10002: __tenant_virtual_table_column @@ -463,6 +468,7 @@ # 11117: __all_virtual_tablet_stat # 11118: __all_virtual_ddl_sim_point # 11119: __all_virtual_ddl_sim_point_stat +# 11120: __all_virtual_res_mgr_sysstat # 12001: SESSION_VARIABLES # 12006: GLOBAL_STATUS # 12008: SESSION_STATUS @@ -1087,12 +1093,19 @@ # 12437: __all_virtual_checkpoint_diagnose_memtable_info # 12438: __all_virtual_checkpoint_diagnose_checkpoint_unit_info # 12439: __all_virtual_checkpoint_diagnose_info +# 12440: __all_virtual_wr_system_event +# 12440: __wr_system_event # BASE_TABLE_NAME +# 12441: __all_virtual_wr_event_name +# 12441: __wr_event_name # BASE_TABLE_NAME # 12442: __all_virtual_tenant_scheduler_running_job # 12443: __all_virtual_routine_privilege # 12443: __all_routine_privilege # BASE_TABLE_NAME # 12444: __all_virtual_routine_privilege_history # 12444: __all_routine_privilege # BASE_TABLE_NAME # 12444: __all_routine_privilege_history # BASE_TABLE_NAME1 +# 12445: __all_virtual_sqlstat +# 12446: __all_virtual_wr_sqlstat +# 12446: __wr_sqlstat # BASE_TABLE_NAME # 12447: __all_virtual_aux_stat # 12447: __all_aux_stat # BASE_TABLE_NAME # 12448: __all_virtual_detect_lock_info @@ -1107,6 +1120,8 @@ # 12452: __all_transfer_partition_task_history # BASE_TABLE_NAME1 # 12453: __all_virtual_tenant_snapshot_job # 12453: __all_tenant_snapshot_job # BASE_TABLE_NAME +# 12454: __all_virtual_wr_sqltext +# 12454: __wr_sqltext # BASE_TABLE_NAME # 12456: __all_virtual_dbms_lock_allocated # 12456: __all_dbms_lock_allocated # BASE_TABLE_NAME # 12457: __all_virtual_shared_storage_compaction_info @@ -1174,6 +1189,8 @@ # 12499: __all_virtual_pkg_coll_type # 12499: __all_pkg_coll_type # BASE_TABLE_NAME # 12500: __all_virtual_kv_client_info +# 12501: __all_virtual_wr_sql_plan +# 12501: __wr_sql_plan # BASE_TABLE_NAME # 12504: __all_virtual_function_io_stat # 12505: __all_virtual_temp_file # 12506: __all_virtual_ncomp_dll_v2 @@ -1750,6 +1767,19 @@ # 15414: __all_virtual_ls_info # BASE_TABLE_NAME # 15418: ALL_VIRTUAL_CGROUP_CONFIG # 15418: __all_virtual_cgroup_config # BASE_TABLE_NAME +# 15421: ALL_VIRTUAL_WR_SYSTEM_EVENT +# 15421: __wr_system_event # BASE_TABLE_NAME +# 15421: __all_virtual_wr_system_event # BASE_TABLE_NAME1 +# 15422: ALL_VIRTUAL_WR_EVENT_NAME +# 15422: __wr_event_name # BASE_TABLE_NAME +# 15422: __all_virtual_wr_event_name # BASE_TABLE_NAME1 +# 15424: ALL_VIRTUAL_SQLSTAT +# 15424: __all_virtual_sqlstat # BASE_TABLE_NAME +# 15425: ALL_VIRTUAL_WR_SQLSTAT +# 15425: __wr_sqlstat # BASE_TABLE_NAME +# 15425: __all_virtual_wr_sqlstat # BASE_TABLE_NAME1 +# 15426: TENANT_VIRTUAL_STATNAME +# 15426: __tenant_virtual_statname # BASE_TABLE_NAME # 15427: ALL_VIRTUAL_AUX_STAT_REAL_AGENT # 15427: __all_aux_stat # BASE_TABLE_NAME # 15428: ALL_VIRTUAL_SYS_VARIABLE_REAL_AGENT @@ -1761,6 +1791,9 @@ # 15431: ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT # 15431: __all_transfer_partition_task # BASE_TABLE_NAME # 15431: __all_transfer_partition_task_history # BASE_TABLE_NAME1 +# 15432: ALL_VIRTUAL_WR_SQLTEXT +# 15432: __wr_sqltext # BASE_TABLE_NAME +# 15432: __all_virtual_wr_sqltext # BASE_TABLE_NAME1 # 15439: ALL_VIRTUAL_LS_SNAPSHOT # 15439: __all_virtual_ls_snapshot # BASE_TABLE_NAME # 15440: ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT @@ -1794,6 +1827,8 @@ # 15455: __all_zone_storage # BASE_TABLE_NAME # 15456: ALL_VIRTUAL_NIC_INFO # 15456: __all_virtual_nic_info # BASE_TABLE_NAME +# 15457: ALL_VIRTUAL_QUERY_RESPONSE_TIME +# 15457: __all_virtual_query_response_time # BASE_TABLE_NAME # 15458: ALL_VIRTUAL_SCHEDULER_JOB_RUN_DETAIL_V2_REAL_AGENT # 15458: __all_scheduler_job_run_detail_v2 # BASE_TABLE_NAME # 15459: ALL_VIRTUAL_SPATIAL_REFERENCE_SYSTEMS_REAL_AGENT @@ -1819,6 +1854,11 @@ # 15472: __all_pkg_type_attr # BASE_TABLE_NAME # 15473: ALL_VIRTUAL_PKG_COLL_TYPE_REAL_AGENT # 15473: __all_pkg_coll_type # BASE_TABLE_NAME +# 15481: ALL_VIRTUAL_WR_SQL_PLAN +# 15481: __wr_sql_plan # BASE_TABLE_NAME +# 15481: __all_virtual_wr_sql_plan # BASE_TABLE_NAME1 +# 15482: ALL_VIRTUAL_RES_MGR_SYSSTAT +# 15482: __all_virtual_res_mgr_sysstat # BASE_TABLE_NAME # 15484: ALL_VIRTUAL_FUNCTION_IO_STAT # 15484: __all_virtual_function_io_stat # BASE_TABLE_NAME # 15485: ALL_VIRTUAL_TEMP_FILE @@ -2211,8 +2251,22 @@ # 21478: V$OB_TENANT_RUNTIME_INFO # 21479: GV$OB_CGROUP_CONFIG # 21480: V$OB_CGROUP_CONFIG +# 21481: DBA_WR_SYSTEM_EVENT +# 21482: CDB_WR_SYSTEM_EVENT +# 21483: DBA_WR_EVENT_NAME +# 21484: CDB_WR_EVENT_NAME # 21485: DBA_OB_FORMAT_OUTLINES # 21486: procs_priv +# 21487: GV$OB_SQLSTAT +# 21488: V$OB_SQLSTAT +# 21489: DBA_WR_SQLSTAT +# 21490: CDB_WR_SQLSTAT +# 21491: GV$OB_SESS_TIME_MODEL +# 21492: V$OB_SESS_TIME_MODEL +# 21493: GV$OB_SYS_TIME_MODEL +# 21494: V$OB_SYS_TIME_MODEL +# 21495: DBA_WR_SYS_TIME_MODEL +# 21496: CDB_WR_SYS_TIME_MODEL # 21497: DBA_OB_AUX_STATISTICS # 21498: CDB_OB_AUX_STATISTICS # 21499: DBA_INDEX_USAGE @@ -2221,6 +2275,10 @@ # 21502: CDB_OB_TRANSFER_PARTITION_TASKS # 21503: DBA_OB_TRANSFER_PARTITION_TASK_HISTORY # 21504: CDB_OB_TRANSFER_PARTITION_TASK_HISTORY +# 21505: DBA_WR_SQLTEXT +# 21506: CDB_WR_SQLTEXT +# 21507: GV$OB_ACTIVE_SESSION_HISTORY +# 21508: V$OB_ACTIVE_SESSION_HISTORY # 21509: DBA_OB_TRUSTED_ROOT_CERTIFICATE # 21510: DBA_OB_CLONE_PROGRESS # 21511: role_edges @@ -2298,6 +2356,8 @@ # 21584: ROLE_ROUTINE_GRANTS # 21585: func # 21586: GV$OB_NIC_INFO +# 21587: GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM +# 21588: V$OB_QUERY_RESPONSE_TIME_HISTOGRAM # 21589: DBA_SCHEDULER_JOB_RUN_DETAILS # 21590: CDB_SCHEDULER_JOB_RUN_DETAILS # 21592: CDB_OB_SERVER_SPACE_USAGE @@ -2315,6 +2375,10 @@ # 21605: INNODB_SYS_FOREIGN_COLS # 21607: GV$OB_KV_CLIENT_INFO # 21608: V$OB_KV_CLIENT_INFO +# 21610: GV$OB_RES_MGR_SYSSTAT +# 21611: V$OB_RES_MGR_SYSSTAT +# 21612: DBA_WR_SQL_PLAN +# 21613: CDB_WR_SQL_PLAN # 21616: DBA_OB_SPM_EVO_RESULT # 21617: CDB_OB_SPM_EVO_RESULT # 21620: GV$OB_FUNCTION_IO_STAT @@ -2575,9 +2639,14 @@ # 25265: DBA_OB_IMPORT_TABLE_JOB_HISTORY # 25266: DBA_OB_IMPORT_TABLE_TASKS # 25267: DBA_OB_IMPORT_TABLE_TASK_HISTORY +# 25269: DBA_WR_SYSTEM_EVENT +# 25270: DBA_WR_EVENT_NAME # 25272: DBA_OB_FORMAT_OUTLINES +# 25273: DBA_WR_SQLSTAT +# 25274: DBA_WR_SYS_TIME_MODEL # 25275: DBA_OB_TRANSFER_PARTITION_TASKS # 25276: DBA_OB_TRANSFER_PARTITION_TASK_HISTORY +# 25277: DBA_WR_SQLTEXT # 25278: USER_USERS # 25279: DBA_OB_LS_REPLICA_TASK_HISTORY # 25283: DBA_MVIEW_LOGS @@ -2775,8 +2844,17 @@ # 28199: V$OB_PL_CACHE_OBJECT # 28200: GV$OB_CGROUP_CONFIG # 28201: V$OB_CGROUP_CONFIG +# 28203: GV$OB_SQLSTAT +# 28204: V$OB_SQLSTAT +# 28205: GV$OB_SESS_TIME_MODEL +# 28206: V$OB_SESS_TIME_MODEL +# 28207: GV$OB_SYS_TIME_MODEL +# 28208: V$OB_SYS_TIME_MODEL +# 28209: V$STATNAME # 28210: DBA_OB_AUX_STATISTICS # 28211: DBA_OB_SYS_VARIABLES +# 28212: GV$OB_ACTIVE_SESSION_HISTORY +# 28213: V$OB_ACTIVE_SESSION_HISTORY # 28214: DBA_INDEX_USAGE # 28215: GV$OB_LS_SNAPSHOTS # 28216: V$OB_LS_SNAPSHOTS @@ -2795,6 +2873,8 @@ # 28229: GV$OB_GROUP_IO_STAT # 28230: GV$OB_NIC_INFO # 28231: V$OB_NIC_INFO +# 28232: GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM +# 28233: V$OB_QUERY_RESPONSE_TIME_HISTOGRAM # 28234: DBA_OB_SPATIAL_COLUMNS # 28237: DBA_OB_TABLE_SPACE_USAGE # 28238: GV$OB_LOG_TRANSPORT_DEST_STAT @@ -2810,6 +2890,9 @@ # 28250: ALL_PLSQL_TYPE_ATTRS # 28251: DBA_PLSQL_TYPE_ATTRS # 28252: USER_PLSQL_TYPE_ATTRS +# 28257: GV$OB_RES_MGR_SYSSTAT +# 28258: V$OB_RES_MGR_SYSSTAT +# 28259: DBA_WR_SQL_PLAN # 28261: DBA_OB_SPM_EVO_RESULT # 28262: GV$OB_FUNCTION_IO_STAT # 28263: V$OB_FUNCTION_IO_STAT diff --git a/src/share/io/ob_io_define.cpp b/src/share/io/ob_io_define.cpp index 82fae58397..eaff419a24 100644 --- a/src/share/io/ob_io_define.cpp +++ b/src/share/io/ob_io_define.cpp @@ -1890,7 +1890,7 @@ int ObIOHandle::wait(const int64_t wait_timeout_ms) void ObIOHandle::estimate() { if (OB_NOT_NULL(result_) && result_->is_finished_ && !ATOMIC_CAS(&result_->has_estimated_, false, true)) { - oceanbase::common::ObTenantStatEstGuard guard(result_->get_tenant_id()); + oceanbase::common::ObTenantDiagnosticInfoSummaryGuard guard(result_->get_tenant_id(), result_->flag_.get_resource_group_id()); const int64_t result_delay = get_io_interval(result_->time_log_.end_ts_, result_->time_log_.begin_ts_); if (result_->flag_.is_read()) { EVENT_INC(ObStatEventIds::IO_READ_COUNT); diff --git a/src/share/io/ob_io_struct.cpp b/src/share/io/ob_io_struct.cpp index c8038fe7e0..303ada09c2 100644 --- a/src/share/io/ob_io_struct.cpp +++ b/src/share/io/ob_io_struct.cpp @@ -916,7 +916,7 @@ void ObIOTuner::run1() LOG_WARN("fail to send detect task", K(ret)); } } - ob_usleep(100 * 1000); // 100ms + ob_usleep(100 * 1000, true/*is_idle_sleep*/); // 100ms } LOG_INFO("io tuner thread stopped"); } @@ -1336,6 +1336,7 @@ int ObIOSender::dequeue_request(ObIORequest *&req) } else if (OB_EAGAIN == ret || OB_ENTRY_NOT_EXIST == ret) { const int64_t timeout_us = calc_wait_timeout(queue_deadline_ts); int tmp_ret = OB_SUCCESS; + ObBKGDSessInActiveGuard inactive_guard; if (timeout_us > 0 && OB_SUCCESS != (tmp_ret = queue_cond_.wait_us(timeout_us))) { if (OB_TIMEOUT == tmp_ret) { // normal case, ignore @@ -3029,6 +3030,7 @@ int ObIORunner::pop(ObIORequest *&req) if (OB_FAIL(guard.get_ret())) { LOG_ERROR("fail to guard callback condition", K(ret)); } else if (queue_.get_total() <= 0) { + ObBKGDSessInActiveGuard inactive_guard; if (OB_FAIL(cond_.wait_us(CALLBACK_WAIT_PERIOD_US))) { if (OB_TIMEOUT != ret) { LOG_ERROR("fail to wait callback condition", K(ret)); diff --git a/src/share/location_cache/ob_location_service.cpp b/src/share/location_cache/ob_location_service.cpp index 9d45256439..d7e3639e2b 100644 --- a/src/share/location_cache/ob_location_service.cpp +++ b/src/share/location_cache/ob_location_service.cpp @@ -375,6 +375,7 @@ int ObLocationService::batch_renew_tablet_locations( const int error_code, const bool is_nonblock) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::RENEW_TABLET_LOCATION); int ret = OB_SUCCESS; if (OB_UNLIKELY(!inited_)) { ret = OB_NOT_INIT; diff --git a/src/share/ls/ob_ls_recovery_stat_operator.cpp b/src/share/ls/ob_ls_recovery_stat_operator.cpp index aa1efcfcf2..83b80f35c9 100644 --- a/src/share/ls/ob_ls_recovery_stat_operator.cpp +++ b/src/share/ls/ob_ls_recovery_stat_operator.cpp @@ -252,6 +252,7 @@ int ObLSRecoveryStatOperator::update_ls_recovery_stat_in_trans( const SCN &readable_scn = ls_recovery.get_readable_scn() > old_ls_recovery.get_readable_scn() ? ls_recovery.get_readable_scn() : old_ls_recovery.get_readable_scn(); common::ObSqlString sql; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_UPDATE_LS_RECOVERY_STAT); if (OB_FAIL(sql.assign_fmt("UPDATE %s SET sync_scn = %lu, readable_scn = " "%lu where ls_id = %ld and tenant_id = %lu", OB_ALL_LS_RECOVERY_STAT_TNAME, sync_scn.get_val_for_inner_table_field(), @@ -351,6 +352,7 @@ int ObLSRecoveryStatOperator::get_ls_recovery_stat( } else { common::ObSqlString sql; ObSEArray ls_recovery_array; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_GET_LS_RECOVERY_STAT); if (OB_FAIL(sql.assign_fmt("select * from %s where ls_id = %ld and tenant_id = %lu", OB_ALL_LS_RECOVERY_STAT_TNAME, ls_id.id(), tenant_id))) { LOG_WARN("failed to assign sql", KR(ret), K(sql)); @@ -453,6 +455,7 @@ int ObLSRecoveryStatOperator::get_tenant_recovery_stat(const uint64_t tenant_id, common::ObSqlString sql; common::ObSqlString status_sql; const uint64_t exec_tenant_id = get_exec_tenant_id(tenant_id); + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_GET_TENANT_RECOVERY_STAT); //The sync_scn and readable_scn at the tenant level need to be calculated separately, and the reference LS list is different. //The following statement collects sync_scn and readable_scn at the same time in one SQL. // diff --git a/src/share/ls/ob_ls_status_operator.cpp b/src/share/ls/ob_ls_status_operator.cpp index e782e0b63c..8c8d107a2a 100644 --- a/src/share/ls/ob_ls_status_operator.cpp +++ b/src/share/ls/ob_ls_status_operator.cpp @@ -550,6 +550,7 @@ int ObLSStatusOperator::get_all_ls_status_by_order( ret = OB_ERR_UNEXPECTED; LOG_WARN("operation is not valid", KR(ret), K(tenant_id)); } else { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_GET_ALL_LS_STATUS_BY_ORDER); ObSqlString sql; if (OB_FAIL(sql.assign_fmt( "SELECT * FROM %s WHERE tenant_id = %lu ORDER BY tenant_id, ls_id", @@ -1051,6 +1052,7 @@ int ObLSStatusOperator::get_ls_primary_zone_info(const uint64_t tenant_id, const } else { common::ObSqlString sql; ObSEArray ls_primary_zone_array; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_GET_LS_PRIMARY_ZONE_INFO); if (OB_FAIL(construct_ls_primary_info_sql_(sql))) { LOG_WARN("failed to construct sql", KR(ret), K(sql)); } else if (OB_FAIL(sql.append_fmt(" where a.ls_id = %ld and a.tenant_id = %lu", diff --git a/src/share/ob_autoincrement_service.cpp b/src/share/ob_autoincrement_service.cpp index 46fc08c554..bb124cc239 100644 --- a/src/share/ob_autoincrement_service.cpp +++ b/src/share/ob_autoincrement_service.cpp @@ -31,6 +31,8 @@ #include "share/ob_schema_status_proxy.h" #include "observer/ob_server_struct.h" #include "observer/ob_sql_client_decorator.h" +#include "lib/ash/ob_active_session_guard.h" +#include "lib/wait_event/ob_inner_sql_wait_type.h" using namespace oceanbase::obrpc; using namespace oceanbase::common; @@ -653,6 +655,7 @@ int ObAutoincrementService::lock_autoinc_row(const uint64_t &tenant_id, int ret = OB_SUCCESS; ObSqlString lock_sql; SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_LOAD); ObMySQLResult *result = NULL; ObISQLClient *sql_client = &trans; if (OB_FAIL(lock_sql.assign_fmt("SELECT sequence_key, sequence_value, sync_value " @@ -689,6 +692,7 @@ int ObAutoincrementService::reset_autoinc_row(const uint64_t &tenant_id, int ret = OB_SUCCESS; ObSqlString update_sql; int64_t affected_rows = 0; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_SAVE); if (OB_FAIL(update_sql.assign_fmt("UPDATE %s SET sequence_value = 1, sync_value = 0, truncate_version = %ld", OB_ALL_AUTO_INCREMENT_TNAME, autoinc_version))) { @@ -1959,6 +1963,7 @@ int ObAutoIncInnerTableProxy::next_autoinc_value(const AutoincKey &key, ObMySQLResult *result = NULL; ObISQLClient *sql_client = &trans; uint64_t sequence_table_id = OB_ALL_AUTO_INCREMENT_TID; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_LOAD); ObSQLClientRetryWeak sql_client_retry_weak(sql_client, exec_tenant_id, sequence_table_id); @@ -2045,6 +2050,7 @@ int ObAutoIncInnerTableProxy::next_autoinc_value(const AutoincKey &key, column_id, inner_autoinc_version); int64_t affected_rows = 0; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_SAVE); if (sql_len >= OB_MAX_SQL_LENGTH || sql_len <= 0) { ret = OB_SIZE_OVERFLOW; LOG_WARN("failed to format sql. size not enough", K(ret), K(sql_len)); @@ -2084,6 +2090,7 @@ int ObAutoIncInnerTableProxy::get_autoinc_value(const AutoincKey &key, const uint64_t tenant_id = key.tenant_id_; const int64_t tmp_autoinc_version = get_modify_autoinc_version(autoinc_version); SMART_VARS_2((ObMySQLProxy::MySQLResult, res), (char[OB_MAX_SQL_LENGTH], sql)) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_LOAD); ObMySQLResult *result = NULL; int sql_len = 0; const uint64_t exec_tenant_id = tenant_id; @@ -2193,6 +2200,7 @@ int ObAutoIncInnerTableProxy::get_autoinc_value_in_batch( if (OB_SUCC(ret)) { SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_LOAD); ObMySQLResult *result = NULL; int64_t table_id = 0; int64_t column_id = 0; @@ -2276,6 +2284,7 @@ int ObAutoIncInnerTableProxy::sync_autoinc_value(const AutoincKey &key, } if (OB_SUCC(ret)) { SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_LOAD); ObMySQLResult *result = NULL; ObISQLClient *sql_client = &trans; uint64_t sequence_table_id = OB_ALL_AUTO_INCREMENT_TID; @@ -2337,6 +2346,7 @@ int ObAutoIncInnerTableProxy::sync_autoinc_value(const AutoincKey &key, // Why don't we calculate AUTO_INCREMENT in real time when we execute the SHOW // statement? // > I can't get MAX_VALUE in DDL context. auto inc column type is needed. + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::SEQUENCE_SAVE); if (OB_FAIL(sql.assign_fmt( "UPDATE %s SET sync_value = %lu, sequence_value = %lu, gmt_modified = now(6) " "WHERE tenant_id=%lu AND sequence_key=%lu AND column_id=%lu AND truncate_version=%ld", diff --git a/src/share/ob_bg_thread_monitor.cpp b/src/share/ob_bg_thread_monitor.cpp index cecd10272f..a417d5a7be 100644 --- a/src/share/ob_bg_thread_monitor.cpp +++ b/src/share/ob_bg_thread_monitor.cpp @@ -342,7 +342,7 @@ void ObBGThreadMonitor::run_loop_() if (sleep_time < 0) { sleep_time = 0; } - ob_usleep(sleep_time); + ob_usleep(sleep_time, true/*is_idle_sleep*/); } } diff --git a/src/share/ob_cluster_version.cpp b/src/share/ob_cluster_version.cpp index f306005f74..847cf202b6 100644 --- a/src/share/ob_cluster_version.cpp +++ b/src/share/ob_cluster_version.cpp @@ -255,6 +255,20 @@ int ObClusterVersion::get_tenant_data_version( return ret; } +int ObClusterVersion::tenant_need_upgrade( + const uint64_t tenant_id, + bool &need_upgrade) +{ + int ret = OB_SUCCESS; + uint64_t data_version = 0; + if (OB_FAIL(get_tenant_data_version(tenant_id, data_version))) { + COMMON_LOG(WARN, "fail to get tenant data version", KR(ret), K(tenant_id)); + } else { + need_upgrade = (data_version < DATA_CURRENT_VERSION); + } + return ret; +} + int ObClusterVersion::is_valid(const char *verstr) { diff --git a/src/share/ob_cluster_version.h b/src/share/ob_cluster_version.h index 5c46028070..6e17e95873 100644 --- a/src/share/ob_cluster_version.h +++ b/src/share/ob_cluster_version.h @@ -50,6 +50,7 @@ public: /* data version related */ int get_tenant_data_version(const uint64_t tenant_id, uint64_t &data_version); + int tenant_need_upgrade(const uint64_t tenant_id, bool &need_upgrade); // ATTENTION!!! this interface only work for unittest void update_data_version(const uint64_t data_version); /*------------------------*/ @@ -85,6 +86,7 @@ private: // should check returned ret #define GET_MIN_DATA_VERSION(tenant_id, data_version) (oceanbase::common::ObClusterVersion::get_instance().get_tenant_data_version((tenant_id), (data_version))) +#define TENANT_NEED_UPGRADE(tenant_id, need) (oceanbase::common::ObClusterVersion::get_instance().tenant_need_upgrade((tenant_id), (need))) // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } // end of namespace common diff --git a/src/share/ob_ddl_task_executor.cpp b/src/share/ob_ddl_task_executor.cpp index bb57faaff8..a29fe75164 100644 --- a/src/share/ob_ddl_task_executor.cpp +++ b/src/share/ob_ddl_task_executor.cpp @@ -275,7 +275,10 @@ void ObDDLTaskExecutor::run1() } } cond_.lock(); - cond_.wait(CHECK_TASK_INTERVAL); + { + ObBKGDSessInActiveGuard inactive_guard; + cond_.wait(CHECK_TASK_INTERVAL); + } cond_.unlock(); executed_task_count = 0; first_retry_task = NULL; diff --git a/src/share/ob_dml_sql_splicer.cpp b/src/share/ob_dml_sql_splicer.cpp index 6d2f5370f4..d1f5fc3ee7 100644 --- a/src/share/ob_dml_sql_splicer.cpp +++ b/src/share/ob_dml_sql_splicer.cpp @@ -1101,6 +1101,23 @@ int ObDMLSqlSplicer::splice_batch_insert_sql(const char *table_name, ObSqlString return ret; } +int ObDMLSqlSplicer::splice_batch_insert_ignore_sql(const char *table_name, ObSqlString &sql) const +{ + int ret = OB_SUCCESS; + ObArray all_names; + ObArray rows_matrix; + if (NULL == table_name) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", K(ret), KP(table_name)); + } else if (columns_.count() <= 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column_count is invalid", K(ret), "column_count", columns_.count()); + } else if (OB_FAIL(splice_batch_insert(table_name, "INSERT IGNORE", sql, all_names, rows_matrix))) { + LOG_WARN("splice insert failed", K(ret), K(table_name)); + } + return ret; +} + int ObDMLSqlSplicer::splice_batch_replace_sql_without_plancache(const char *table_name, ObSqlString &sql) const { int ret = OB_SUCCESS; diff --git a/src/share/ob_dml_sql_splicer.h b/src/share/ob_dml_sql_splicer.h index efa21e288b..707b41bca9 100644 --- a/src/share/ob_dml_sql_splicer.h +++ b/src/share/ob_dml_sql_splicer.h @@ -128,6 +128,7 @@ public: // functions to splice batch sql statement int splice_batch_insert_sql(const char *table_name, common::ObSqlString &sql) const; + int splice_batch_insert_ignore_sql(const char *table_name, common::ObSqlString &sql) const; int splice_batch_insert_update_sql( const char *table_name, common::ObSqlString &sql) const; diff --git a/src/share/ob_local_device.cpp b/src/share/ob_local_device.cpp index 8dff2de23a..a0fc09ba9b 100644 --- a/src/share/ob_local_device.cpp +++ b/src/share/ob_local_device.cpp @@ -19,6 +19,8 @@ #include "share/config/ob_server_config.h" #include "share/ob_resource_limit.h" #include "storage/blocksstable/ob_block_sstable_struct.h" +#include "storage/slog/ob_storage_logger_manager.h" +#include "lib/ash/ob_active_session_guard.h" #include "storage/meta_store/ob_server_storage_meta_service.h" using namespace oceanbase::common; @@ -1147,6 +1149,7 @@ int ObLocalDevice::io_getevents( int sys_ret = 0; { oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_IO_EVENT); + common::ObBKGDSessInActiveGuard inactive_guard; while ((sys_ret = ::io_getevents( local_io_context->io_context_, min_nr, diff --git a/src/share/ob_occam_thread_pool.h b/src/share/ob_occam_thread_pool.h index 4e8b380d7d..dd0ecc8fa1 100644 --- a/src/share/ob_occam_thread_pool.h +++ b/src/share/ob_occam_thread_pool.h @@ -35,6 +35,8 @@ #include "lib/thread/ob_thread_name.h" #include "share/rc/ob_tenant_base.h" #include "share/ob_thread_pool.h" +#include "lib/ash/ob_active_session_guard.h" + namespace oceanbase { @@ -395,6 +397,7 @@ private: } else if (ret == OB_EAGAIN) { // all queue empty, waiting for someone commit task // OCCAM_LOG(DEBUG, "no task in queue, waiting...", K(thread_id)); ObThreadCondGuard guard(cv_); + common::ObBKGDSessInActiveGuard inactive_guard; while (total_task_count_ == 0 && !is_stopped_) { if (OB_FAIL(cv_.wait())) { OCCAM_LOG(ERROR, "cv_ wait return err code", K(ret)); diff --git a/src/share/ob_occam_time_guard.h b/src/share/ob_occam_time_guard.h index 777122be5c..f98f4e32e6 100644 --- a/src/share/ob_occam_time_guard.h +++ b/src/share/ob_occam_time_guard.h @@ -103,7 +103,8 @@ public: } } } - ob_usleep(static_cast(500_ms)); + ob_usleep(static_cast(500_ms), true/*is_idle_sleep*/); + } else { OCCAM_LOG(INFO, "thread hung detect thread is stopped"); break; diff --git a/src/share/ob_server_blacklist.cpp b/src/share/ob_server_blacklist.cpp index 2108a74f8c..012662a743 100644 --- a/src/share/ob_server_blacklist.cpp +++ b/src/share/ob_server_blacklist.cpp @@ -312,7 +312,7 @@ void ObServerBlacklist::blacklist_loop_() if (REACH_TIME_INTERVAL(5 * 1000 * 1000)) { SHARE_LOG(INFO, "blacklist_loop exec finished", K(cost_time), K_(is_enabled), K(send_cnt)); } - ob_usleep(sleep_time); + ob_usleep(sleep_time, true/*is_idle_sleep*/); } } diff --git a/src/share/ob_service_epoch_proxy.cpp b/src/share/ob_service_epoch_proxy.cpp index ce1f798571..051ca9432a 100644 --- a/src/share/ob_service_epoch_proxy.cpp +++ b/src/share/ob_service_epoch_proxy.cpp @@ -224,6 +224,7 @@ int ObServiceEpochProxy::inner_get_service_epoch_( const uint64_t meta_tenant_id = gen_meta_tenant_id(tenant_id); ObSqlString sql; SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::RS_GET_SERVICE_EPOCH); ObMySQLResult *result = nullptr; if (OB_FAIL(sql.assign_fmt("SELECT * FROM %s WHERE tenant_id = '%lu' AND name = '%s' %s", OB_ALL_SERVICE_EPOCH_TNAME, tenant_id, name, (is_for_update ? "FOR UPDATE" : "")))) { diff --git a/src/share/ob_tablet_autoincrement_service.cpp b/src/share/ob_tablet_autoincrement_service.cpp index e0405af1ec..81f0b45e31 100644 --- a/src/share/ob_tablet_autoincrement_service.cpp +++ b/src/share/ob_tablet_autoincrement_service.cpp @@ -311,6 +311,7 @@ void ObTabletAutoincrementService::release_mgr(ObTabletAutoincMgr *autoinc_mgr) int ObTabletAutoincrementService::get_autoinc_seq(const uint64_t tenant_id, const common::ObTabletID &tablet_id, uint64_t &autoinc_seq) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_sequence_load); int ret = OB_SUCCESS; const int64_t auto_increment_cache_size = 10000; //TODO(shuangcan): fix me ObTabletAutoincParam param; diff --git a/src/share/ob_task_define.cpp b/src/share/ob_task_define.cpp index cfa03f99b7..8f150a79e5 100644 --- a/src/share/ob_task_define.cpp +++ b/src/share/ob_task_define.cpp @@ -95,7 +95,7 @@ private: { lib::set_thread_name("LogLimiterRefresh"); while (!has_set_stop()) { - ob_usleep(100000); + ob_usleep(100000, true/*is_idle_sleep*/); limiter_.refresh(); } } diff --git a/src/share/ob_tenant_info_proxy.cpp b/src/share/ob_tenant_info_proxy.cpp index 21c6e36e19..8ea4b0e33a 100755 --- a/src/share/ob_tenant_info_proxy.cpp +++ b/src/share/ob_tenant_info_proxy.cpp @@ -428,6 +428,7 @@ int ObAllTenantInfoProxy::load_pure_tenant_info_(const uint64_t tenant_id, ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", KR(ret), K(tenant_id)); } else { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::RS_LOAD_PURE_TENANT_INFO); ObSqlString sql; uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id); if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) { diff --git a/src/share/object/ob_obj_cast.cpp b/src/share/object/ob_obj_cast.cpp index d5d7266515..03492a40b8 100644 --- a/src/share/object/ob_obj_cast.cpp +++ b/src/share/object/ob_obj_cast.cpp @@ -7894,6 +7894,41 @@ static int otimestamp_otimestamp(const ObObjType expect_type, ObObjCastParams &p return ret; } +//only use to convert Oracle timestamp type class to MySQL datetime type class, +//for scenarios such as: scan inner table in the Oracle tenant, since the inner table use the MySQL type system, +//when index conditions are involved, +//it is necessary to convert the scan range that includes Oracle timestamp type class to the MySQL datetime type class. +static int otimestamp_mydatetime(const ObObjType expect_type, ObObjCastParams ¶ms, + const ObObj &in, ObObj &out, const ObCastMode cast_mode) +{ + UNUSED(cast_mode); + int ret = OB_SUCCESS; + int64_t dt_value = 0; + if (OB_UNLIKELY(ObOTimestampTC != in.get_type_class()) + || OB_UNLIKELY(ObDateTimeTC != ob_obj_type_class(expect_type))) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("invalid input type", K(ret), K(in), K(expect_type)); + } else if (OB_FAIL(ObTimeConverter::otimestamp_to_odate(in.get_type(), in.get_otimestamp_value(), params.dtc_params_.tz_info_, dt_value))) { + LOG_WARN("fail to timestamp_tz_to_timestamp", K(ret), K(in), K(expect_type)); + } else if (ObTimestampType == expect_type) { + int64_t utc_value = 0; + if (OB_FAIL(ObTimeConverter::datetime_to_timestamp(dt_value, + params.dtc_params_.tz_info_, + utc_value))) { + LOG_WARN("failed to convert datetime to timestamp", K(ret)); + } else { + dt_value = utc_value; + } + } + if (OB_SUCC(ret)) { + ObTimeConverter::trunc_datetime(OB_MAX_DATETIME_PRECISION, dt_value); + out.set_datetime(expect_type, dt_value); + out.set_scale(OB_MAX_DATE_PRECISION); + } + SET_RES_ACCURACY(DEFAULT_PRECISION_FOR_TEMPORAL, in.get_scale(), DEFAULT_LENGTH_FOR_TEMPORAL); + return ret; +} + //////////////////////////////////////////////////////////// // Interval -> XXX static int interval_string(const ObObjType expect_type, ObObjCastParams ¶ms, @@ -11629,7 +11664,7 @@ ObObjCastFunc OB_OBJ_CAST[ObMaxTC][ObMaxTC] = cast_not_expected,/*float*/ cast_not_expected,/*double*/ cast_not_expected,/*number*/ - cast_not_expected,/*datetime*/ + otimestamp_mydatetime,/*datetime*/ cast_not_expected,/*date*/ cast_not_expected,/*time*/ cast_not_expected,/*year*/ diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 706ec51694..5427c53e5f 100644 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -1689,9 +1689,9 @@ DEF_BOOL(_enable_var_assign_use_das, OB_TENANT_PARAMETER, "False", "enable use das if the sql statement has variable assignment", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); // query response time -DEF_BOOL(query_response_time_stats, OB_TENANT_PARAMETER, "False", +DEF_BOOL(query_response_time_stats, OB_TENANT_PARAMETER, "True", "Enable or disable QUERY_RESPONSE_TIME statistics collecting" - "The default value is False. Value: TRUE: turned on FALSE: turned off", + "The default value is True. Value: TRUE: turned on FALSE: turned off", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); DEF_BOOL(query_response_time_flush, OB_TENANT_PARAMETER, "False", "Flush QUERY_RESPONSE_TIME table and re-read query_response_time_range_base" @@ -1699,7 +1699,7 @@ DEF_BOOL(query_response_time_flush, OB_TENANT_PARAMETER, "False", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); DEF_INT(query_response_time_range_base, OB_TENANT_PARAMETER, "10", "[2,10000]", "Select base of log for QUERY_RESPONSE_TIME ranges. WARNING: variable change takes affect only after flush." - "The default value is False. Value: TRUE: trigger flush FALSE: do not trigger", + "The default value is 10. Range: [2,10000]. ", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); DEF_TIME(arbitration_timeout, OB_TENANT_PARAMETER, "5s", "[3s,]", "The timeout before automatically degrading when arbitration member exists. Range: [3s,+∞]", @@ -2018,6 +2018,21 @@ DEF_INT(_ha_tablet_info_batch_count, OB_TENANT_PARAMETER, "0", "[0,]", DEF_TIME(_ha_rpc_timeout, OB_TENANT_PARAMETER, "0", "[0,120s]", "the rpc timeout for storage high availability. Range:[0, 120s]", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_CAP(_ob_ash_size, OB_CLUSTER_PARAMETER, "0M", "[0,1G]", + "to limit the memory size for ash buffer. Range: [0,1G] 0 means using default ash size" + ", 30MB in normal case, 10M in mini mode", + ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_ob_ash_enable, OB_CLUSTER_PARAMETER, "True", + "enable active session history", + ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_ob_ash_disk_write_enable, OB_CLUSTER_PARAMETER, "True", + "enable active session history early flush", + ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_ob_sqlstat_enable, OB_TENANT_PARAMETER, "True", "enable/disable sql stat", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); + +DEF_BOOL(_enable_inner_session_mgr, OB_TENANT_PARAMETER, "True", "enable/disable inner session mgr", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); DEF_BOOL(_enable_trace_tablet_leak, OB_TENANT_PARAMETER, "False", "enable t3m tablet leak checker. The default value is False", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::STATIC_EFFECTIVE)); diff --git a/src/share/ratelimit/ob_rl_mgr.cpp b/src/share/ratelimit/ob_rl_mgr.cpp index 82c3922542..387003dce1 100644 --- a/src/share/ratelimit/ob_rl_mgr.cpp +++ b/src/share/ratelimit/ob_rl_mgr.cpp @@ -13,6 +13,8 @@ #include "lib/mysqlclient/ob_mysql_result.h" #include "share/ob_thread_mgr.h" #include "ob_rl_mgr.h" +#include "lib/ash/ob_active_session_guard.h" + namespace oceanbase { namespace share { @@ -701,7 +703,10 @@ void ObRatelimitMgr::do_work() } } bool ready = false; - ready = swc_.wait(stat_period_); + { + common::ObBKGDSessInActiveGuard inactive_guard; + ready = swc_.wait(stat_period_); + } OB_LOG(INFO, "swc wakeup.", K(stat_period_), K(ready)); } diff --git a/src/share/rc/ob_tenant_base.cpp b/src/share/rc/ob_tenant_base.cpp index 00b5e290c9..c778ac0a0a 100644 --- a/src/share/rc/ob_tenant_base.cpp +++ b/src/share/rc/ob_tenant_base.cpp @@ -29,7 +29,6 @@ bool mtl_is_mini_mode() } } - namespace common { uint64_t mtl_get_id() @@ -38,6 +37,44 @@ uint64_t mtl_get_id() } } +namespace common +{ + +void __attribute__((used)) lib_release_tenant(void *ptr) +{ + share::ObTenantSwitchGuard *g = reinterpret_cast(ptr); + g->share::ObTenantSwitchGuard::~ObTenantSwitchGuard(); + ob_free(ptr); +} + +int64_t __attribute__((used)) get_mtl_id() +{ + return MTL_ID(); +} + +ObDiagnosticInfoContainer *__attribute__((used)) get_di_container() +{ + return MTL(ObDiagnosticInfoContainer *); +} + +void __attribute__((used)) lib_mtl_switch(int64_t tenant_id, std::function fn) +{ + int ret = OB_SUCCESS; + MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); + if (tenant_id != MTL_ID()) { + if (OB_FAIL(guard.switch_to(tenant_id))) { + LOG_WARN("failed to switch to tenant", K(ret), K(tenant_id)); + } + } + fn(ret); +} + +int64_t __attribute__((used)) lib_mtl_cpu_count() +{ + return share::ObTenantEnv::get_tenant()->unit_max_cpu(); +} + +} namespace share { using namespace oceanbase::common; @@ -133,7 +170,7 @@ int ObTenantBase::init(ObCgroupCtrl *cgroup) int ObTenantBase::create_mtl_module() { int ret = OB_SUCCESS; - + lib::ObDisableDiagnoseGuard disable_guard; if (created_) { ret = OB_INIT_TWICE; LOG_WARN("create twice error", K(ret)); diff --git a/src/share/rc/ob_tenant_base.h b/src/share/rc/ob_tenant_base.h index b8207057cb..f60ca83566 100755 --- a/src/share/rc/ob_tenant_base.h +++ b/src/share/rc/ob_tenant_base.h @@ -28,11 +28,13 @@ #include "lib/mysqlclient/ob_dblink_error_trans.h" #endif #include "lib/mysqlclient/ob_tenant_oci_envs.h" +#include "observer/mysql/ob_query_response_time.h" namespace oceanbase { namespace common { class ObLDHandle; class ObTenantIOManager; + class ObDiagnosticInfoContainer; template class ObServerObjectPool; class ObDetectManager; class ObOptStatMonitorManager; @@ -212,6 +214,7 @@ namespace observer class ObTableLoadResourceService; class ObStartupAccelTaskHandler; class ObTabletTableUpdater; + class ObTenantQueryRespTimeCollector; class ObTableQueryASyncMgr; } @@ -244,6 +247,7 @@ class ObSharedMemAllocMgr; class ObIndexUsageInfoMgr; class ObStorageIOUsageRepoter; class ObResourceLimitCalculator; +class ObWorkloadRepositoryContext; class ObPluginVectorIndexService; class ObAutoSplitTaskCache; namespace schema @@ -296,6 +300,7 @@ using ObPartTransCtxObjPool = common::ObServerObjectPool; #define MTL_MEMBERS \ MTL_LIST( \ + common::ObDiagnosticInfoContainer*, \ ObTimerService*, \ blocksstable::ObDecodeResourcePool*, \ omt::ObSharedTimer*, \ @@ -432,6 +437,8 @@ using ObTableScanIteratorObjPool = common::ObServerObjectPool 0) { - ob_usleep((int32_t)sleep_ts); + ob_usleep((int32_t)sleep_ts, true/*is_idle_sleep*/); } else { + common::ObBKGDSessInActiveGuard inactive_guard; cond_.wait(sleep_ts); } } diff --git a/src/share/scheduler/ob_tenant_dag_scheduler.cpp b/src/share/scheduler/ob_tenant_dag_scheduler.cpp index 6c5cd318d7..067bbbce09 100644 --- a/src/share/scheduler/ob_tenant_dag_scheduler.cpp +++ b/src/share/scheduler/ob_tenant_dag_scheduler.cpp @@ -1812,6 +1812,7 @@ void ObTenantDagWorker::run1() } else { ObThreadCondGuard guard(cond_); while (NULL == task_ && DWS_FREE == status_ && !has_set_stop()) { + ObBKGDSessInActiveGuard inactive_guard; cond_.wait(SLEEP_TIME_MS); } } @@ -1839,6 +1840,7 @@ int ObTenantDagWorker::yield() } else if (DWS_RUNNING == status_ && MTL(ObTenantDagScheduler*)->try_switch(*this)) { status_ = DWS_WAITING; while (DWS_WAITING == status_) { + ObBKGDSessInActiveGuard guard; cond_.wait(SLEEP_TIME_MS); } ObCurTraceId::set(task_->get_dag()->get_dag_id()); @@ -4616,6 +4618,7 @@ void ObTenantDagScheduler::run1() ObThreadCondGuard guard(scheduler_sync_); if (OB_SUCC(guard.get_ret())) { try_reclaim_threads(); + ObBKGDSessInActiveGuard inactive_guard; scheduler_sync_.wait(SCHEDULER_WAIT_TIME_MS); } } else { diff --git a/src/share/schema/ob_ddl_trans_controller.cpp b/src/share/schema/ob_ddl_trans_controller.cpp index 231c62a0ed..c23af48a09 100644 --- a/src/share/schema/ob_ddl_trans_controller.cpp +++ b/src/share/schema/ob_ddl_trans_controller.cpp @@ -121,6 +121,7 @@ void ObDDLTransController::run1() } } if (tenant_ids.empty()) { + common::ObBKGDSessInActiveGuard inactive_guard; wait_cond_.timedwait(100 * 1000); } } diff --git a/src/share/schema/ob_multi_version_schema_service.cpp b/src/share/schema/ob_multi_version_schema_service.cpp index b410b00f87..a413509981 100644 --- a/src/share/schema/ob_multi_version_schema_service.cpp +++ b/src/share/schema/ob_multi_version_schema_service.cpp @@ -2291,6 +2291,7 @@ int ObMultiVersionSchemaService::async_refresh_schema( const uint64_t tenant_id, const int64_t schema_version) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::WAIT_REFRESH_SCHEMA); int ret = OB_SUCCESS; int64_t local_schema_version = OB_INVALID_VERSION; bool check_formal = ObSchemaService::is_formal_version(schema_version); @@ -2362,7 +2363,7 @@ int ObMultiVersionSchemaService::async_refresh_schema( sleep_time = timeout_remain > 0 ? timeout_remain : 0; } retry_cnt++; - ob_usleep(static_cast(sleep_time)); + ob_usleep(RETRY_IDLE_TIME, RETRY_IDLE_TIME, schema_version, 0); } } } diff --git a/src/share/stat/ob_opt_system_stat_cache.cpp b/src/share/stat/ob_opt_system_stat_cache.cpp index e111caeab7..6a083c5f6c 100644 --- a/src/share/stat/ob_opt_system_stat_cache.cpp +++ b/src/share/stat/ob_opt_system_stat_cache.cpp @@ -12,6 +12,7 @@ #include "share/stat/ob_opt_system_stat_cache.h" #include "lib/stat/ob_diagnose_info.h" +#include "lib/stat/ob_diagnostic_info_guard.h" namespace oceanbase { namespace common { diff --git a/src/share/tablet/ob_tablet_to_ls_operator.cpp b/src/share/tablet/ob_tablet_to_ls_operator.cpp index aa6ad921ea..91fe37fc98 100644 --- a/src/share/tablet/ob_tablet_to_ls_operator.cpp +++ b/src/share/tablet/ob_tablet_to_ls_operator.cpp @@ -655,6 +655,7 @@ int ObTabletToLSTableOperator::batch_get_tablet_ls_cache( const common::ObIArray &tablet_ids, common::ObIArray &tablet_ls_caches) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::GET_TABLET_LOCATION); int ret = OB_SUCCESS; BATCH_GET(sql_proxy, tenant_id, tablet_ids, tablet_ls_caches); return ret; diff --git a/src/share/wr/ob_wr_collector.cpp b/src/share/wr/ob_wr_collector.cpp index 721fd41e2b..7ac6725bbc 100644 --- a/src/share/wr/ob_wr_collector.cpp +++ b/src/share/wr/ob_wr_collector.cpp @@ -19,22 +19,32 @@ #include "share/ob_define.h" #include "share/ob_dml_sql_splicer.h" #include "lib/utility/ob_tracepoint.h" +#include "sql/monitor/ob_sql_stat_record.h" +#include "share/rc/ob_tenant_base.h" +#include "sql/plan_cache/ob_plan_cache.h" using namespace oceanbase::common::sqlclient; +using namespace oceanbase::sql; namespace oceanbase { namespace share { -#define WR_INSERT_BATCH_SIZE 128 +#define WR_INSERT_BATCH_SIZE 5000 +#define WR_ASH_INSERT_BATCH_SIZE 1000 +#define WR_INSERT_SQL_STAT_BATCH_SIZE 16 +#define WR_SNAP_ID_SEQNENCE_NAME "OB_WORKLOAD_REPOSITORY_SNAP_ID_SEQNENCE" + +#define WR_SQL_PLAN_BATCH_SIZE 20 ObWrCollector::ObWrCollector(int64_t snap_id, int64_t snapshot_begin_time, int64_t snapshot_end_time, int64_t snapshot_timeout_ts) : snap_id_(snap_id), snapshot_begin_time_(snapshot_begin_time), snapshot_end_time_(snapshot_end_time), - timeout_ts_(snapshot_timeout_ts) + timeout_ts_(snapshot_timeout_ts), + snapshot_ahead_(false) { if (OB_UNLIKELY(snapshot_begin_time_ == snapshot_end_time_)) { snapshot_begin_time_ = 0; @@ -43,16 +53,76 @@ ObWrCollector::ObWrCollector(int64_t snap_id, int64_t snapshot_begin_time, ERRSIM_POINT_DEF(ERRSIM_WR_SNAPSHOT_COLLECTOR_FAILURE); +int ObWrCollector::init() +{ + // read from __wr_snapshot to get the newest snapshot_begin_time + ObSqlString sql; + int ret = OB_SUCCESS; + int64_t begin_interval_time = 0; + const uint64_t tenant_id = MTL_ID(); + if (snap_id_ == LAST_SNAPSHOT_RECORD_SNAP_ID) { + snapshot_ahead_ = true; + } + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ time_to_usec(END_INTERVAL_TIME) FROM %s where " + "snap_id=%ld and tenant_id=%ld", + OB_WR_SNAPSHOT_TNAME, LAST_SNAPSHOT_RECORD_SNAP_ID, tenant_id))) { + LOG_WARN("failed to format sql", KR(ret)); + } else if (OB_FAIL( + ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(sql)); + } else if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + // no record in __wr_snapshot table. this is the first time we take snapshot in this + // cluster or user delete this record. + ret = OB_SUCCESS; + LOG_WARN("first time to take wr snapshot in this cluster", K(tenant_id), K(begin_interval_time)); + get_begin_interval_time(begin_interval_time); + } + } else if (OB_FAIL(result->get_int(0L, begin_interval_time))) { + LOG_WARN("get column fail", KR(ret), K(sql)); + } + snapshot_begin_time_ = begin_interval_time; + } + // read from OB_WR_SNAPSHOT_TNAME to get snap id for ahead records + if (OB_SUCC(ret) && snap_id_ == LAST_SNAPSHOT_RECORD_SNAP_ID) { + ret = get_cur_snapshot_id_for_ahead_snapshot(snap_id_); + } + return ret; +} + int ObWrCollector::collect() { int ret = OB_SUCCESS; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::WR_TAKE_SNAPSHOT); if (OB_FAIL(collect_sysstat())) { LOG_WARN("failed to collect sysstat", KR(ret)); + } else if (OB_FAIL(collect_system_event())) { + LOG_WARN("failed to collect system event", KR(ret)); } else if (OB_FAIL(collect_ash())) { LOG_WARN("failed to collect ash", KR(ret)); } else if (OB_FAIL(collect_statname())) { LOG_WARN("failed to collect statname", KR(ret)); + } else if (OB_FAIL(collect_eventname())) { + LOG_WARN("failed to collect wait event name", KR(ret)); + } else if (OB_FAIL(collect_sqlstat())) { + LOG_WARN("failed to collect sqlstat", KR(ret)); + } else if (OB_FAIL(update_sqlstat())) { + LOG_WARN("failed to update sqlstat", KR(ret)); + } else if (OB_FAIL(collect_sqltext())) { + LOG_WARN("failed to collect sql text", KR(ret)); + } else if (OB_FAIL(collect_sql_plan())) { + LOG_WARN("failed to collect sql plan", KR(ret)); } + if (OB_SUCC(ret) && OB_UNLIKELY(ERRSIM_WR_SNAPSHOT_COLLECTOR_FAILURE)) { ret = ERRSIM_WR_SNAPSHOT_COLLECTOR_FAILURE; LOG_WARN("errsim for wr snapshot collector", KR(ret), KPC(this)); @@ -81,7 +151,7 @@ int ObWrCollector::collect_sysstat() "__all_virtual_sysstat where tenant_id=%ld", query_timeout, tenant_id))) { LOG_WARN("failed to assign sysstat query string", KR(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { LOG_WARN("failed to fetch sysstat", KR(ret), K(tenant_id), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -148,141 +218,339 @@ int ObWrCollector::collect_ash() int64_t tmp_real_str_len = 0; int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); int64_t collected_ash_row_count = 0; - SMART_VAR(ObISQLClient::ReadResult, res) - { - ObMySQLResult *result = nullptr; - if (OB_UNLIKELY(query_timeout <= 0)) { - ret = OB_TIMEOUT; - LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); - } else if (OB_FAIL(sql.assign_fmt( - "select /*+ WORKLOAD_REPOSITORY_SNAPSHOT QUERY_TIMEOUT(%ld) */ svr_ip, svr_port, sample_id, session_id, " - "time_to_usec(sample_time) as sample_time, " - "user_id, session_type, sql_id, trace_id, event_no, time_waited, " - "p1, p2, p3, sql_plan_line_id, time_model, module, action, " - "client_id, backtrace, plan_id from " - "__all_virtual_ash where tenant_id=%ld and is_wr_sample=true and " - "sample_time between usec_to_time(%ld) and usec_to_time(%ld)", - query_timeout, tenant_id, snapshot_begin_time_, snapshot_end_time_))) { - LOG_WARN("failed to assign ash query string", KR(ret)); - } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql.ptr()))) { - LOG_WARN("failed to fetch ash", KR(ret), K(tenant_id), K(sql)); - } else if (OB_ISNULL(result = res.get_result())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); - } else { - while (OB_SUCC(ret)) { - if (OB_FAIL(result->next())) { - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - break; - } else { - LOG_WARN("fail to get next row", KR(ret)); - } + uint64_t data_version = 0; + ObSEArray part_locations; + char svr_ip[common::OB_IP_STR_BUFF]; + int32_t svr_port; + bool is_cache_hit = false; + + if (snapshot_begin_time_ > snapshot_end_time_) { + LOG_WARN("outdated snapshot", K(snap_id_), K(snapshot_begin_time_), K(snapshot_end_time_), K(timeout_ts_)); + } else if (OB_FAIL(GCTX.location_service_->vtable_get( + MTL_ID(), + OB_ALL_VIRTUAL_ASH_TID, + 0,/*expire_renew_time*/ + is_cache_hit, + part_locations))) { + LOG_WARN("fail to get virtual table location", KR(ret), K(OB_ALL_VIRTUAL_ASH_TID)); + } else { + SMART_VAR(ObISQLClient::ReadResult, res) + { + // iterate every partition + for (int64_t i = 0; OB_SUCC(ret) && i < part_locations.count(); i++) { + ObMySQLResult *result = nullptr; + res.reuse(); + sql.reuse(); + part_locations[i].ip_to_string(svr_ip, sizeof(svr_ip)); + svr_port = part_locations[i].get_port(); + const char *ASH_VIEW_SQL = "select /*+ WORKLOAD_REPOSITORY_SNAPSHOT QUERY_TIMEOUT(%ld) */ svr_ip, svr_port, sample_id, session_id, " + "time_to_usec(sample_time) as sample_time, " + "user_id, session_type, sql_id, trace_id, event_no, time_waited, " + "p1, p2, p3, sql_plan_line_id, time_model, module, action, " + "client_id, backtrace, plan_id, program, tm_delta_time, tm_delta_cpu_time, tm_delta_db_time from " + "__all_virtual_ash where tenant_id=%ld and is_wr_sample=true and " + "sample_time between usec_to_time(%ld) and usec_to_time(%ld) and " + "svr_ip='%s' and svr_port=%d"; + const char *ASH_VIEW_SQL_422 = + "select /*+ WORKLOAD_REPOSITORY_SNAPSHOT QUERY_TIMEOUT(%ld) */ svr_ip, svr_port, " + "sample_id, session_id, " + "time_to_usec(sample_time) as sample_time, " + "user_id, session_type, sql_id, top_level_sql_id, trace_id, event_no, event_id, " + "time_waited, " + "p1, p2, p3, sql_plan_line_id, plan_hash, thread_id, stmt_type, group_id, time_model, " + "module, action, " + "client_id, backtrace, plan_id, program, tm_delta_time, tm_delta_cpu_time, " + "tm_delta_db_time, " + "plsql_entry_object_id, plsql_entry_subprogram_id, plsql_entry_subprogram_name, " + "plsql_object_id, " + "plsql_subprogram_id, plsql_subprogram_name, tablet_id, blocking_session_id, proxy_sid from " + "__all_virtual_ash where tenant_id=%ld and is_wr_sample=true and " + "sample_time between usec_to_time(%ld) and usec_to_time(%ld) and " + "svr_ip='%s' and svr_port=%d"; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { + LOG_WARN("get_min_data_version failed", K(ret), K(tenant_id)); + } else if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + data_version >= DATA_VERSION_4_2_2_0 ? ASH_VIEW_SQL_422 : ASH_VIEW_SQL, + query_timeout, tenant_id, snapshot_begin_time_, snapshot_end_time_, + svr_ip, svr_port))) { + LOG_WARN("failed to assign ash query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { + LOG_WARN("failed to fetch ash", KR(ret), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); } else { - ObWrAsh ash; - EXTRACT_STRBUF_FIELD_MYSQL( - *result, "svr_ip", ash.svr_ip_, sizeof(ash.svr_ip_), tmp_real_str_len); - EXTRACT_INT_FIELD_MYSQL(*result, "svr_port", ash.svr_port_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "sample_id", ash.sample_id_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "session_id", ash.session_id_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "sample_time", ash.sample_time_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "user_id", ash.user_id_, int64_t); - EXTRACT_BOOL_FIELD_MYSQL(*result, "session_type", ash.session_type_); - EXTRACT_STRBUF_FIELD_MYSQL( - *result, "sql_id", ash.sql_id_, sizeof(ash.sql_id_), tmp_real_str_len); - EXTRACT_STRBUF_FIELD_MYSQL( - *result, "trace_id", ash.trace_id_, sizeof(ash.trace_id_), tmp_real_str_len); - EXTRACT_INT_FIELD_MYSQL(*result, "event_no", ash.event_no_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "time_waited", ash.time_waited_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "p1", ash.p1_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "p2", ash.p2_, int64_t); - EXTRACT_INT_FIELD_MYSQL(*result, "p3", ash.p3_, int64_t); - EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "sql_plan_line_id", ash.sql_plan_line_id_, int64_t, true, false, -1); - EXTRACT_UINT_FIELD_MYSQL(*result, "time_model", ash.time_model_, uint64_t); - // ash not implement this for now. - // EXTRACT_STRBUF_FIELD_MYSQL(*result, "module", ash.module_, sizeof(ash.module_), - // tmp_real_str_len); - // EXTRACT_STRBUF_FIELD_MYSQL(*result, "action", ash.action_, - // sizeof(ash.action_), tmp_real_str_len); - // EXTRACT_STRBUF_FIELD_MYSQL(*result, - // "client_id", ash.client_id_, sizeof(ash.client_id_), tmp_real_str_len); - EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( - *result, "backtrace", ash.backtrace_, sizeof(ash.backtrace_), tmp_real_str_len); - EXTRACT_INT_FIELD_MYSQL(*result, "plan_id", ash.plan_id_, int64_t); - if (OB_SUCC(ret)) { - if (OB_FAIL(dml_splicer.add_pk_column(K(tenant_id)))) { - LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); - } else if (OB_FAIL(dml_splicer.add_pk_column(K(cluster_id)))) { - LOG_WARN("failed to add column cluster_id", KR(ret), K(cluster_id)); - } else if (OB_FAIL(dml_splicer.add_pk_column("SNAP_ID", snap_id_))) { - LOG_WARN("failed to add column SNAP_ID", KR(ret), K(snap_id_)); - } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", ash.svr_ip_))) { - LOG_WARN("failed to add column svr_ip", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", ash.svr_port_))) { - LOG_WARN("failed to add column svr_port", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_pk_column("sample_id", ash.sample_id_))) { - LOG_WARN("failed to add column sample_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_pk_column("session_id", ash.session_id_))) { - LOG_WARN("failed to add column session_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_time_column("sample_time", ash.sample_time_))) { - LOG_WARN("failed to add column sample_time", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("user_id", ash.user_id_))) { - LOG_WARN("failed to add column user_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("session_type", ash.session_type_))) { - LOG_WARN("failed to add column session_type", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("sql_id", ash.sql_id_))) { - LOG_WARN("failed to add column sql_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("trace_id", ash.trace_id_))) { - LOG_WARN("failed to add column trace_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("event_no", ash.event_no_))) { - LOG_WARN("failed to add column event_no", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("time_waited", ash.time_waited_))) { - LOG_WARN("failed to add column time_waited", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("p1", ash.p1_))) { - LOG_WARN("failed to add column p1", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("p2", ash.p2_))) { - LOG_WARN("failed to add column p2", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("p3", ash.p3_))) { - LOG_WARN("failed to add column p3", KR(ret), K(ash)); - } else if (ash.sql_plan_line_id_ < 0 && - OB_FAIL(dml_splicer.add_column(true, "sql_plan_line_id"))) { - LOG_WARN("failed to add column sql_plan_line_id", KR(ret), K(ash)); - } else if (ash.sql_plan_line_id_ >= 0 && - OB_FAIL(dml_splicer.add_column("sql_plan_line_id", ash.sql_plan_line_id_))) { - LOG_WARN("failed to add column sql_plan_line_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("time_model", ash.time_model_))) { - LOG_WARN("failed to add column time_model", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column(true, "module"))) { - LOG_WARN("failed to add column module", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column(true, "action"))) { - LOG_WARN("failed to add column action", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column(true, "client_id"))) { - LOG_WARN("failed to add column client_id", KR(ret), K(ash)); - } else if (ash.backtrace_[0] == '\0' && - OB_FAIL(dml_splicer.add_column(true, "backtrace"))) { - LOG_WARN("failed to add column backtrace", KR(ret), K(ash)); - } else if (ash.backtrace_[0] != '\0' && - OB_FAIL(dml_splicer.add_column("backtrace", ash.backtrace_))) { - LOG_WARN("failed to add column backtrace", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.add_column("plan_id", ash.plan_id_))) { - LOG_WARN("failed to add column plan_id", KR(ret), K(ash)); - } else if (OB_FAIL(dml_splicer.finish_row())) { - LOG_WARN("failed to finish row", KR(ret)); + const bool skip_null_error = true; + const bool skip_column_error = false; + const int64_t default_value = -1; + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + ObWrAsh ash; + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "svr_ip", ash.svr_ip_, sizeof(ash.svr_ip_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "svr_port", ash.svr_port_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "sample_id", ash.sample_id_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "session_id", ash.session_id_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "sample_time", ash.sample_time_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "user_id", ash.user_id_, int64_t); + EXTRACT_BOOL_FIELD_MYSQL(*result, "session_type", ash.session_type_); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "sql_id", ash.sql_id_, sizeof(ash.sql_id_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "trace_id", ash.trace_id_, sizeof(ash.trace_id_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "event_no", ash.event_no_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "event_id", ash.event_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "time_waited", ash.time_waited_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "p1", ash.p1_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "p2", ash.p2_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "p3", ash.p3_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "sql_plan_line_id", ash.sql_plan_line_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "group_id", ash.group_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_UINT_FIELD_MYSQL(*result, "time_model", ash.time_model_, uint64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "program", ash.program_, sizeof(ash.program_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "tm_delta_time", ash.tm_delta_time_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "tm_delta_cpu_time", ash.tm_delta_cpu_time_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "tm_delta_db_time", ash.tm_delta_db_time_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "module", ash.module_, sizeof(ash.module_), tmp_real_str_len); + // ash not implement this for now. + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "action", ash.action_, sizeof(ash.action_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "client_id", ash.client_id_, sizeof(ash.client_id_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "backtrace", ash.backtrace_, sizeof(ash.backtrace_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "plan_id", ash.plan_id_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "top_level_sql_id", ash.top_level_sql_id_, sizeof(ash.top_level_sql_id_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plsql_entry_object_id", ash.plsql_entry_object_id_, + int64_t, skip_null_error, skip_column_error, OB_INVALID_ID); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plsql_entry_subprogram_id", ash.plsql_entry_subprogram_id_, + int64_t, skip_null_error, skip_column_error, OB_INVALID_ID); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "plsql_entry_subprogram_name", ash.plsql_entry_subprogram_name_, sizeof(ash.plsql_entry_subprogram_name_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plsql_object_id", ash.plsql_object_id_, + int64_t, skip_null_error, skip_column_error, OB_INVALID_ID); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plsql_subprogram_id", ash.plsql_subprogram_id_, + int64_t, skip_null_error, skip_column_error, OB_INVALID_ID); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( + *result, "plsql_subprogram_name", ash.plsql_subprogram_name_, sizeof(ash.plsql_subprogram_name_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "thread_id", ash.thread_id_, int64_t, + skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "stmt_type", ash.stmt_type_, int64_t, + skip_null_error, skip_column_error, default_value); + EXTRACT_UINT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plan_hash", ash.plan_hash_, + uint64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "tablet_id", ash.tablet_id_, int64_t, + skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "blocking_session_id", ash.blocking_session_id_, int64_t, + skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "proxy_sid", ash.proxy_sid_, int64_t, + skip_null_error, skip_column_error, default_value); + + char plan_hash_char[64] = ""; + if (OB_SUCC(ret)) { + sprintf(plan_hash_char, "%lu", ash.plan_hash_); + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(dml_splicer.add_pk_column(K(tenant_id)))) { + LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column(K(cluster_id)))) { + LOG_WARN("failed to add column cluster_id", KR(ret), K(cluster_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column("SNAP_ID", snap_id_))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(snap_id_)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", ash.svr_ip_))) { + LOG_WARN("failed to add column svr_ip", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", ash.svr_port_))) { + LOG_WARN("failed to add column svr_port", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_pk_column("sample_id", ash.sample_id_))) { + LOG_WARN("failed to add column sample_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_pk_column("session_id", ash.session_id_))) { + LOG_WARN("failed to add column session_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_time_column("sample_time", ash.sample_time_))) { + LOG_WARN("failed to add column sample_time", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("user_id", ash.user_id_))) { + LOG_WARN("failed to add column user_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("session_type", ash.session_type_))) { + LOG_WARN("failed to add column session_type", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("sql_id", ash.sql_id_))) { + LOG_WARN("failed to add column sql_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("trace_id", ash.trace_id_))) { + LOG_WARN("failed to add column trace_id", KR(ret), K(ash)); + } else if (ash.event_no_ < 0 && OB_FAIL(dml_splicer.add_column(true, "event_no"))) { + LOG_WARN("failed to add column event_no", KR(ret), K(ash)); + } else if (ash.event_no_ >= 0 && OB_FAIL(dml_splicer.add_column("event_no", ash.event_no_))) { + LOG_WARN("failed to add column event_no", KR(ret), K(ash)); + } else if (ash.event_no_ < 0 && OB_FAIL(dml_splicer.add_column(true, "event_id"))) { + LOG_WARN("failed to add column event_id", KR(ret), K(ash)); + } else if (ash.event_no_ >= 0 && OB_FAIL(dml_splicer.add_column("event_id", ash.event_id_))) { + LOG_WARN("failed to add column event_id", KR(ret), K(ash)); + } else if (ash.time_waited_ < 0 && OB_FAIL(dml_splicer.add_column(true, "time_waited"))) { + LOG_WARN("failed to add column time_waited", KR(ret), K(ash)); + } else if (ash.time_waited_ >= 0 && OB_FAIL(dml_splicer.add_column("time_waited", ash.time_waited_))) { + LOG_WARN("failed to add column time_waited", KR(ret), K(ash)); + } else if (ash.p1_ < 0 && OB_FAIL(dml_splicer.add_column(true, "p1"))) { + LOG_WARN("failed to add column p1", KR(ret), K(ash)); + } else if (ash.p1_ >= 0 && OB_FAIL(dml_splicer.add_column("p1", ash.p1_))) { + LOG_WARN("failed to add column p1", KR(ret), K(ash)); + } else if (ash.p2_ < 0 && OB_FAIL(dml_splicer.add_column(true, "p2"))) { + LOG_WARN("failed to add column p2", KR(ret), K(ash)); + } else if (ash.p2_ >= 0 && OB_FAIL(dml_splicer.add_column("p2", ash.p2_))) { + LOG_WARN("failed to add column p2", KR(ret), K(ash)); + } else if (ash.p3_ < 0 && OB_FAIL(dml_splicer.add_column(true, "p3"))) { + LOG_WARN("failed to add column p3", KR(ret), K(ash)); + } else if (ash.p3_ >= 0 && OB_FAIL(dml_splicer.add_column("p3", ash.p3_))) { + LOG_WARN("failed to add column p3", KR(ret), K(ash)); + } else if (ash.sql_plan_line_id_ < 0 && + OB_FAIL(dml_splicer.add_column(true, "sql_plan_line_id"))) { + LOG_WARN("failed to add column sql_plan_line_id", KR(ret), K(ash)); + } else if (ash.sql_plan_line_id_ >= 0 && + OB_FAIL(dml_splicer.add_column("sql_plan_line_id", ash.sql_plan_line_id_))) { + LOG_WARN("failed to add column sql_plan_line_id", KR(ret), K(ash)); + } else if (ash.group_id_ < 0 && OB_FAIL(dml_splicer.add_column(true, "group_id"))) { + LOG_WARN("failed to add column group_id", KR(ret), K(ash)); + } else if (ash.group_id_ >= 0 && OB_FAIL(dml_splicer.add_column("group_id", ash.group_id_))) { + LOG_WARN("failed to add column group_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("time_model", ash.time_model_))) { + LOG_WARN("failed to add column time_model", KR(ret), K(ash)); + } else if (ash.module_[0] == '\0' && OB_FAIL(dml_splicer.add_column(true, "module"))) { + LOG_WARN("failed to add column module", KR(ret), K(ash)); + } else if (ash.module_[0] != '\0' && OB_FAIL(dml_splicer.add_column("module", ash.module_))) { + LOG_WARN("failed to add column module", KR(ret), K(ash)); + } else if (ash.action_[0] == '\0' && OB_FAIL(dml_splicer.add_column(true, "action"))) { + LOG_WARN("failed to add column action", KR(ret), K(ash)); + } else if (ash.action_[0] != '\0' && OB_FAIL(dml_splicer.add_column("action", ash.action_))) { + LOG_WARN("failed to add column action", KR(ret), K(ash)); + } else if (ash.client_id_[0] == '\0' && OB_FAIL(dml_splicer.add_column(true, "client_id"))) { + LOG_WARN("failed to add column client_id", KR(ret), K(ash)); + } else if (ash.client_id_[0] != '\0' && OB_FAIL(dml_splicer.add_column("client_id", ash.client_id_))) { + LOG_WARN("failed to add column client_id", KR(ret), K(ash)); + } else if (ash.backtrace_[0] == '\0' && + OB_FAIL(dml_splicer.add_column(true, "backtrace"))) { + LOG_WARN("failed to add column backtrace", KR(ret), K(ash)); + } else if (ash.backtrace_[0] != '\0' && + OB_FAIL(dml_splicer.add_column("backtrace", ash.backtrace_))) { + LOG_WARN("failed to add column backtrace", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("plan_id", ash.plan_id_))) { + LOG_WARN("failed to add column plan_id", KR(ret), K(ash)); + } else if (ash.program_[0] == '\0' && + OB_FAIL(dml_splicer.add_column(true, "program"))) { + LOG_WARN("failed to add null column program", KR(ret), K(ash)); + } else if (ash.program_[0] != '\0' && + OB_FAIL(dml_splicer.add_column("program", ash.program_))) { + LOG_WARN("failed to add column program", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("tm_delta_time", ash.tm_delta_time_))) { + LOG_WARN("failed to add column tm_delta_time", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("tm_delta_cpu_time", ash.tm_delta_cpu_time_))) { + LOG_WARN("failed to add column tm_delta_cpu_time", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("tm_delta_db_time", ash.tm_delta_db_time_))) { + LOG_WARN("failed to add column tm_delta_db_time", KR(ret), K(ash)); + } else if (ash.top_level_sql_id_[0] == '\0' && + OB_FAIL(dml_splicer.add_column(true, "top_level_sql_id"))) { + LOG_WARN("failed to add column top_level_sql_id", KR(ret), K(ash)); + } else if (ash.top_level_sql_id_[0] != '\0' && + OB_FAIL(dml_splicer.add_column("top_level_sql_id", ash.top_level_sql_id_))) { + LOG_WARN("failed to add column sql_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID == ash.plsql_entry_object_id_ && + OB_FAIL(dml_splicer.add_column(true, "plsql_entry_object_id"))) { + LOG_WARN("failed to add column plsql_entry_object_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID != ash.plsql_entry_object_id_ && + OB_FAIL(dml_splicer.add_column("plsql_entry_object_id", ash.plsql_entry_object_id_))) { + LOG_WARN("failed to add column plsql_entry_object_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID == ash.plsql_entry_subprogram_id_ && + OB_FAIL(dml_splicer.add_column(true, "plsql_entry_subprogram_id"))) { + LOG_WARN("failed to add column plsql_entry_subprogram_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID != ash.plsql_entry_subprogram_id_ && + OB_FAIL(dml_splicer.add_column("plsql_entry_subprogram_id", ash.plsql_entry_subprogram_id_))) { + LOG_WARN("failed to add column plsql_entry_subprogram_id", KR(ret), K(ash)); + } else if (ash.plsql_entry_subprogram_name_[0] == '\0' && + OB_FAIL(dml_splicer.add_column(true, "plsql_entry_subprogram_name"))) { + LOG_WARN("failed to add column plsql_entry_subprogram_name", KR(ret), K(ash)); + } else if (OB_FAIL(ash.plsql_entry_subprogram_name_[0] != '\0' + && dml_splicer.add_column("plsql_entry_subprogram_name", ash.plsql_entry_subprogram_name_))) { + LOG_WARN("failed to add column plsql_entry_subprogram_name", KR(ret), K(ash)); + } else if (OB_INVALID_ID == ash.plsql_object_id_ && + OB_FAIL(dml_splicer.add_column(true, "plsql_object_id"))) { + LOG_WARN("failed to add column plsql_object_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID != ash.plsql_object_id_ && + OB_FAIL(dml_splicer.add_column("plsql_object_id", ash.plsql_object_id_))) { + LOG_WARN("failed to add column plsql_object_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID == ash.plsql_subprogram_id_ && + OB_FAIL(dml_splicer.add_column(true, "plsql_subprogram_id"))) { + LOG_WARN("failed to add column plsql_subprogram_id", KR(ret), K(ash)); + } else if (OB_INVALID_ID != ash.plsql_subprogram_id_ && + OB_FAIL(dml_splicer.add_column("plsql_subprogram_id", ash.plsql_subprogram_id_))) { + LOG_WARN("failed to add column plsql_subprogram_id", KR(ret), K(ash)); + } else if (OB_FAIL(ash.plsql_subprogram_name_[0] == '\0' + && dml_splicer.add_column(true, "plsql_subprogram_name"))) { + LOG_WARN("failed to add column plsql_subprogram_name", KR(ret), K(ash)); + } else if (ash.plsql_subprogram_name_[0] != '\0' && + OB_FAIL(dml_splicer.add_column("plsql_subprogram_name", ash.plsql_subprogram_name_))) { + LOG_WARN("failed to add column plsql_subprogram_name", KR(ret), K(ash)); + } else if (ash.plan_hash_ == static_cast(-1) && + OB_FAIL(dml_splicer.add_column(true, "plan_hash"))) { + LOG_WARN("failed to add column plan_hash", KR(ret), K(ash)); + } else if (ash.plan_hash_ != static_cast(-1) && + OB_FAIL(dml_splicer.add_column("plan_hash", plan_hash_char))) { + LOG_WARN("failed to add column plan_hash", KR(ret), K(ash)); + } else if (ash.thread_id_ < 0 && + OB_FAIL(dml_splicer.add_column(true, "thread_id"))) { + LOG_WARN("failed to add column thread_id", KR(ret), K(ash)); + } else if (ash.thread_id_ >= 0 && + OB_FAIL(dml_splicer.add_column("thread_id", ash.thread_id_))) { + LOG_WARN("failed to add column thread_id", KR(ret), K(ash)); + } else if (ash.stmt_type_ < 0 && + OB_FAIL(dml_splicer.add_column(true, "stmt_type"))) { + LOG_WARN("failed to add column stmt_type", KR(ret), K(ash)); + } else if (ash.stmt_type_ >= 0 && + OB_FAIL(dml_splicer.add_column("stmt_type", ash.stmt_type_))) { + LOG_WARN("failed to add column stmt_type", KR(ret), K(ash)); + } else if (ash.tablet_id_ < 0 && + OB_FAIL(dml_splicer.add_column(true, "tablet_id"))) { + LOG_WARN("failed to add column tablet_id", KR(ret), K(ash)); + } else if (ash.tablet_id_ >= 0 && + OB_FAIL(dml_splicer.add_column("tablet_id", ash.tablet_id_))) { + LOG_WARN("failed to add column tablet_id", KR(ret), K(ash)); + } else if (ash.blocking_session_id_ < 0 && + OB_FAIL(dml_splicer.add_column(true, "blocking_session_id"))) { + LOG_WARN("failed to add column blocking_session_id", KR(ret), K(ash)); + } else if (ash.blocking_session_id_ >= 0 && + OB_FAIL(dml_splicer.add_column("blocking_session_id", ash.blocking_session_id_))) { + LOG_WARN("failed to add column blocking_session_id", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.add_column("proxy_sid", ash.proxy_sid_))) { + LOG_WARN("failed to add column proxy_sid", KR(ret), K(ash)); + } else if (OB_FAIL(dml_splicer.finish_row())) { + LOG_WARN("failed to finish row", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() >= WR_ASH_INSERT_BATCH_SIZE) { + collected_ash_row_count += dml_splicer.get_row_count(); + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_ACTIVE_SESSION_HISTORY_TNAME, tenant_id))) { + LOG_WARN("failed to batch write to wr", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() > 0) { + collected_ash_row_count += dml_splicer.get_row_count(); + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_ACTIVE_SESSION_HISTORY_TNAME, tenant_id))) { + LOG_WARN("failed to batch write remaining part to wr", KR(ret)); } } } - if (OB_SUCC(ret) && dml_splicer.get_row_count() >= WR_INSERT_BATCH_SIZE) { - collected_ash_row_count += dml_splicer.get_row_count(); - if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_ACTIVE_SESSION_HISTORY_TNAME, tenant_id))) { - LOG_WARN("failed to batch write to wr", KR(ret)); - } - } } - if (OB_SUCC(ret) && dml_splicer.get_row_count() > 0) { - collected_ash_row_count += dml_splicer.get_row_count(); - if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_ACTIVE_SESSION_HISTORY_TNAME, tenant_id))) { - LOG_WARN("failed to batch write remaining part to wr", KR(ret)); - } + // record snapshot_end_time_ + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(update_last_snapshot_end_time())) { + LOG_WARN("failed to update last snapshot end time", K(tmp_ret)); } } } @@ -327,7 +595,7 @@ int ObWrCollector::collect_statname() if (expected_rows > 0) { int64_t affected_rows = 0; uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id); - if (OB_FAIL(GCTX.sql_proxy_->write(exec_tenant_id, sql.ptr(), affected_rows))) { + if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(exec_tenant_id, sql.ptr(), affected_rows))) { LOG_WARN("execute sql failed", KR(ret), K(tenant_id), K(exec_tenant_id), K(sql)); } else if (OB_UNLIKELY(affected_rows > 0)) { LOG_TRACE("the stat name has changed, there are new statname.", K(affected_rows)); @@ -342,17 +610,869 @@ int ObWrCollector::collect_statname() return ret; } + +int ObWrCollector::collect_eventname() +{ + int ret = OB_SUCCESS; + int64_t start = ObTimeUtility::current_time(); + + ObSqlString sql; + int64_t expected_rows = 0; + const uint64_t tenant_id = MTL_ID(); + int64_t cluster_id = ObServerConfig::get_instance().cluster_id; + + if (OB_FAIL(sql.assign_fmt("INSERT /*+ WORKLOAD_REPOSITORY */ IGNORE INTO %s " + "(TENANT_ID, CLUSTER_ID, EVENT_ID, EVENT_NAME, PARAMETER1, PARAMETER2, PARAMETER3, WAIT_CLASS_ID, WAIT_CLASS) VALUES", + OB_WR_EVENT_NAME_TNAME))) { + LOG_WARN("sql assign failed", K(ret)); + } + + for (int64_t i = 0; OB_SUCC(ret) && i < WAIT_EVENTS_TOTAL; ++i) { + const int64_t event_id = OB_WAIT_EVENTS[i].event_id_; + const int64_t wait_class_id = OB_WAIT_CLASSES[OB_WAIT_EVENTS[i].wait_class_].wait_class_id_; + const ObString event_name = ObString::make_string(OB_WAIT_EVENTS[i].event_name_); + const ObString parameter1 = ObString::make_string(OB_WAIT_EVENTS[i].param1_); + const ObString parameter2 = ObString::make_string(OB_WAIT_EVENTS[i].param2_); + const ObString parameter3 = ObString::make_string(OB_WAIT_EVENTS[i].param3_); + const ObString wait_class = + ObString::make_string(OB_WAIT_CLASSES[OB_WAIT_EVENTS[i].wait_class_].wait_class_); + expected_rows++; + if (OB_FAIL( + sql.append_fmt("%s('%lu', '%lu', '%ld', '%.*s', '%.*s', '%.*s', '%.*s', '%lu', '%.*s')", + (i == 0) ? " " : ", ", tenant_id, cluster_id, event_id, event_name.length(), + event_name.ptr(), parameter1.length(), parameter1.ptr(), parameter2.length(), + parameter2.ptr(), parameter3.length(), parameter3.ptr(), wait_class_id, + wait_class.length(), wait_class.ptr()))) { + LOG_WARN("sql append failed", K(ret)); + } + } // end for + + if (OB_SUCC(ret)) { + if (expected_rows > 0) { + int64_t affected_rows = 0; + uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id); + if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(exec_tenant_id, sql.ptr(), affected_rows))) { + LOG_WARN("execute sql failed", KR(ret), K(tenant_id), K(exec_tenant_id), K(sql)); + } else if (OB_UNLIKELY(affected_rows > 0)) { + LOG_TRACE("the event name has changed, there are new event name.", K(affected_rows)); + } else if (OB_UNLIKELY(affected_rows < 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected affected_rows", KR(ret), K(expected_rows), K(affected_rows)); + } + } + } + LOG_TRACE( + "init __wr_event_name", K(ret), K(tenant_id), "cost", ObTimeUtility::current_time() - start); + return ret; +} + +int ObWrCollector::collect_system_event() +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + const uint64_t tenant_id = MTL_ID(); + int64_t cluster_id = ObServerConfig::get_instance().cluster_id; + ObDMLSqlSplicer dml_splicer; + ObSqlString sql; + int64_t tmp_real_str_len = 0; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + "SELECT /*+ WORKLOAD_REPOSITORY_SNAPSHOT QUERY_TIMEOUT(%ld) */ svr_ip, svr_port, event_id, total_waits, total_timeouts, time_waited_micro from " + "__all_virtual_system_event where tenant_id=%ld", + query_timeout, tenant_id))) { + LOG_WARN("failed to assign sysstat query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { + LOG_WARN("failed to fetch sysstat", KR(ret), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + ObWrSystemEvent sysevent; + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "svr_ip", sysevent.svr_ip_, OB_IP_STR_BUFF, tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "svr_port", sysevent.svr_port_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "event_id", sysevent.event_id_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "total_waits", sysevent.total_waits_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "total_timeouts", sysevent.total_timeouts_, int64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "time_waited_micro", sysevent.time_waited_micro_, int64_t); + if (OB_FAIL(ret)) { + } else if (OB_UNLIKELY(sysevent.total_waits_ <= 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("wr system event handle invalid rows", KR(ret), K(sysevent)); + } + if (OB_SUCC(ret)) { + if (OB_FAIL(dml_splicer.add_pk_column(K(tenant_id)))) { + LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column(K(cluster_id)))) { + LOG_WARN("failed to add column cluster_id", KR(ret), K(cluster_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column("SNAP_ID", snap_id_))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(snap_id_)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", sysevent.svr_ip_))) { + LOG_WARN("failed to add column svr_ip", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", sysevent.svr_port_))) { + LOG_WARN("failed to add column svr_port", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.add_pk_column("event_id", sysevent.event_id_))) { + LOG_WARN("failed to add column event_id", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.add_column("total_waits", sysevent.total_waits_))) { + LOG_WARN("failed to add column total_waits", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.add_column("total_timeouts", sysevent.total_timeouts_))) { + LOG_WARN("failed to add column total_timeouts", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.add_column("time_waited_micro", sysevent.time_waited_micro_))) { + LOG_WARN("failed to add column time_waited_micro", KR(ret), K(sysevent)); + } else if (OB_FAIL(dml_splicer.finish_row())) { + LOG_WARN("failed to finish row", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() >= WR_INSERT_BATCH_SIZE) { + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_SYSTEM_EVENT_TNAME, tenant_id))) { + LOG_WARN("failed to batch write to wr", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() > 0 && + OB_FAIL(write_to_wr(dml_splicer, OB_WR_SYSTEM_EVENT_TNAME, tenant_id))) { + LOG_WARN("failed to batch write remaining part to wr", KR(ret)); + } + } + } + return ret; +} + +int ObWrCollector::collect_sqlstat() +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + const uint64_t tenant_id = MTL_ID(); + int64_t cluster_id = ObServerConfig::get_instance().cluster_id; + ObDMLSqlSplicer dml_splicer; + ObSqlString sql; + int64_t tmp_real_str_len = 0; + int64_t collected_sqlstat_row_count = 0; + int64_t topnsql = -1; + { + // read wr control`s top N SQL + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + "select /*+ workload_repository_snapshot query_timeout(%ld) */ topnsql " + "from oceanbase.DBA_WR_CONTROL", query_timeout))) { + LOG_WARN("failed to assign ash query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, OB_SYS_TENANT_ID, sql.ptr()))) { + LOG_WARN("failed to fetch ash", KR(ret), K(OB_SYS_TENANT_ID), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(OB_SYS_TENANT_ID), K(sql)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + EXTRACT_INT_FIELD_MYSQL(*result, "topnsql", topnsql , int64_t); + } + } // end of while + } + } + } + + if (OB_SUCC(ret) && topnsql != -1) { + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + " select /*+ workload_repository_snapshot query_timeout(%ld) */ svr_ip,svr_port,tenant_id, " + " sql_id, plan_hash, plan_type, module, action, parsing_db_id, " + " parsing_db_name, parsing_user_id, cast(sum(executions_total) as SIGNED INTEGER ) as executions_total, " + " cast(sum(executions_delta) as SIGNED INTEGER ) as executions_delta, cast(sum(disk_reads_total) as SIGNED INTEGER ) as disk_reads_total, " + " cast(sum(disk_reads_delta) as SIGNED INTEGER ) as disk_reads_delta, cast(sum(buffer_gets_total) as SIGNED INTEGER ) as buffer_gets_total, " + " cast(sum(buffer_gets_delta) as SIGNED INTEGER ) as buffer_gets_delta, cast(sum(elapsed_time_total) as SIGNED INTEGER ) as elapsed_time_total, " + " cast(sum(elapsed_time_delta) as SIGNED INTEGER ) as elapsed_time_delta, cast(sum(cpu_time_total) as SIGNED INTEGER ) as cpu_time_total, " + " cast(sum(cpu_time_delta) as SIGNED INTEGER ) as cpu_time_delta, cast(sum(ccwait_total) as SIGNED INTEGER ) as ccwait_total, " + " cast(sum(ccwait_delta) as SIGNED INTEGER ) as ccwait_delta, " + " cast(sum(userio_wait_total) as SIGNED INTEGER ) as userio_wait_total, cast(sum(userio_wait_delta) as SIGNED INTEGER ) as userio_wait_delta, " + " cast(sum(apwait_total) as SIGNED INTEGER ) as apwait_total, cast(sum(apwait_delta) as SIGNED INTEGER ) as apwait_delta, " + " cast(sum(physical_read_requests_total) as SIGNED INTEGER ) as physical_read_requests_total, " + " cast(sum(physical_read_requests_delta) as SIGNED INTEGER ) as physical_read_requests_delta, cast(sum(physical_read_bytes_total) as SIGNED INTEGER ) as physical_read_bytes_total, " + " cast(sum(physical_read_bytes_delta) as SIGNED INTEGER ) as physical_read_bytes_delta, " + " cast(sum(write_throttle_total) as SIGNED INTEGER ) as write_throttle_total, cast(sum(write_throttle_delta) as SIGNED INTEGER ) as write_throttle_delta, " + " cast(sum(rows_processed_total) as SIGNED INTEGER ) as rows_processed_total, cast(sum(rows_processed_delta) as SIGNED INTEGER ) as rows_processed_delta, " + " cast(sum(memstore_read_rows_total) as SIGNED INTEGER ) as memstore_read_rows_total, cast(sum(memstore_read_rows_delta) as SIGNED INTEGER ) as memstore_read_rows_delta, " + " cast(sum(minor_ssstore_read_rows_total) as SIGNED INTEGER ) as minor_ssstore_read_rows_total, " + " cast(sum(minor_ssstore_read_rows_delta) as SIGNED INTEGER ) as minor_ssstore_read_rows_delta, " + " cast(sum(major_ssstore_read_rows_total) as SIGNED INTEGER ) as major_ssstore_read_rows_total, " + " cast(sum(major_ssstore_read_rows_delta) as SIGNED INTEGER ) as major_ssstore_read_rows_delta, " + " cast(sum(rpc_total) as SIGNED INTEGER ) as rpc_total, cast(sum(rpc_delta) as SIGNED INTEGER ) as rpc_delta, " + " cast(sum(fetches_total) as SIGNED INTEGER ) as fetches_total, cast(sum(fetches_delta) as SIGNED INTEGER ) as fetches_delta, " + " cast(sum(retry_total) as SIGNED INTEGER ) as retry_total, cast(sum(retry_delta) as SIGNED INTEGER ) as retry_delta, " + " cast(sum(partition_total) as SIGNED INTEGER ) as partition_total, " + " cast(sum(partition_delta) as SIGNED INTEGER ) as partition_delta, cast(sum(nested_sql_total) as SIGNED INTEGER ) as nested_sql_total, " + " cast(sum(nested_sql_delta) as SIGNED INTEGER ) as nested_sql_delta ,source_ip, source_port , cast(sum(route_miss_total) as SIGNED INTEGER ) as route_miss_total, " + " cast(sum(route_miss_delta) as SIGNED INTEGER ) as route_miss_delta , first_load_time, cast(sum(plan_cache_hit_total) as SIGNED INTEGER ) as plan_cache_hit_total, " + " cast(sum(plan_cache_hit_delta) as SIGNED INTEGER ) as plan_cache_hit_delta " + "from oceanbase.__all_virtual_sqlstat " + "where tenant_id = %ld and (sql_id,plan_hash) in ( " + "select sql_id, plan_hash " + "from " + " ( select sql_id ,plan_hash, " + " row_number() over( order by sum(elapsed_time_delta) desc ) elapsed_time_delta_rank, " + " row_number() over( order by sum(cpu_time_delta) desc) cpu_time_delta_rank, " + " row_number() over( order by sum(userio_wait_delta) desc) userio_wait_delta_rank, " + " row_number() over( order by sum(physical_read_requests_delta) desc) physical_read_requests_delta_rank, " + " row_number() over( order by sum(executions_delta) desc) executions_delta_rank " + " from oceanbase.__all_virtual_sqlstat where tenant_id = %ld group by sql_id, plan_hash " + " ) " + "where " + " elapsed_time_delta_rank <= %ld " + " or cpu_time_delta_rank <= %ld " + " or userio_wait_delta_rank <= %ld " + " or physical_read_requests_delta_rank <= %ld " + " or executions_delta_rank <= %ld ) " + "group by tenant_id, svr_ip, svr_port, sql_id, plan_hash, source_ip, source_port", + query_timeout, tenant_id, tenant_id, topnsql, topnsql, topnsql, topnsql, topnsql ))) { + LOG_WARN("failed to assign ash query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { + LOG_WARN("failed to fetch sql stat", KR(ret), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); + } else { + const bool null_error = false; + const bool skip_column_error = false; + const int64_t default_value = -1; + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + ObWrSqlStat sqlstat; + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "svr_ip", sqlstat.svr_ip_, sizeof(sqlstat.svr_ip_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "svr_port", sqlstat.svr_port_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "sql_id", sqlstat.sql_id_, sizeof(sqlstat.sql_id_), tmp_real_str_len); + EXTRACT_UINT_FIELD_MYSQL(*result, "plan_hash", sqlstat.plan_hash_, uint64_t); + EXTRACT_INT_FIELD_MYSQL(*result, "plan_type", sqlstat.plan_type_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "module", sqlstat.module_, sizeof(sqlstat.module_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "action", sqlstat.action_, sizeof(sqlstat.action_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "parsing_db_id", sqlstat.parsing_db_id_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "parsing_db_name", sqlstat.parsing_db_name_, sizeof(sqlstat.parsing_db_name_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "parsing_user_id", sqlstat.parsing_user_id_, int64_t, null_error, skip_column_error, default_value); + + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "executions_total", sqlstat.executions_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "executions_delta", sqlstat.executions_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "disk_reads_total", sqlstat.disk_reads_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "disk_reads_delta", sqlstat.disk_reads_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "buffer_gets_total", sqlstat.buffer_gets_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "buffer_gets_delta", sqlstat.buffer_gets_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "elapsed_time_total", sqlstat.elapsed_time_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "elapsed_time_delta", sqlstat.elapsed_time_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "cpu_time_total", sqlstat.cpu_time_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "cpu_time_delta", sqlstat.cpu_time_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "ccwait_total", sqlstat.ccwait_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "ccwait_delta", sqlstat.ccwait_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "userio_wait_total", sqlstat.userio_wait_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "userio_wait_delta", sqlstat.userio_wait_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "apwait_total", sqlstat.apwait_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "apwait_delta", sqlstat.apwait_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "physical_read_requests_total", sqlstat.physical_read_requests_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "physical_read_requests_delta", sqlstat.physical_read_requests_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "physical_read_bytes_total", sqlstat.physical_read_bytes_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "physical_read_bytes_delta", sqlstat.physical_read_bytes_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "write_throttle_total", sqlstat.write_throttle_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "write_throttle_delta", sqlstat.write_throttle_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "rows_processed_total", sqlstat.rows_processed_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "rows_processed_delta", sqlstat.rows_processed_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "memstore_read_rows_total", sqlstat.memstore_read_rows_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "memstore_read_rows_delta", sqlstat.memstore_read_rows_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "minor_ssstore_read_rows_total", sqlstat.minor_ssstore_read_rows_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "minor_ssstore_read_rows_delta", sqlstat.minor_ssstore_read_rows_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "major_ssstore_read_rows_total", sqlstat.major_ssstore_read_rows_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "major_ssstore_read_rows_delta", sqlstat.major_ssstore_read_rows_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "rpc_total", sqlstat.rpc_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "rpc_delta", sqlstat.rpc_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "fetches_total", sqlstat.fetches_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "fetches_delta", sqlstat.fetches_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "retry_total", sqlstat.retry_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "retry_delta", sqlstat.retry_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "partition_total", sqlstat.partition_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "partition_delta", sqlstat.partition_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "nested_sql_total", sqlstat.nested_sql_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "nested_sql_delta", sqlstat.nested_sql_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "source_ip", sqlstat.source_ip_, sizeof(sqlstat.source_ip_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "source_port", sqlstat.source_port_, int64_t, true/*skip_null_error*/, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "route_miss_total", sqlstat.route_miss_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "route_miss_delta", sqlstat.route_miss_delta_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plan_cache_hit_total", sqlstat.plan_cache_hit_total_, int64_t, null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plan_cache_hit_delta", sqlstat.plan_cache_hit_delta_, int64_t, null_error, skip_column_error, default_value); + + if (OB_SUCC(ret)) { + if (OB_FAIL(result->get_timestamp("first_load_time", nullptr, sqlstat.first_load_time_))) { + if (OB_ERR_NULL_VALUE == ret || OB_ERR_COLUMN_NOT_FOUND == ret) { + ret = OB_SUCCESS; + sqlstat.first_load_time_ = default_value; + } else { + LOG_WARN("failed to get timestamp", K(ret)); + } + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(dml_splicer.add_pk_column(K(tenant_id)))) { + LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column(K(cluster_id)))) { + LOG_WARN("failed to add column cluster_id", KR(ret), K(cluster_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column("SNAP_ID", snap_id_))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(snap_id_)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", sqlstat.svr_ip_))) { + LOG_WARN("failed to add column svr_ip", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", sqlstat.svr_port_))) { + LOG_WARN("failed to add column svr_port", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_pk_column("sql_id", sqlstat.sql_id_))) { + LOG_WARN("failed to add column sql_id", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_pk_column("source_ip", sqlstat.source_ip_))) { + LOG_WARN("failed to add column source_ip", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_pk_column("source_port", sqlstat.source_port_))) { + LOG_WARN("failed to add column source_port", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_uint64_pk_column("plan_hash", sqlstat.plan_hash_))) { + LOG_WARN("failed to add column plan_hash", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("plan_type", sqlstat.plan_type_))) { + LOG_WARN("failed to add column plan_type", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column(true, "module"))) { // 没有设置为null + LOG_WARN("failed to add column module", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column(true, "action"))) { + LOG_WARN("failed to add column action", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("parsing_db_id", sqlstat.parsing_db_id_))) { + LOG_WARN("failed to add column parsing_db_id", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("parsing_db_name", sqlstat.parsing_db_name_))) { + LOG_WARN("failed to add column parsing_db_name", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("parsing_user_id", sqlstat.parsing_user_id_))) { + LOG_WARN("failed to add column parsing_user_id", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("executions_total", sqlstat.executions_total_))) { + LOG_WARN("failed to add column executions_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("executions_delta", sqlstat.executions_delta_))) { + LOG_WARN("failed to add column executions_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("disk_reads_total", sqlstat.disk_reads_total_))) { + LOG_WARN("failed to add column disk_reads_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("disk_reads_delta", sqlstat.disk_reads_delta_))) { + LOG_WARN("failed to add column disk_reads_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("buffer_gets_total", sqlstat.buffer_gets_total_))) { + LOG_WARN("failed to add column buffer_gets_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("buffer_gets_delta", sqlstat.buffer_gets_delta_))) { + LOG_WARN("failed to add column buffer_gets_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("elapsed_time_total", sqlstat.elapsed_time_total_))) { + LOG_WARN("failed to add column elapsed_time_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("elapsed_time_delta", sqlstat.elapsed_time_delta_))) { + LOG_WARN("failed to add column elapsed_time_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("cpu_time_total", sqlstat.cpu_time_total_))) { + LOG_WARN("failed to add column cpu_time_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("cpu_time_delta", sqlstat.cpu_time_delta_))) { + LOG_WARN("failed to add column cpu_time_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("ccwait_total", sqlstat.ccwait_total_))) { + LOG_WARN("failed to add column ccwait_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("ccwait_delta", sqlstat.ccwait_delta_))) { + LOG_WARN("failed to add column ccwait_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("userio_wait_total", sqlstat.userio_wait_total_))) { + LOG_WARN("failed to add column userio_wait_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("userio_wait_delta", sqlstat.userio_wait_delta_))) { + LOG_WARN("failed to add column userio_wait_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("apwait_total", sqlstat.apwait_total_))) { + LOG_WARN("failed to add column apwait_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("apwait_delta", sqlstat.apwait_delta_))) { + LOG_WARN("failed to add column apwait_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("physical_read_requests_total", sqlstat.physical_read_requests_total_))) { + LOG_WARN("failed to add column physical_read_requests_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("physical_read_requests_delta", sqlstat.physical_read_requests_delta_))) { + LOG_WARN("failed to add column physical_read_requests_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("physical_read_bytes_total", sqlstat.physical_read_bytes_total_))) { + LOG_WARN("failed to add column physical_read_bytes_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("physical_read_bytes_delta", sqlstat.physical_read_bytes_delta_))) { + LOG_WARN("failed to add column physical_read_bytes_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("write_throttle_total", sqlstat.write_throttle_total_))) { + LOG_WARN("failed to add column write_throttle_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("write_throttle_delta", sqlstat.write_throttle_delta_))) { + LOG_WARN("failed to add column write_throttle_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("rows_processed_total", sqlstat.rows_processed_total_))) { + LOG_WARN("failed to add column rows_processed_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("rows_processed_delta", sqlstat.rows_processed_delta_))) { + LOG_WARN("failed to add column rows_processed_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("memstore_read_rows_total", sqlstat.memstore_read_rows_total_))) { + LOG_WARN("failed to add column memstore_read_rows_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("memstore_read_rows_delta", sqlstat.memstore_read_rows_delta_))) { + LOG_WARN("failed to add column memstore_read_rows_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("minor_ssstore_read_rows_total", sqlstat.minor_ssstore_read_rows_total_))) { + LOG_WARN("failed to add column minor_ssstore_read_rows_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("minor_ssstore_read_rows_delta", sqlstat.minor_ssstore_read_rows_delta_))) { + LOG_WARN("failed to add column minor_ssstore_read_rows_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("major_ssstore_read_rows_total", sqlstat.major_ssstore_read_rows_total_))) { + LOG_WARN("failed to add column major_ssstore_read_rows_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("major_ssstore_read_rows_delta", sqlstat.major_ssstore_read_rows_delta_))) { + LOG_WARN("failed to add column major_ssstore_read_rows_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("rpc_total", sqlstat.rpc_total_))) { + LOG_WARN("failed to add column rpc_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("rpc_delta", sqlstat.rpc_delta_))) { + LOG_WARN("failed to add column rpc_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("fetches_total", sqlstat.fetches_total_))) { + LOG_WARN("failed to add column fetches_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("fetches_delta", sqlstat.fetches_delta_))) { + LOG_WARN("failed to add column fetches_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("retry_total", sqlstat.retry_total_))) { + LOG_WARN("failed to add column retry_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("retry_delta", sqlstat.retry_delta_))) { + LOG_WARN("failed to add column retry_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("partition_total", sqlstat.partition_total_))) { + LOG_WARN("failed to add column partition_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("partition_delta", sqlstat.partition_delta_))) { + LOG_WARN("failed to add column partition_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("nested_sql_total", sqlstat.nested_sql_total_))) { + LOG_WARN("failed to add column nested_sql_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("nested_sql_delta", sqlstat.nested_sql_delta_))) { + LOG_WARN("failed to add column nested_sql_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("route_miss_total", sqlstat.route_miss_total_))) { + LOG_WARN("failed to add column route_miss_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("route_miss_delta", sqlstat.route_miss_delta_))) { + LOG_WARN("failed to add column route_miss_delta", KR(ret), K(sqlstat)); + } else if (sqlstat.first_load_time_ <= 0 && OB_FAIL(dml_splicer.add_column(true, "first_load_time"))) { + LOG_WARN("failed to add column first_load_time", KR(ret), K(sqlstat)); + } else if (sqlstat.first_load_time_ > 0 && OB_FAIL(dml_splicer.add_time_column("first_load_time", sqlstat.first_load_time_))) { + LOG_WARN("failed to add column first_load_time", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("plan_cache_hit_total", sqlstat.plan_cache_hit_total_))) { + LOG_WARN("failed to add column plan_cache_hit_total", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.add_column("plan_cache_hit_delta", sqlstat.plan_cache_hit_delta_))) { + LOG_WARN("failed to add column plan_cache_hit_delta", KR(ret), K(sqlstat)); + } else if (OB_FAIL(dml_splicer.finish_row())) { + LOG_WARN("failed to finish row", KR(ret)); + } + + if (OB_SUCC(ret) && dml_splicer.get_row_count() >= WR_INSERT_SQL_STAT_BATCH_SIZE) { + collected_sqlstat_row_count += dml_splicer.get_row_count(); + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_SQLSTAT_TNAME, tenant_id))) { + LOG_WARN("failed to batch write to wr", KR(ret)); + } + } + } + } + } // end while + if (OB_SUCC(ret) && dml_splicer.get_row_count() > 0) { + collected_sqlstat_row_count += dml_splicer.get_row_count(); + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_SQLSTAT_TNAME, tenant_id))) { + LOG_WARN("failed to batch write remaining part to wr", KR(ret)); + } + } + } + } //end smart_var + } + return ret; +} + + +int ObWrCollector::update_sqlstat() +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.omt_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("omt is null", K(ret)); + } else { + observer::ObReqTimeGuard req_timeinfo_guard; + sql::ObPlanCache *plan_cache = NULL; + plan_cache = MTL(ObPlanCache*); + if (nullptr != plan_cache){ + ObUpdateSqlStatOp op; + if (OB_FAIL(plan_cache->foreach_cache_obj(op))) { + LOG_WARN("fail to traverse tmp sql stat map", K(ret)); + } + } else { + LOG_WARN("failed to get library cache", K(ret)); + } + } + return ret; +} + +int ObWrCollector::update_last_snapshot_end_time() +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + const uint64_t tenant_id = MTL_ID(); + ObSqlString sql; + int64_t affected_rows = 0; + + LOG_DEBUG("wr snapshot update last snapshot end time", K(tenant_id), K(snapshot_begin_time_), K(snapshot_end_time_)); + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + ObDMLSqlSplicer dml_splicer; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(dml_splicer.add_pk_column("tenant_id", tenant_id))) { + LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column("cluster_id", LAST_SNAPSHOT_RECORD_CLUSTER_ID))) { + LOG_WARN("failed to add column cluster_id", KR(ret), K(LAST_SNAPSHOT_RECORD_CLUSTER_ID)); + } else if (OB_FAIL(dml_splicer.add_pk_column("snap_id", LAST_SNAPSHOT_RECORD_SNAP_ID))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(LAST_SNAPSHOT_RECORD_SNAP_ID)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", ""))) { + LOG_WARN("failed to add column svr_ip", KR(ret), K("")); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", LAST_SNAPSHOT_RECORD_SVR_PORT))) { + LOG_WARN("failed to add column svr_port", KR(ret), K(LAST_SNAPSHOT_RECORD_SVR_PORT)); + } else if (OB_FAIL(dml_splicer.add_time_column("begin_interval_time", snapshot_begin_time_))) { + LOG_WARN("failed to add column begin_interval_time", KR(ret), K(snapshot_begin_time_)); + } else if (OB_FAIL(dml_splicer.add_time_column("end_interval_time", snapshot_end_time_))) { + LOG_WARN("failed to add column end_interval_time", KR(ret), K(snapshot_end_time_)); + } else if (OB_FAIL(dml_splicer.add_column("snap_flag", snapshot_ahead_ + ? ObWrSnapshotFlag::LAST_AHEAD_SNAPSHOT + : ObWrSnapshotFlag::LAST_SCHEDULED_SNAPSHOT))) { + LOG_WARN("failed to add column snap_flag", KR(ret)); + } else if (OB_FAIL(dml_splicer.add_column(true, "startup_time"))) { + LOG_WARN("failed to add column snap_flag", KR(ret)); + } else if (OB_FAIL(dml_splicer.add_column("status", ObWrSnapshotStatus::SUCCESS))) { + LOG_WARN("failed to add column snap_flag", KR(ret)); + } else if (OB_FAIL(dml_splicer.finish_row())) { + LOG_WARN("failed to finish row", KR(ret)); + } else if (OB_FAIL(dml_splicer.splice_insert_update_sql(OB_WR_SNAPSHOT_TNAME, sql))) { + LOG_WARN("failed to generate snapshot insertion sql", KR(ret), K(tenant_id)); + } else if (OB_FAIL( + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + LOG_WARN("failed to write snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); + } else if (affected_rows != 1 && affected_rows != 2) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid affected rows", KR(ret), K(affected_rows), K(sql)); + } else { + LOG_DEBUG("success to insert snapshot info", K(sql)); + } + } + return ret; +} + +int ObWrCollector::collect_sqltext() +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + const uint64_t tenant_id = MTL_ID(); + int64_t cluster_id = ObServerConfig::get_instance().cluster_id; + ObDMLSqlSplicer dml_splicer; + ObSqlString sql; + int64_t tmp_real_str_len = 0; + + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + "select /*+ workload_repository_snapshot query_timeout(%ld) */ " + " sql_id, query_sql , " + " sql_type from oceanbase.__all_virtual_sqlstat " + "where tenant_id = %ld and sql_id in (select distinct sql_id from oceanbase.__all_virtual_wr_sqlstat where " + "tenant_id = %ld and snap_id = %ld and query_sql <> '') group by sql_id ", + query_timeout, tenant_id, tenant_id, snap_id_))) { + LOG_WARN("failed to assign ash query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { + LOG_WARN("failed to fetch sql stat", KR(ret), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); + } else { + const bool skip_null_error = true; + const bool skip_column_error = false; + const int64_t default_value = -1; + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + ObWrSqlText sqltext; + const bool skip_null_error = true; + const bool skip_column_error = false; + const int64_t default_value = 0; + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "sql_id", sqltext.sql_id_, sizeof(sqltext.sql_id_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET_AND_TRUNCATION( + *result, "query_sql", sqltext.query_sql_, sizeof(sqltext.query_sql_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "sql_type", sqltext.sql_type_, int64_t, skip_null_error, skip_column_error, default_value); + + + if (OB_SUCC(ret)) { + int tmp_ret = OB_SUCCESS; + ObSqlString insert_sql; + int64_t affected_rows = 0; + uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id); + query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + const char* query_sql = to_cstring(ObHexEscapeSqlStr(ObString::make_string(sqltext.query_sql_))); + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(tmp_ret), K_(timeout_ts)); + } else if (OB_TMP_FAIL(insert_sql.assign_fmt( + "insert /*+ workload_repository_snapshot query_timeout(%ld) */ into %s " + "(TENANT_ID, CLUSTER_ID,SNAP_ID, SQL_ID, QUERY_SQL, SQL_TYPE) values " + "(%ld, %ld, %ld, '%s',\"%.*s\" , %ld)", + query_timeout, OB_WR_SQLTEXT_TNAME, + tenant_id, cluster_id, snap_id_, sqltext.sql_id_, + static_cast(strlen(query_sql)), query_sql, sqltext.sql_type_))) { + LOG_WARN("failed to assign insert query string", KR(tmp_ret)); + } else if (OB_TMP_FAIL(ObWrCollector::exec_write_sql_with_retry(exec_tenant_id, insert_sql.ptr(), affected_rows))) { + LOG_WARN("execute sql failed", KR(tmp_ret), K(tenant_id), K(exec_tenant_id), K(insert_sql)); + } else if (OB_UNLIKELY(affected_rows != 1)) { + // ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected affected_rows", KR(tmp_ret), K(affected_rows), K(insert_sql)); + } + } + + + } + } // end while + } + } //end smart_var + return ret; +} + +int ObWrCollector::collect_sql_plan() +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + const uint64_t tenant_id = MTL_ID(); + int64_t cluster_id = ObServerConfig::get_instance().cluster_id; + ObDMLSqlSplicer dml_splicer; + ObSqlString sql; + int64_t tmp_real_str_len = 0; + int64_t query_timeout = timeout_ts_ - common::ObTimeUtility::current_time(); + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_UNLIKELY(query_timeout <= 0)) { + ret = OB_TIMEOUT; + LOG_WARN("wr snapshot timeout", KR(ret), K_(timeout_ts)); + } else if (OB_FAIL(sql.assign_fmt( + "SELECT /*+ WORKLOAD_REPOSITORY_SNAPSHOT QUERY_TIMEOUT(%ld) */ svr_ip, svr_port, " + "sql_id, plan_hash, plan_id, id, db_id, time_to_usec(gmt_create) as gmt_create, operator, options, object_id, object_owner, " + "object_name, object_alias, object_type, optimizer, parent_id, depth, position, is_last_child, cost, " + "real_cost, cardinality, real_cardinality, bytes, rowset, other_tag, partition_start, other, " + "cpu_cost, io_cost, access_predicates, filter_predicates, startup_predicates, projection, special_predicates, " + "qblock_name, remarks, other_xml " + "from __all_virtual_sql_plan where tenant_id=%ld and sql_id in (select distinct sql_id from " + "oceanbase.__all_virtual_wr_sqlstat where tenant_id = %ld and snap_id = %ld) group by sql_id", + query_timeout, tenant_id, tenant_id, snap_id_))) { + LOG_WARN("failed to assign sqlplan query string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, tenant_id, sql.ptr()))) { + LOG_WARN("failed to fetch sqlplan", KR(ret), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); + } else { + const bool skip_null_error = true; + const bool skip_column_error = false; + const bool need_insert_ignore = true; + const int64_t default_value = -1; + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("fail to get next row", KR(ret)); + } + } else { + SMART_VAR(ObWrSqlPlan, sqlplan) + EXTRACT_STRBUF_FIELD_MYSQL( + *result, "svr_ip", sqlplan.svr_ip_, OB_IP_STR_BUFF, tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL(*result, "svr_port", sqlplan.svr_port_, int64_t); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "sql_id", sqlplan.sql_id_, sizeof(sqlplan.sql_id_), tmp_real_str_len); + EXTRACT_UINT_FIELD_MYSQL(*result, "plan_hash", sqlplan.plan_hash_, uint64_t); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "plan_id", sqlplan.plan_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "id", sqlplan.id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "db_id", sqlplan.db_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "gmt_create", sqlplan.gmt_create_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "operator", sqlplan.operator_, sizeof(sqlplan.operator_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "option", sqlplan.option_, sizeof(sqlplan.option_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "object_node", sqlplan.object_node_, sizeof(sqlplan.object_node_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "object_id", sqlplan.object_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "object_owner", sqlplan.object_owner_, sizeof(sqlplan.object_owner_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "object_name", sqlplan.object_name_, sizeof(sqlplan.object_name_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "object_alias", sqlplan.object_alias_, sizeof(sqlplan.object_alias_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "object_type", sqlplan.object_type_, sizeof(sqlplan.object_type_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "optimizer", sqlplan.optimizer_, sizeof(sqlplan.optimizer_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "parent_id", sqlplan.parent_id_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "depth", sqlplan.depth_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "position", sqlplan.position_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "is_last_child", sqlplan.is_last_child_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "cost", sqlplan.cost_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "real_cost", sqlplan.real_cost_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "cardinality", sqlplan.cardinality_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "real_cardinality", sqlplan.real_cardinality_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "bytes", sqlplan.bytes_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "rowset", sqlplan.rowset_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "other_tag", sqlplan.other_tag_, sizeof(sqlplan.other_tag_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "partition_start", sqlplan.partition_start_, sizeof(sqlplan.partition_start_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "other", sqlplan.other_, sizeof(sqlplan.other_), tmp_real_str_len); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "cpu_cost", sqlplan.cpu_cost_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "io_cost", sqlplan.io_cost_, int64_t, skip_null_error, skip_column_error, default_value); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "access_predicates", sqlplan.access_predicates_, sizeof(sqlplan.access_predicates_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "filter_predicates", sqlplan.filter_predicates_, sizeof(sqlplan.filter_predicates_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "startup_predicates", sqlplan.startup_predicates_, sizeof(sqlplan.startup_predicates_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "projection", sqlplan.projection_, sizeof(sqlplan.projection_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "special_predicates", sqlplan.special_predicates_, sizeof(sqlplan.special_predicates_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "qblock_name", sqlplan.qblock_name_, sizeof(sqlplan.qblock_name_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "remarks", sqlplan.remarks_, sizeof(sqlplan.remarks_), tmp_real_str_len); + EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "other_xml", sqlplan.other_xml_, sizeof(sqlplan.other_xml_), tmp_real_str_len); + + if (OB_SUCC(ret)) { + if (OB_FAIL(dml_splicer.add_pk_column(K(tenant_id)))) { + LOG_WARN("failed to add tenant_id", KR(ret), K(tenant_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column(K(cluster_id)))) { + LOG_WARN("failed to add column cluster_id", KR(ret), K(cluster_id)); + } else if (OB_FAIL(dml_splicer.add_pk_column("SNAP_ID", snap_id_))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(snap_id_)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_ip", sqlplan.svr_ip_))) { + LOG_WARN("failed to add column svr_ip", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_pk_column("svr_port", sqlplan.svr_port_))) { + LOG_WARN("failed to add column svr_port", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_pk_column("SQL_ID", sqlplan.sql_id_))) { + LOG_WARN("failed to add column SNAP_ID", KR(ret), K(sqlplan.sql_id_)); + } else if (OB_FAIL(dml_splicer.add_uint64_pk_column("plan_hash", sqlplan.plan_hash_))) { + LOG_WARN("failed to add column plan_hash", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_pk_column("plan_id", sqlplan.plan_id_))) { + LOG_WARN("failed to add column plan_id", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_pk_column("id", sqlplan.id_))) { + LOG_WARN("failed to add column id", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("db_id", sqlplan.db_id_))) { + LOG_WARN("failed to add column db_id", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_time_column("gmt_create", sqlplan.gmt_create_))) { + LOG_WARN("failed to add gmt_create", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("operator", sqlplan.operator_))) { + LOG_WARN("failed to add column operator", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("options", sqlplan.option_))) { + LOG_WARN("failed to add column options", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_node", sqlplan.object_node_))) { + LOG_WARN("failed to add column object_node", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_id", sqlplan.object_id_))) { + LOG_WARN("failed to add column object_id", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_owner", sqlplan.object_owner_))) { + LOG_WARN("failed to add column object_owner", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_name", sqlplan.object_name_))) { + LOG_WARN("failed to add column object_name", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_alias", sqlplan.object_alias_))) { + LOG_WARN("failed to add column object_alias", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("object_type", sqlplan.object_type_))) { + LOG_WARN("failed to add column object_type", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("optimizer", ObHexEscapeSqlStr(ObString::make_string(sqlplan.optimizer_))))) { + LOG_WARN("failed to add column optimizer", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("parent_id", sqlplan.parent_id_))) { + LOG_WARN("failed to add column parent_id", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("depth", sqlplan.depth_))) { + LOG_WARN("failed to add column depth_", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("position", sqlplan.position_))) { + LOG_WARN("failed to add column position", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("is_last_child", sqlplan.is_last_child_))) { + LOG_WARN("failed to add column is_last_child", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("cost", sqlplan.cost_))) { + LOG_WARN("failed to add column cost", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("real_cost", sqlplan.real_cost_))) { + LOG_WARN("failed to add column real_cost", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("cardinality", sqlplan.cardinality_))) { + LOG_WARN("failed to add column cardinality", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("real_cardinality", sqlplan.real_cardinality_))) { + LOG_WARN("failed to add column real_cardinality", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("bytes", sqlplan.bytes_))) { + LOG_WARN("failed to add column bytes", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("rowset", sqlplan.rowset_))) { + LOG_WARN("failed to add column rowset", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("other_tag", ObHexEscapeSqlStr(ObString::make_string(sqlplan.other_tag_))))) { + LOG_WARN("failed to add column other_tag", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("partition_start", ObHexEscapeSqlStr(ObString::make_string(sqlplan.partition_start_))))) { + LOG_WARN("failed to add column partition_start", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("other", ObHexEscapeSqlStr(ObString::make_string(sqlplan.other_))))) { + LOG_WARN("failed to add column other", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("cpu_cost", sqlplan.cpu_cost_))) { + LOG_WARN("failed to add column cpu_cost", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("io_cost", sqlplan.io_cost_))) { + LOG_WARN("failed to add column io_cost", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("access_predicates", ObHexEscapeSqlStr(ObString::make_string(sqlplan.access_predicates_))))) { + LOG_WARN("failed to add column access_predicates", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("filter_predicates", ObHexEscapeSqlStr(ObString::make_string(sqlplan.filter_predicates_))))) { + LOG_WARN("failed to add column filter_predicates", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("startup_predicates", ObHexEscapeSqlStr(ObString::make_string(sqlplan.startup_predicates_))))) { + LOG_WARN("failed to add column startup_predicates", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("projection", ObHexEscapeSqlStr(ObString::make_string(sqlplan.projection_))))) { + LOG_WARN("failed to add column projection", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("special_predicates", ObHexEscapeSqlStr(ObString::make_string(sqlplan.special_predicates_))))) { + LOG_WARN("failed to add column special_predicates", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("qblock_name", sqlplan.qblock_name_))) { + LOG_WARN("failed to add column qblock_name", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("remarks", ObHexEscapeSqlStr(ObString::make_string(sqlplan.remarks_))))) { + LOG_WARN("failed to add column remarks", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.add_column("other_xml", ObHexEscapeSqlStr(ObString::make_string(sqlplan.other_xml_))))) { + LOG_WARN("failed to add column other_xml", KR(ret), K(sqlplan)); + } else if (OB_FAIL(dml_splicer.finish_row())) { + LOG_WARN("failed to finish row", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() >= WR_SQL_PLAN_BATCH_SIZE) { + if (OB_FAIL(write_to_wr(dml_splicer, OB_WR_SQL_PLAN_TNAME, tenant_id, need_insert_ignore))) { + LOG_WARN("failed to batch write to wr", KR(ret)); + } + } + } + if (OB_SUCC(ret) && dml_splicer.get_row_count() > 0 && + OB_FAIL(write_to_wr(dml_splicer, OB_WR_SQL_PLAN_TNAME, tenant_id, need_insert_ignore))) { + LOG_WARN("failed to batch write remaining part to wr", KR(ret)); + } + } + } + return ret; +} + int ObWrCollector::write_to_wr( - ObDMLSqlSplicer &dml_splicer, const char *table_name, int64_t tenant_id) + ObDMLSqlSplicer &dml_splicer, const char *table_name, int64_t tenant_id, bool ignore_error) { int ret = OB_SUCCESS; ObSqlString sql; int64_t affected_rows = 0; int64_t cur_row = dml_splicer.get_row_count(); - if (OB_FAIL(dml_splicer.splice_batch_insert_sql(table_name, sql))) { + if (!ignore_error && OB_FAIL(dml_splicer.splice_batch_insert_sql(table_name, sql))) { + LOG_WARN("failed to generate sql", KR(ret), K(tenant_id)); + } else if (ignore_error && OB_FAIL(dml_splicer.splice_batch_insert_ignore_sql(table_name, sql))) { LOG_WARN("failed to generate sql", KR(ret), K(tenant_id)); } else if (OB_FAIL( - GCTX.sql_proxy_->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to write wr data", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); } else if (affected_rows != cur_row) { ret = OB_ERR_UNEXPECTED; @@ -364,9 +1484,117 @@ int ObWrCollector::write_to_wr( return ret; } +int ObWrCollector::fetch_snapshot_id_sequence_curval(int64_t &snap_id) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = OB_SYS_TENANT_ID; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObSqlString sql; + ObObj snap_id_obj; + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt( + "SELECT /*+ WORKLOAD_REPOSITORY */ %s.currval as snap_id FROM DUAL", WR_SNAP_ID_SEQNENCE_NAME))) { + LOG_WARN("failed to assign create sequence sql string", KR(ret)); + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + LOG_WARN("failed to fetch cur snap_id sequence", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(tenant_id), K(sql)); + } else if (OB_FAIL(result->next())) { + LOG_WARN("get next result failed", KR(ret), K(tenant_id), K(sql)); + } else if (OB_FAIL(result->get_obj((int64_t)0, snap_id_obj))) { + LOG_WARN("failed to get snap_id obj", KR(ret)); + } else if (OB_FAIL(snap_id_obj.get_number().cast_to_int64(snap_id))) { + LOG_WARN("failed to get snap_id value", KR(ret)); + } + } + return ret; +} + +int ObWrCollector::get_cur_snapshot_id_for_ahead_snapshot(int64_t &snap_id) +{ + int ret = OB_SUCCESS; + // we can't access sequence.currval in one new session + // so we have to read from __wr_snapshot + ObSqlString sql; + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt( + "SELECT max(snap_id)+1 as snap_id FROM %s", OB_WR_SNAPSHOT_TNAME))) { + LOG_WARN("failed to assign select sql string", KR(ret)); + } else if (OB_FAIL( + ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(OB_SYS_TENANT_ID), sql.ptr()))) { + LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get mysql result", KR(ret), K(sql)); + } else if (OB_FAIL(result->next())) { + LOG_WARN("get next result failed", KR(ret), K(sql)); + } else if (OB_FAIL(result->get_int(0L, snap_id))) { + if (ret == OB_ERR_NULL_VALUE) { + // no record in __wr_snapshot table. this is the first time we take snapshot in this + // cluster. + ret = OB_SUCCESS; + snap_id = 1; + LOG_WARN("first time to take wr snapshot in this cluster", K(snap_id), K(ret)); + } + } + } + + return ret; +} + +int ObWrCollector::get_begin_interval_time(int64_t &begin_interval_time) +{ + int ret = OB_SUCCESS; + ObSqlString sql; + const int64_t tenant_id = MTL_ID(); + SMART_VAR(ObISQLClient::ReadResult, res) + { + ObMySQLResult *result = nullptr; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ time_to_usec(END_INTERVAL_TIME) FROM %s where " + "tenant_id=%ld and snap_id != %ld order by snap_id desc limit 1", + OB_WR_SNAPSHOT_TNAME, tenant_id, snap_id_))) { + LOG_WARN("failed to format sql", KR(ret)); + } else if (OB_FAIL( + ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get mysql result", KR(ret), K(sql)); + } else if (OB_FAIL(result->next())) { + if (OB_ITER_END == ret) { + // no record in __wr_snapshot table. this is the first time we take snapshot in this + // cluster, just use snapshot_begin_time_ in wr request. + ret = OB_SUCCESS; + begin_interval_time = snapshot_begin_time_; + LOG_WARN("no scheduled wr snapshot in this cluster", K(tenant_id), K(begin_interval_time)); + } else { + LOG_WARN("get next result failed", KR(ret), K(sql)); + } + } else if (OB_FAIL(result->get_int(0L, begin_interval_time))) { + LOG_WARN("get column fail", KR(ret), K(sql)); + } + } + return ret; +} + int ObWrDeleter::do_delete() { int ret = OB_SUCCESS; + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::WR_DEL_SNAPSHOT); uint64_t tenant_id = MTL_ID(); int64_t cluster_id = ObServerConfig::get_instance().cluster_id; int64_t query_timeout = 0; @@ -393,6 +1621,18 @@ int ObWrDeleter::do_delete() OB_WR_SNAPSHOT_TNAME, tenant_id, cluster_id, snap_id, query_timeout))) { LOG_WARN( "failed to delete __wr_snapshot data ", K(ret), K(tenant_id), K(cluster_id), K(snap_id)); + } else if (OB_FAIL(delete_expired_data_from_wr_table( + OB_WR_SYSTEM_EVENT_TNAME, tenant_id, cluster_id, snap_id, query_timeout))) { + LOG_WARN( + "failed to delete __wr_system_event data ", K(ret), K(tenant_id), K(cluster_id), K(snap_id)); + } else if (OB_FAIL(delete_expired_data_from_wr_table( + OB_WR_SQLSTAT_TNAME, tenant_id, cluster_id, snap_id, query_timeout))) { + LOG_WARN( + "failed to delete __wr_sqlstat data ", K(ret), K(tenant_id), K(cluster_id), K(snap_id)); + } else if (OB_FAIL(delete_expired_data_from_wr_table( + OB_WR_SQLTEXT_TNAME, tenant_id, cluster_id, snap_id, query_timeout))) { + LOG_WARN( + "failed to delete __wr_sqltext data ", K(ret), K(tenant_id), K(cluster_id), K(snap_id)); } if (OB_FAIL(ret)) { int tmp_ret = OB_SUCCESS; @@ -426,7 +1666,7 @@ int ObWrDeleter::delete_expired_data_from_wr_table(const char *const table_name, } else if (OB_FAIL(sql.append_fmt("tenant_id='%lu' and cluster_id='%lu' and snap_id='%ld'", tenant_id, cluster_id, snap_id))) { LOG_WARN("sql append failed", K(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->write(meta_tenant_id, sql.ptr(), affected_rows))) { + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(meta_tenant_id, sql.ptr(), affected_rows))) { LOG_WARN("execute sql failed", KR(ret), K(tenant_id), K(meta_tenant_id), K(sql)); } else if (OB_UNLIKELY(affected_rows == 0)) { LOG_TRACE("the snapshot does not have any data.", K(snap_id), K(tenant_id), K(affected_rows), @@ -460,7 +1700,7 @@ int ObWrDeleter::modify_snapshot_status(const uint64_t tenant_id, const int64_t query_timeout, OB_WR_SNAPSHOT_TNAME, status, tenant_id, cluster_id, snap_id))) { LOG_WARN("sql assign failed", K(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->write(meta_tenant_id, sql.ptr(), affected_rows))) { + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(meta_tenant_id, sql.ptr(), affected_rows))) { LOG_WARN("execute sql failed", KR(ret), K(tenant_id), K(meta_tenant_id), K(sql)); } else if (OB_UNLIKELY(affected_rows == 0)) { LOG_TRACE("the snapshot is already marked as deleted, execute delete process anyway", K(snap_id), K(tenant_id), K(affected_rows)); @@ -471,5 +1711,126 @@ int ObWrDeleter::modify_snapshot_status(const uint64_t tenant_id, const int64_t return ret; } + +int ObUpdateSqlStatOp::operator()(common::hash::HashMapPair &entry) +{ + int ret = common::OB_SUCCESS; + if (OB_ISNULL(entry.second)) { + ret = common::OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(ret)); + } else if (entry.second->get_ns() == sql::ObLibCacheNameSpace::NS_SQLSTAT) { + sql::ObSqlStatRecordObj *obj = nullptr; + if (OB_ISNULL(entry.second)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null obj", K(ret)); + } else if (OB_ISNULL(obj = static_cast(entry.second))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null obj", K(ret)); + } else if (!obj->get_record_value()->get_key().is_valid()) { + // do nothing + } else if (OB_FAIL(obj->get_record_value()->update_last_snap_record_value())) { + LOG_WARN("failed to update last snap reocrd value", K(ret)); + } + } else if (entry.second->get_ns() == sql::ObLibCacheNameSpace::NS_CRSR) { + ObPhysicalPlan *plan = nullptr; + if (OB_ISNULL(entry.second)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null obj", K(ret)); + } else if (OB_ISNULL(plan = static_cast(entry.second))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null obj", K(ret)); + } else if (!plan->sql_stat_record_value_.get_key().is_valid()) { + // do nothing + } else if (OB_FAIL(plan->sql_stat_record_value_.update_last_snap_record_value())) { + LOG_WARN("failed to update last snap reocrd value", K(ret)); + } + } + return ret; +} + +int ObWrCollector::exec_read_sql_with_retry(common::ObCommonSqlProxy::ReadResult &res, const uint64_t tenant_id, const char *sql) +{ + int ret = OB_SUCCESS; + auto f = [&res, &tenant_id, &sql]() { return GCTX.sql_proxy_->read(res, tenant_id, sql);}; + if (OB_FAIL(ObWrCollector::exec_sql_with_retry(tenant_id, sql, f))) { + LOG_WARN("failed to exec wr sql with retry", K(ret), K(sql), K(tenant_id)); + } + return ret; +} + +int ObWrCollector::exec_write_sql_with_retry(const uint64_t tenant_id, const char *sql, int64_t &affected_rows) +{ + int ret = OB_SUCCESS; + auto f = [&tenant_id, &sql, &affected_rows]() { return GCTX.sql_proxy_->write(tenant_id, sql, affected_rows);}; + if (OB_FAIL(ObWrCollector::exec_sql_with_retry(tenant_id, sql, f))) { + LOG_WARN("failed to exec wr sql with retry", K(ret), K(sql), K(tenant_id)); + } + return ret; +} + +ERRSIM_POINT_DEF(EN_WR_SNAPSHOT_ERRSIM); +template +int ObWrCollector::exec_sql_with_retry(const uint64_t tenant_id, const char * sql, T function) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(GCTX.sql_proxy_) || OB_ISNULL(sql)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ or sql is null", K(ret), K(GCTX.sql_proxy_), K(sql)); + } else { + const int64_t max_timeout = 1 * 60 * 1000 * 1000L; // 1 min + const int64_t old_worker_timeout_ts = THIS_WORKER.get_timeout_ts(); + if (THIS_WORKER.get_timeout_ts() >= (common::ObTimeUtility::current_time() + max_timeout)) { + LOG_INFO("the query timeout is too big!!!", K(ret), K(old_worker_timeout_ts), K(max_timeout), K(common::ObTimeUtility::current_time())); + THIS_WORKER.set_timeout_ts(common::ObTimeUtility::current_time() + max_timeout); + } + + int retry_cnt = 0; + do { + int tmp_ret = OB_SUCCESS; + if (OB_UNLIKELY(common::ObTimeUtility::current_time() >= THIS_WORKER.get_timeout_ts())) { + ret = OB_TIMEOUT; + LOG_WARN("exec wr inner sql timeout", K(ret), K(retry_cnt), K(THIS_WORKER.get_timeout_ts())); + break; + } else if (OB_TMP_FAIL(function())) { + LOG_WARN("failed to read or write wr need data", K(ret), K(tmp_ret), K(sql), K(retry_cnt)); + } + + if (OB_UNLIKELY(EN_WR_SNAPSHOT_ERRSIM)) { + tmp_ret = EN_WR_SNAPSHOT_ERRSIM; + LOG_WARN("wr retry sql errsim, ret is ", K(tmp_ret)); + } + + if (OB_TMP_FAIL(tmp_ret)) { + if (is_can_retry(tmp_ret)) { + ++retry_cnt; + ret = OB_NEED_RETRY; + ob_usleep(1000L * 1000L); //1s + LOG_INFO("wr sql execute failed , need retry", K(ret), K(tmp_ret), K(retry_cnt), K(sql)); + } else { + ret = tmp_ret; + } + } + } while (ret == OB_NEED_RETRY); + + THIS_WORKER.set_timeout_ts(old_worker_timeout_ts); + } + return ret; +} + +bool ObWrCollector::is_can_retry(const int ret) +{ + bool bret = false; + observer::ObQueryRetryCtrl::retry_func retry_func = nullptr; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(observer::ObQueryRetryCtrl::get_func(ret, true/*is_inner*/, retry_func))) { + LOG_WARN("get retry func failed", K(tmp_ret), K(ret)); + } else if (retry_func != nullptr && retry_func != observer::ObQueryRetryCtrl::empty_proc) { + bret = true; + } + return bret; +} + + + } // end of namespace share } // end of namespace oceanbase diff --git a/src/share/wr/ob_wr_collector.h b/src/share/wr/ob_wr_collector.h index 0c56fefa1e..da0789d191 100644 --- a/src/share/wr/ob_wr_collector.h +++ b/src/share/wr/ob_wr_collector.h @@ -13,14 +13,20 @@ #ifndef OCEANBASE_WR_OB_WORKLOAD_REPOSITORY_COLLECTOR_H_ #define OCEANBASE_WR_OB_WORKLOAD_REPOSITORY_COLLECTOR_H_ #include "share/wr/ob_wr_snapshot_rpc_processor.h" -#include "share/wr/ob_wr_task.h" +#include "sql/plan_cache/ob_i_lib_cache_object.h" + namespace oceanbase { namespace share { +enum class ObWrSnapshotStatus : int64_t; + struct ObWrSysstat { + ObWrSysstat() : svr_ip_("\0"), svr_port_(0), stat_id_(0), value_(0) + {} + public: TO_STRING_KV(K_(svr_ip), K_(svr_port), K_(stat_id), K_(value)); char svr_ip_[OB_IP_STR_BUFF]; @@ -29,13 +35,72 @@ public: int64_t value_; }; +struct ObWrSystemEvent +{ +public: + ObWrSystemEvent() + : svr_ip_("\0"), + svr_port_(0), + event_id_(0), + total_waits_(0), + total_timeouts_(0), + time_waited_micro_(0) + {} + TO_STRING_KV(K_(svr_ip), K_(svr_port), K_(event_id), K_(total_waits), K_(total_timeouts), + K_(time_waited_micro)); + char svr_ip_[OB_IP_STR_BUFF]; + int64_t svr_port_; + int64_t event_id_; + int64_t total_waits_; + int64_t total_timeouts_; + int64_t time_waited_micro_; +}; + struct ObWrAsh { public: + ObWrAsh() { + svr_ip_[0] = '\0'; + svr_port_ = 0; + sample_id_ = 0; + session_id_ = 0; + sample_time_ = 0; + user_id_ = 0; + session_type_ = 0; + sql_id_[0] = '\0'; + trace_id_[0] = '\0'; + event_no_ = -1; + time_waited_ = -1; + p1_ = -1; + p2_ = -1; + p3_ = -1; + sql_plan_line_id_ = -1; + group_id_ = 0; + time_model_ = 0; + module_[0] = '\0'; + action_[0] = '\0'; + client_id_[0] = '\0'; + backtrace_[0] = '\0'; + plan_id_ = 0; + program_[0] = '\0'; + tm_delta_time_ = -1; + tm_delta_cpu_time_ = -1; + tm_delta_db_time_ = -1; + plan_hash_ = 0; + thread_id_ = -1; + stmt_type_ = -1; + tablet_id_ = -1; + blocking_session_id_ = -1; + proxy_sid_ = 0; + }; + TO_STRING_KV(K_(svr_ip), K_(svr_port), K_(sample_id), K_(session_id), K_(sample_time), - K_(user_id), K_(session_type), K_(sql_id), K_(trace_id), K_(event_no), K_(time_waited), - K_(p1), K_(p2), K_(p3), K_(sql_plan_line_id), K_(time_model), K_(module), K_(action), - K_(client_id), K_(plan_id)); + K_(user_id), K_(session_type), K_(sql_id), K_(trace_id), K_(event_no), K_(event_id), + K_(time_waited), K_(p1), K_(p2), K_(p3), K_(sql_plan_line_id), K_(group_id), K_(time_model), + K_(module), K_(action), K_(client_id), K_(plan_id), K_(top_level_sql_id), + K_(plsql_entry_object_id), K_(plsql_entry_subprogram_id), K_(plsql_entry_subprogram_name), + K_(plsql_object_id), K_(plsql_subprogram_id), K_(plsql_subprogram_name), K_(plan_hash), + K_(thread_id), K_(stmt_type), K_(tablet_id), K_(blocking_session_id), K_(proxy_sid)); char svr_ip_[OB_IP_STR_BUFF]; int64_t svr_port_; int64_t sample_id_; @@ -46,17 +111,289 @@ public: char sql_id_[OB_MAX_SQL_ID_LENGTH + 1]; // + 1 for '/0' char trace_id_[OB_MAX_TRACE_ID_BUFFER_SIZE + 1]; int64_t event_no_; + int64_t event_id_; int64_t time_waited_; int64_t p1_; int64_t p2_; int64_t p3_; int64_t sql_plan_line_id_; + int64_t group_id_; uint64_t time_model_; + char module_[ASH_MODULE_STR_LEN + 1]; + char action_[ASH_ACTION_STR_LEN + 1]; + char client_id_[ASH_CLIENT_ID_STR_LEN + 1]; + char backtrace_[ASH_BACKTRACE_STR_LEN + 1]; + int64_t plan_id_; + char program_[ASH_PROGRAM_STR_LEN + 1]; + int64_t tm_delta_time_; + int64_t tm_delta_cpu_time_; + int64_t tm_delta_db_time_; + char top_level_sql_id_[OB_MAX_SQL_ID_LENGTH + 1]; // + 1 for '/0' + int64_t plsql_entry_object_id_; + int64_t plsql_entry_subprogram_id_; + char plsql_entry_subprogram_name_[common::OB_MAX_ASH_PL_NAME_LENGTH + 1]; + int64_t plsql_object_id_; + int64_t plsql_subprogram_id_; + char plsql_subprogram_name_[common::OB_MAX_ASH_PL_NAME_LENGTH + 1]; + uint64_t plan_hash_; + int64_t thread_id_; + int64_t stmt_type_; + int64_t tablet_id_; + int64_t blocking_session_id_; + int64_t proxy_sid_; +}; + + +struct ObWrSqlStat +{ +public: + ObWrSqlStat() { + svr_ip_[0] = '\0'; + svr_port_ = 0; + sql_id_[0] = '\0'; + plan_hash_ = 0; + plan_id_ = 0; + plan_type_ = 0; + module_[0] = '\0'; + action_[0] = '\0'; + parsing_db_id_ = 0; + parsing_db_name_[0] = '\0'; + parsing_user_id_ = 0; + executions_total_ = 0; + executions_delta_ = 0; + disk_reads_total_ = 0; + disk_reads_delta_ = 0; + buffer_gets_total_ = 0; + buffer_gets_delta_ = 0; + elapsed_time_total_ = 0; + elapsed_time_delta_ = 0; + cpu_time_total_ = 0; + cpu_time_delta_ = 0; + ccwait_total_ = 0; + ccwait_delta_ = 0; + userio_wait_total_ = 0; + userio_wait_delta_ = 0; + apwait_total_ = 0; + apwait_delta_ = 0; + physical_read_requests_total_ = 0; + physical_read_requests_delta_ = 0; + physical_read_bytes_total_ = 0; + physical_read_bytes_delta_ = 0; + write_throttle_total_ = 0; + write_throttle_delta_ = 0; + rows_processed_total_ = 0; + rows_processed_delta_ = 0; + memstore_read_rows_total_ = 0; + memstore_read_rows_delta_ = 0; + minor_ssstore_read_rows_total_ = 0; + minor_ssstore_read_rows_delta_ = 0; + major_ssstore_read_rows_total_ = 0; + major_ssstore_read_rows_delta_ = 0; + rpc_total_ = 0; + rpc_delta_ = 0; + fetches_total_ = 0; + fetches_delta_ = 0; + retry_total_ = 0; + retry_delta_ = 0; + partition_total_ = 0; + partition_delta_ = 0; + nested_sql_total_ = 0; + nested_sql_delta_ = 0; + source_ip_[0] = '\0'; + source_ip_[46] = '\0'; + source_port_ = 0; + route_miss_total_ = 0; + route_miss_delta_ = 0; + first_load_time_ = 0; + plan_cache_hit_total_ = 0; + plan_cache_hit_delta_ = 0; + }; + + TO_STRING_KV(K_(svr_ip), K_(svr_port), K_(sql_id), K_(plan_hash), K_(plan_id)); + char svr_ip_[OB_IP_STR_BUFF]; + int64_t svr_port_; + char sql_id_[OB_MAX_SQL_ID_LENGTH + 1]; // + 1 for '/0' + uint64_t plan_hash_; + int64_t plan_id_; + int64_t plan_type_; char module_[64 + 1]; char action_[64 + 1]; - char client_id_[64 + 1]; - char backtrace_[512 + 1]; + int64_t parsing_db_id_; + char parsing_db_name_[OB_MAX_DATABASE_NAME_LENGTH+1]; + int64_t parsing_user_id_; + int64_t executions_total_; + int64_t executions_delta_; + int64_t disk_reads_total_; + int64_t disk_reads_delta_; + int64_t buffer_gets_total_; + int64_t buffer_gets_delta_; + int64_t elapsed_time_total_; + int64_t elapsed_time_delta_; + int64_t cpu_time_total_; + int64_t cpu_time_delta_; + int64_t ccwait_total_; + int64_t ccwait_delta_; + int64_t userio_wait_total_; + int64_t userio_wait_delta_; + int64_t apwait_total_; + int64_t apwait_delta_; + int64_t physical_read_requests_total_; + int64_t physical_read_requests_delta_; + int64_t physical_read_bytes_total_; + int64_t physical_read_bytes_delta_; + int64_t write_throttle_total_; + int64_t write_throttle_delta_; + int64_t rows_processed_total_; + int64_t rows_processed_delta_; + int64_t memstore_read_rows_total_; + int64_t memstore_read_rows_delta_; + int64_t minor_ssstore_read_rows_total_; + int64_t minor_ssstore_read_rows_delta_; + int64_t major_ssstore_read_rows_total_; + int64_t major_ssstore_read_rows_delta_; + int64_t rpc_total_; + int64_t rpc_delta_; + int64_t fetches_total_; + int64_t fetches_delta_; + int64_t retry_total_; + int64_t retry_delta_; + int64_t partition_total_; + int64_t partition_delta_; + int64_t nested_sql_total_; + int64_t nested_sql_delta_; + char source_ip_[46+1]; + int64_t source_port_; + int64_t route_miss_total_; + int64_t route_miss_delta_; + int64_t first_load_time_; + int64_t plan_cache_hit_total_; + int64_t plan_cache_hit_delta_; +}; + + +struct ObWrSqlText +{ +public: + ObWrSqlText() { + sql_id_[0] = '\0'; + sql_id_[OB_MAX_SQL_ID_LENGTH] = '\0'; + query_sql_[0] = '\0'; + query_sql_[1024] = '\0'; + sql_type_ = 0; + } + TO_STRING_KV(K_(sql_type), K_(sql_id)); + char sql_id_[OB_MAX_SQL_ID_LENGTH + 1]; // + 1 for '/0' + char query_sql_[1024+1]; + int64_t sql_type_; +}; + +struct ObWrSqlPlan +{ +public: + ObWrSqlPlan() { + svr_ip_[0] = '\0'; + svr_ip_[OB_IP_STR_BUFF] = '\0'; + svr_port_ = 0; + sql_id_[0] = '\0'; + sql_id_[OB_MAX_SQL_ID_LENGTH] = '\0'; + plan_hash_ = 0; + plan_id_ = 0; + id_ = 0; + db_id_ = 0; + gmt_create_= 0; + operator_[0] = '\0'; + operator_[255] = '\0'; + option_[0] = '\0'; + option_[255] = '\0'; + object_node_[0] = '\0'; + object_node_[40] = '\0'; + object_id_ = 0; + object_owner_[0] = '\0'; + object_owner_[128] = '\0'; + object_name_[0] = '\0'; + object_name_[128] = '\0'; + object_alias_[0] = '\0'; + object_alias_[261] = '\0'; + object_type_[0] = '\0'; + object_type_[20] = '\0'; + optimizer_[0] = '\0'; + optimizer_[4000] = '\0'; + parent_id_ = 0; + depth_ = 0; + position_ = 0; + is_last_child_ = 0; + cost_ = 0; + real_cost_ = 0; + cardinality_ = 0; + real_cardinality_ = 0; + bytes_ = 0; + rowset_ = 0; + other_tag_[0] = '\0'; + other_tag_[4000] = '\0'; + partition_start_[0] = '\0'; + partition_start_[4000] = '\0'; + other_[0] = '\0'; + other_[4000] = '\0'; + cpu_cost_ = 0; + io_cost_ = 0; + access_predicates_[0] = '\0'; + access_predicates_[4000] = '\0'; + filter_predicates_[0] = '\0'; + filter_predicates_[4000] = '\0'; + startup_predicates_[0] = '\0'; + startup_predicates_[4000] = '\0'; + projection_[0] = '\0'; + projection_[4000] = '\0'; + special_predicates_[0] = '\0'; + special_predicates_[4000] = '\0'; + qblock_name_[0] = '\0'; + qblock_name_[128] = '\0'; + remarks_[0] = '\0'; + remarks_[4000] = '\0'; + other_xml_[0] = '\0'; + other_xml_[4000] = '\0'; + } + TO_STRING_KV(K_(sql_id), K_(plan_id), K_(id)); + char svr_ip_[OB_IP_STR_BUFF+1]; + int64_t svr_port_; + char sql_id_[OB_MAX_SQL_ID_LENGTH + 1]; // + 1 for '/0' + uint64_t plan_hash_; int64_t plan_id_; + int64_t id_; + int64_t db_id_; + int64_t gmt_create_; + char operator_[255 + 1]; + char option_[255+1]; + char object_node_[40 + 1]; + int64_t object_id_; + char object_owner_[128+1]; + char object_name_[128+1]; + char object_alias_[261+1]; + char object_type_[20+1]; + char optimizer_[4000 + 1]; + int64_t parent_id_; + int64_t depth_; + int64_t position_; + int64_t is_last_child_; + int64_t cost_; + int64_t real_cost_; + int64_t cardinality_; + int64_t real_cardinality_; + int64_t bytes_; + int64_t rowset_; + char other_tag_[4000 + 1]; + char partition_start_[4000+1]; + char other_[4000+1]; + int64_t cpu_cost_; + int64_t io_cost_; + char access_predicates_[4000 + 1]; + char filter_predicates_[4000 + 1]; + char startup_predicates_[4000 + 1]; + char projection_[4000 + 1]; + char special_predicates_[4000 + 1]; + char qblock_name_[128 + 1]; + char remarks_[4000 + 1]; + char other_xml_[4000 + 1]; }; class ObWrCollector @@ -66,18 +403,37 @@ public: int64_t snapshot_timeout_ts); ~ObWrCollector() = default; DISABLE_COPY_ASSIGN(ObWrCollector); + int init(); int collect(); + int collect_ash(); + static int exec_read_sql_with_retry(common::ObCommonSqlProxy::ReadResult &res, const uint64_t tenant_id, const char *sql); + static int exec_write_sql_with_retry(const uint64_t tenant_id, const char *sql, int64_t &affected_rows); + template + static int exec_sql_with_retry(const uint64_t tenant_id, const char * sql, T function); + TO_STRING_KV(K_(snap_id), K_(snapshot_begin_time), K_(snapshot_end_time), K_(timeout_ts)); private: int collect_sysstat(); - int collect_ash(); int collect_statname(); - int write_to_wr(ObDMLSqlSplicer &dml_splicer, const char *table_name, int64_t tenant_id); + int collect_eventname(); + int collect_system_event(); + int collect_sqlstat(); + int update_sqlstat(); + int collect_sqltext(); + int collect_sql_plan(); + int write_to_wr(ObDMLSqlSplicer &dml_splicer, const char *table_name, int64_t tenant_id, bool ignore_error=false); + int fetch_snapshot_id_sequence_curval(int64_t &snap_id); + int get_cur_snapshot_id_for_ahead_snapshot(int64_t &snap_id); + int get_begin_interval_time(int64_t &begin_interval_time); + int update_last_snapshot_end_time(); + static bool is_can_retry(const int err); + int64_t snap_id_; int64_t snapshot_begin_time_; int64_t snapshot_end_time_; int64_t timeout_ts_; + bool snapshot_ahead_; }; class ObWrDeleter @@ -105,6 +461,15 @@ private: const ObWrPurgeSnapshotArg &purge_arg_; }; +typedef common::hash::ObHashMap TmpSqlStatMap; +struct ObUpdateSqlStatOp +{ +public: + ObUpdateSqlStatOp() {} + void reset() {} + int operator()(common::hash::HashMapPair &entry); +}; + } // namespace share } // namespace oceanbase #endif // OCEANBASE_WR_OB_WORKLOAD_REPOSITORY_COLLECTOR_H_ diff --git a/src/share/wr/ob_wr_service.cpp b/src/share/wr/ob_wr_service.cpp index 6a8be8e08e..2a8b7f54d0 100644 --- a/src/share/wr/ob_wr_service.cpp +++ b/src/share/wr/ob_wr_service.cpp @@ -25,6 +25,32 @@ namespace oceanbase namespace share { +int ObWorkloadRepositoryContext::mtl_init(ObWorkloadRepositoryContext* &ptr) +{ + ptr->is_inited_ = true; + return OB_SUCCESS; +} + +void ObWorkloadRepositoryContext::destroy() +{ + is_inited_ = false; +} + +int ObWorkloadRepositoryContext::try_lock() +{ + return mutex_.trylock(); +} + +int ObWorkloadRepositoryContext::lock(const int64_t abs_timeout_us) +{ + return mutex_.lock(abs_timeout_us); +} + +void ObWorkloadRepositoryContext::release_lock() +{ + mutex_.unlock(); +} + ObWorkloadRepositoryService::ObWorkloadRepositoryService() : is_inited_(false), wr_timer_task_() {} @@ -157,14 +183,14 @@ int ObWorkloadRepositoryService::cancel_current_task() return ret; } -int ObWorkloadRepositoryService::schedule_new_task(const int64_t interval) +int ObWorkloadRepositoryService::schedule_new_task(const int64_t interval_us) { int ret = OB_SUCCESS; if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("wr service not init", K(ret)); - } else if (OB_FAIL(wr_timer_task_.schedule_one_task(interval))) { - LOG_WARN("failed to schedule a new task of wr timer thread", K(ret), K(interval)); + } else if (OB_FAIL(wr_timer_task_.schedule_one_task(interval_us))) { + LOG_WARN("failed to schedule a new task of wr timer thread", K(ret), K(interval_us)); } return ret; } diff --git a/src/share/wr/ob_wr_service.h b/src/share/wr/ob_wr_service.h index 1368263759..d3efc1ab65 100644 --- a/src/share/wr/ob_wr_service.h +++ b/src/share/wr/ob_wr_service.h @@ -21,6 +21,19 @@ namespace oceanbase namespace share { +class ObWorkloadRepositoryContext { +public: + ObWorkloadRepositoryContext(): is_inited_(false), mutex_() {} + static int mtl_init(ObWorkloadRepositoryContext* &ptr); + void destroy(); + int try_lock(); + int lock(const int64_t abs_timeout_us = INT64_MAX); + void release_lock(); +private: + bool is_inited_; + lib::ObMutex mutex_; +}; + class ObWorkloadRepositoryService : public logservice::ObIReplaySubHandler, public logservice::ObIRoleChangeSubHandler, public logservice::ObICheckpointSubHandler @@ -45,7 +58,8 @@ public: int cancel_current_task(); int schedule_new_task(const int64_t interval); bool is_running_task() const {return wr_timer_task_.is_running_task();}; - int64_t get_snapshot_interval() const {return wr_timer_task_.get_snapshot_interval();}; + int64_t get_snapshot_interval(bool is_laze_load = true) {return wr_timer_task_.get_snapshot_interval(is_laze_load);}; + // when is_lazy_load is false, the func will send inner SQL, avoid frequently calling WorkloadRepositoryTask& get_wr_timer_task() {return wr_timer_task_;}; INHERIT_TO_STRING_KV("ObIRoleChangeSubHandler", ObIRoleChangeSubHandler, K_(is_inited), diff --git a/src/share/wr/ob_wr_snapshot_rpc_processor.cpp b/src/share/wr/ob_wr_snapshot_rpc_processor.cpp index 709531affe..ea5e31b512 100644 --- a/src/share/wr/ob_wr_snapshot_rpc_processor.cpp +++ b/src/share/wr/ob_wr_snapshot_rpc_processor.cpp @@ -142,42 +142,115 @@ int ObWrAsyncSnapshotTaskP::process() ObWrSnapshotArg &arg = ObWrAsyncSnapshotTaskP::arg_; LOG_DEBUG("wr snapshot task", K(MTL_ID()), K(arg)); // gather inner table data - if (WrTaskType::TAKE_SNAPSHOT == arg.get_task_type()) { + bool tenant_need_upgrade = false; + if (OB_FAIL(TENANT_NEED_UPGRADE(MTL_ID(), tenant_need_upgrade))) { + LOG_WARN("failed to get tenant_need_upgrade", K(ret), K(MTL_ID())); + } else if (GCONF.in_upgrade_mode() || tenant_need_upgrade) { + ret = OB_OP_NOT_ALLOW; + LOG_WARN("in upgrade, can not do wr snapshot", KR(ret)); + } else if (WrTaskType::TAKE_SNAPSHOT == arg.get_task_type()) { ObWrSnapshotStatus status; ObWrCreateSnapshotArg &snapshot_arg = static_cast(arg); int64_t origin_worker_timeout = THIS_WORKER.get_timeout_ts(); THIS_WORKER.set_timeout_ts(snapshot_arg.get_timeout_ts()); - ObWrCollector collector(snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_begin_time(), - snapshot_arg.get_snapshot_end_time(), snapshot_arg.get_timeout_ts()); - if (OB_UNLIKELY(MTL_ID() != snapshot_arg.get_tenant_id())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("wr snapshot task tenant_id mismatch!", K(MTL_ID()), K(snapshot_arg)); - } else if (OB_FAIL(collector.collect())) { - LOG_WARN("failed to collect wr data", K(ret), K(snapshot_arg), K(MTL_ID())); - } - // update snapshot info - if (OB_FAIL(ret)) { - status = ObWrSnapshotStatus::FAILED; + + // gurantee one snapshot task processing + bool exit = true; + if (snapshot_arg.get_snap_id() == LAST_SNAPSHOT_RECORD_SNAP_ID || snapshot_arg.get_task_type() == WrTaskType::USER_SNAPSHOT) { + if (OB_FAIL(MTL(ObWorkloadRepositoryContext*)->try_lock())) { + if (snapshot_arg.get_snap_id() == LAST_SNAPSHOT_RECORD_SNAP_ID) { + LOG_WARN("snapshot ahead request failed to lock", K(arg)); + } else { + LOG_WARN("manual snapshot request failed to lock", K(arg)); + status = ObWrSnapshotStatus::FAILED; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(WorkloadRepositoryTask::modify_tenant_snapshot_status_and_startup_time( + snapshot_arg.get_snap_id(), snapshot_arg.get_tenant_id(), GCONF.cluster_id, + GCONF.self_addr_, GCTX.start_service_time_, status))) { + LOG_WARN("failed to modify snapshot info", KR(tmp_ret), K(snapshot_arg), K(status)); + } else if (is_sys_tenant(snapshot_arg.get_tenant_id())) { + if (OB_TMP_FAIL(WorkloadRepositoryTask::update_snap_info_in_wr_control(snapshot_arg.get_tenant_id(), + snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_end_time()))) { + LOG_WARN("failed to update wr control info", KR(tmp_ret), K(snapshot_arg)); + } + } + } + } else { + exit = false; + } } else { - status = ObWrSnapshotStatus::SUCCESS; - } - int tmp_ret = OB_SUCCESS; - if (OB_TMP_FAIL(WorkloadRepositoryTask::modify_tenant_snapshot_status_and_startup_time( - snapshot_arg.get_snap_id(), snapshot_arg.get_tenant_id(), GCONF.cluster_id, - GCONF.self_addr_, GCTX.start_service_time_, status))) { - LOG_WARN("failed to modify snapshot info", KR(tmp_ret), K(snapshot_arg), K(status)); - } else if (is_sys_tenant(snapshot_arg.get_tenant_id())) { - if (OB_TMP_FAIL(WorkloadRepositoryTask::update_snap_info_in_wr_control(snapshot_arg.get_tenant_id(), - snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_end_time()))) { - LOG_WARN("failed to update wr control info", KR(tmp_ret), K(snapshot_arg)); + // scheduled task must be processed + if (OB_FAIL(MTL(ObWorkloadRepositoryContext*)->lock(snapshot_arg.get_timeout_ts() - common::ObTimeUtility::current_time()))) { + LOG_WARN("scheduled aysnc snapshot task failed", K(MTL_ID()), K(snapshot_arg), K(common::ObTimeUtility::current_time())); + status = ObWrSnapshotStatus::FAILED; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(WorkloadRepositoryTask::modify_tenant_snapshot_status_and_startup_time( + snapshot_arg.get_snap_id(), snapshot_arg.get_tenant_id(), GCONF.cluster_id, + GCONF.self_addr_, GCTX.start_service_time_, status))) { + LOG_WARN("failed to modify snapshot info", KR(tmp_ret), K(snapshot_arg), K(status)); + } else if (is_sys_tenant(snapshot_arg.get_tenant_id())) { + if (OB_TMP_FAIL(WorkloadRepositoryTask::update_snap_info_in_wr_control(snapshot_arg.get_tenant_id(), + snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_end_time()))) { + LOG_WARN("failed to update wr control info", KR(tmp_ret), K(snapshot_arg)); + } + } + } else { + exit = false; } } - ret = COVER_SUCC(tmp_ret); + + if (!exit) { + // hold the lock + ObWrCollector collector(snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_begin_time(), + snapshot_arg.get_snapshot_end_time(), snapshot_arg.get_timeout_ts()); + if (OB_UNLIKELY(MTL_ID() != snapshot_arg.get_tenant_id())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("wr snapshot task tenant_id mismatch!", K(MTL_ID()), K(snapshot_arg)); + } else if (OB_FAIL(collector.init())) { + LOG_WARN("failed to init wr collector", K(ret)); + } else if (snapshot_arg.get_snap_id() == LAST_SNAPSHOT_RECORD_SNAP_ID) { // snapshot ahead + if (OB_FAIL(collector.collect_ash())) { + LOG_WARN("failed to take wr snapshot ahead", K(ret), K(snapshot_arg), K(MTL_ID())); + } + } else if (OB_FAIL(collector.collect())) { // scheduled snapshot + LOG_WARN("failed to collect wr data", K(ret), K(snapshot_arg), K(MTL_ID())); + } + // update scheduled snapshot info + if (snapshot_arg.get_snap_id() != LAST_SNAPSHOT_RECORD_SNAP_ID) { + if (OB_FAIL(ret)) { + status = ObWrSnapshotStatus::FAILED; + } else { + status = ObWrSnapshotStatus::SUCCESS; + } + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(WorkloadRepositoryTask::modify_tenant_snapshot_status_and_startup_time( + snapshot_arg.get_snap_id(), snapshot_arg.get_tenant_id(), GCONF.cluster_id, + GCONF.self_addr_, GCTX.start_service_time_, status))) { + LOG_WARN("failed to modify snapshot info", KR(tmp_ret), K(snapshot_arg), K(status)); + } else if (is_sys_tenant(snapshot_arg.get_tenant_id())) { + if (OB_TMP_FAIL(WorkloadRepositoryTask::update_snap_info_in_wr_control(snapshot_arg.get_tenant_id(), + snapshot_arg.get_snap_id(), snapshot_arg.get_snapshot_end_time()))) { + LOG_WARN("failed to update wr control info", KR(tmp_ret), K(snapshot_arg)); + } + } + ret = COVER_SUCC(tmp_ret); + } + MTL(ObWorkloadRepositoryContext*)->release_lock(); + } THIS_WORKER.set_timeout_ts(origin_worker_timeout); + + if (OB_FAIL(ret) && LAST_SNAPSHOT_RECORD_SNAP_ID != snapshot_arg.get_snap_id()) { +#ifdef ENABLE_DEBUG_LOG + LOG_ERROR("failed to collect wr data", K(ret), K(MTL_ID()), K(arg)); +#else + LOG_WARN("failed to collect wr data", K(ret), K(MTL_ID()), K(arg)); +#endif + } } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("wrong op type", KR(ret), K(arg.get_task_type())); } + return ret; } int ObWrAsyncPurgeSnapshotTaskP::process() @@ -187,7 +260,13 @@ int ObWrAsyncPurgeSnapshotTaskP::process() ObWrSnapshotArg &arg = ObWrAsyncPurgeSnapshotTaskP::arg_; LOG_DEBUG("wr snapshot task", K(MTL_ID()), K(arg)); // gather inner table data - if (WrTaskType::PURGE == arg.get_task_type()) { + bool tenant_need_upgrade = false; + if (OB_FAIL(TENANT_NEED_UPGRADE(MTL_ID(), tenant_need_upgrade))) { + LOG_WARN("failed to get tenant_need_upgrade", K(ret), K(MTL_ID())); + } else if (GCONF.in_upgrade_mode() || tenant_need_upgrade) { + ret = OB_OP_NOT_ALLOW; + LOG_WARN("in upgrade, can not do wr snapshot", KR(ret)); + } else if (WrTaskType::PURGE == arg.get_task_type()) { ObWrSnapshotStatus status; ObWrPurgeSnapshotArg &purge_arg = static_cast(arg); int64_t origin_worker_timeout = THIS_WORKER.get_timeout_ts(); @@ -214,12 +293,14 @@ int ObWrSyncUserSubmitSnapshotTaskP::process() WR_STAT_GUARD(WR_SNAPSHOT); ObWrSnapshotArg &arg = ObWrSyncUserSubmitSnapshotTaskP::arg_; ObWrUserSubmitSnapResp &resp = ObWrSyncUserSubmitSnapshotTaskP::result_; - LOG_DEBUG("user submit a wr take snapshot task", K(MTL_ID()), K(arg)); + bool tenant_need_upgrade = false; if (OB_ISNULL(GCTX.wr_service_) || OB_ISNULL(GCTX.net_frame_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN( "wr service or net frame is nullptr", K(ret), K(GCTX.net_frame_), K(GCTX.wr_service_)); - } else if (GCONF.in_upgrade_mode()) { + } else if (OB_FAIL(TENANT_NEED_UPGRADE(MTL_ID(), tenant_need_upgrade))) { + LOG_WARN("failed to get tenant_need_upgrade", K(ret), K(MTL_ID())); + } else if (GCONF.in_upgrade_mode() || tenant_need_upgrade) { ret = OB_OP_NOT_ALLOW; LOG_WARN("in upgrade, can not do wr snapshot", KR(ret)); } else if (GCTX.wr_service_->is_running_task()) { @@ -234,7 +315,7 @@ int ObWrSyncUserSubmitSnapshotTaskP::process() obrpc::ObWrRpcProxy wr_proxy; int64_t timeout_ts = user_submit_arg.get_timeout_ts(); int64_t next_wr_task_ts = common::ObTimeUtility::current_time() + - GCTX.wr_service_->get_snapshot_interval() * 60 * 1000L * 1000L; + GCTX.wr_service_->get_snapshot_interval(false/*is_laze_load*/) * 60 * 1000L * 1000L; if (OB_FAIL(WorkloadRepositoryTask::check_all_tenant_last_snapshot_task_finished( is_all_finished))) { LOG_WARN("failed to check all tenants` last snapshot status", K(ret), K(is_all_finished)); @@ -267,13 +348,13 @@ int ObWrSyncUserSubmitSnapshotTaskP::schedule_next_wr_task(int64_t next_wr_task_ { int ret = OB_SUCCESS; // dispatch next wr snapshot task(not repeat). - int64_t interval = next_wr_task_ts - common::ObTimeUtility::current_time(); - if (OB_UNLIKELY(interval < 0)) { - LOG_WARN("already timeout wr snapshot interval", K(next_wr_task_ts), K(interval), - K(GCTX.wr_service_->get_snapshot_interval())); - interval = 0; + int64_t interval_us = next_wr_task_ts - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(interval_us < 0)) { + LOG_WARN("already timeout wr snapshot interval", K(next_wr_task_ts), K(interval_us), + K(GCTX.wr_service_->get_snapshot_interval(false/*is_laze_load*/))); + interval_us = 0; } - if (OB_FAIL(GCTX.wr_service_->schedule_new_task(interval))) { + if (OB_FAIL(GCTX.wr_service_->schedule_new_task(interval_us))) { LOG_WARN("failed to schedule new wr snapshot task", K(ret)); } return ret; @@ -283,6 +364,7 @@ const char *RETENTION_NUM_COLUMN_NAME = "retention_num"; const char *RETENTION_COLUMN_NAME = "retention"; const char *INTERVAL_NUM_COLUMN_NAME = "snapint_num"; const char *INTERVAL_COLUMN_NAME = "snap_interval"; +const char *TOPN_SQL_COLUMN_NAME = "topnsql"; int ObWrSyncUserModifySettingsTaskP::process() { @@ -290,9 +372,15 @@ int ObWrSyncUserModifySettingsTaskP::process() int64_t tmp_interval = 0; ObWrUserModifySettingsArg &arg = ObWrSyncUserModifySettingsTaskP::arg_; LOG_DEBUG("user submit modify snapshot settings task", K(MTL_ID()), K(arg)); + bool tenant_need_upgrade = false; if (OB_ISNULL(GCTX.wr_service_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("wr service is nullptr", K(ret),K(GCTX.wr_service_)); + } else if (OB_FAIL(TENANT_NEED_UPGRADE(MTL_ID(), tenant_need_upgrade))) { + LOG_WARN("failed to get tenant_need_upgrade", K(ret), K(MTL_ID())); + } else if (GCONF.in_upgrade_mode() || tenant_need_upgrade) { + ret = OB_OP_NOT_ALLOW; + LOG_WARN("in upgrade, can not do wr snapshot", KR(ret)); } else if (OB_FAIL(WorkloadRepositoryTask::fetch_interval_num_from_wr_control(tmp_interval))) { LOG_WARN("failed to fetch interval num from wr control", K(ret)); } else if (WrTaskType::USER_MODIFY_SETTINGS == arg.get_task_type()) { @@ -316,12 +404,33 @@ int ObWrSyncUserModifySettingsTaskP::process() LOG_WARN("failed to take snapshot", K(ret)); } } + + if (OB_SUCC(ret)) { + if (-1 == arg.get_topnsql()) { + // keep the value of topnsql , do nothing + } else { + ObSqlString sql; + int64_t affected_rows = 0; + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); + } else if (OB_FAIL(sql.assign_fmt("update /*+ WORKLOAD_REPOSITORY */ %s set %s=%ld " + "where tenant_id=%ld", + OB_WR_CONTROL_TNAME, TOPN_SQL_COLUMN_NAME, arg.get_topnsql(), arg.get_tenant_id()))) { + LOG_WARN("failed to format update snapshot info sql", KR(ret)); + } else if (OB_FAIL( + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(arg.get_tenant_id()), sql.ptr(), affected_rows))) { + LOG_WARN("failed to write snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id( arg.get_tenant_id()))); + } else if (affected_rows != 1) { + LOG_TRACE("affected rows is not 1", KR(ret), K(affected_rows), K(sql)); + } + } + } } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("error type of task", K(ret), K(GCTX.net_frame_), K(GCTX.wr_service_)); } return ret; } - } // end of namespace share } // end of namespace oceanbase diff --git a/src/share/wr/ob_wr_snapshot_rpc_processor.h b/src/share/wr/ob_wr_snapshot_rpc_processor.h index 8858095e0d..e144a1ba1d 100644 --- a/src/share/wr/ob_wr_snapshot_rpc_processor.h +++ b/src/share/wr/ob_wr_snapshot_rpc_processor.h @@ -210,12 +210,12 @@ class ObWrUserModifySettingsArg : public ObWrSnapshotArg { OB_UNIS_VERSION(1); public: - explicit ObWrUserModifySettingsArg(int64_t tenant_id, int64_t retention, int64_t interval) + explicit ObWrUserModifySettingsArg(int64_t tenant_id, int64_t retention, int64_t interval, int64_t topnsql) : ObWrSnapshotArg(WrTaskType::USER_MODIFY_SETTINGS), tenant_id_(tenant_id), retention_(retention), interval_(interval), - topnsql_(0) + topnsql_(topnsql) {} ObWrUserModifySettingsArg() : ObWrSnapshotArg(WrTaskType::USER_MODIFY_SETTINGS), @@ -237,13 +237,17 @@ public: { return interval_; } + inline int64_t get_topnsql() const + { + return topnsql_; + } int assign(const ObWrUserModifySettingsArg &other) { int ret = common::OB_SUCCESS; tenant_id_ = other.tenant_id_; retention_ = other.retention_; interval_ = other.interval_; - topnsql_ = topnsql_; + topnsql_ = other.topnsql_; if (OB_FAIL(ObWrSnapshotArg::assign(other))) { SHARE_LOG(WARN, "fail to assign wr snapshot arg", KR(ret)); } else { /*do nothing*/ diff --git a/src/share/wr/ob_wr_stat_guard.h b/src/share/wr/ob_wr_stat_guard.h index 267cdc9f32..74f3dbe584 100644 --- a/src/share/wr/ob_wr_stat_guard.h +++ b/src/share/wr/ob_wr_stat_guard.h @@ -14,6 +14,7 @@ #define OCEANBASE_WR_OB_WR_STAT_GUARD_H_ #include "lib/statistic_event/ob_stat_event.h" #include "lib/time/ob_time_utility.h" +#include "lib/stat/ob_diagnostic_info.h" namespace oceanbase { @@ -23,7 +24,7 @@ namespace share #define WR_STAT_GUARD(STAT_PREFIX) \ WrStatGuard<::oceanbase::common::ObStatEventIds::STAT_PREFIX##_ELAPSE_TIME, \ ::oceanbase::common::ObStatEventIds::STAT_PREFIX##_CPU_TIME> \ - guard; + wr_stat_guard; template @@ -39,11 +40,11 @@ public: { int64_t elapse_time = ::oceanbase::common::ObTimeUtility::current_time() - begin_ts_; int64_t cpu_time = get_ru_utime() - begin_ru_cputime_; - oceanbase::common::ObDiagnoseTenantInfo *tenant_info = - oceanbase::common::ObDiagnoseTenantInfo::get_local_diagnose_info(); + oceanbase::common::ObDiagnosticInfo *tenant_info = + oceanbase::common::ObLocalDiagnosticInfo::get(); if (NULL != tenant_info) { - tenant_info->update_stat(elapse_time_id, elapse_time); - tenant_info->update_stat(cpu_time_id, cpu_time); + tenant_info->add_stat(elapse_time_id, elapse_time); + tenant_info->add_stat(cpu_time_id, cpu_time); } } diff --git a/src/share/wr/ob_wr_task.cpp b/src/share/wr/ob_wr_task.cpp index 1e97006398..a2bd659956 100644 --- a/src/share/wr/ob_wr_task.cpp +++ b/src/share/wr/ob_wr_task.cpp @@ -29,6 +29,7 @@ #include "share/wr/ob_wr_stat_guard.h" #include "share/location_cache/ob_location_service.h" #include "lib/utility/ob_tracepoint.h" +#include "ob_wr_collector.h" using namespace oceanbase::common::sqlclient; @@ -41,20 +42,41 @@ namespace share WorkloadRepositoryTask::WorkloadRepositoryTask() : wr_proxy_(), - snapshot_interval_(DEFAULT_SNAPSHOT_INTERVAL), tg_id_(-1), timeout_ts_(0), is_running_task_(false), - is_inited_(false) + is_inited_(false), + lazy_snapshot_interval_min_(DEFAULT_SNAPSHOT_INTERVAL) {} -int WorkloadRepositoryTask::schedule_one_task(int64_t interval) -{ - if (interval == 0) { - // default interval is configed by snapshot_interval_ - interval = snapshot_interval_ * 60 * 1000L * 1000L; + +int64_t WorkloadRepositoryTask::get_snapshot_interval(bool is_laze_load /* = true*/) { + int64_t interval = 0; + if (is_laze_load) { + interval = lazy_snapshot_interval_min_; + } else { + int tmp_ret = OB_SUCCESS; + int64_t tmp_interval_s = 0; + if (OB_TMP_FAIL(fetch_interval_num_from_wr_control(tmp_interval_s))) { + interval = DEFAULT_SNAPSHOT_INTERVAL; + LOG_INFO("failed to fetch interval num from wr control", K(tmp_ret)); + } else if (tmp_interval_s == 0) { + interval = DEFAULT_SNAPSHOT_INTERVAL; + } else { + interval = tmp_interval_s / 60; + } + lazy_snapshot_interval_min_ = interval; } - return TG_SCHEDULE(tg_id_, *this, interval, false /*not repeat*/); + return interval; +} + +int WorkloadRepositoryTask::schedule_one_task(int64_t interval_us) +{ + if (interval_us == 0) { + // default interval is configed by get_snapshot_interval() + interval_us = get_snapshot_interval(false/*is_laze_load*/) * 60 * 1000L * 1000L; + } + return TG_SCHEDULE(tg_id_, *this, interval_us, false /*not repeat*/); } int WorkloadRepositoryTask::modify_snapshot_interval(int64_t minutes) @@ -64,7 +86,6 @@ int WorkloadRepositoryTask::modify_snapshot_interval(int64_t minutes) ret = OB_ERR_UNEXPECTED; LOG_WARN("sanpshot interval below 10 minutes is not allowed.", KR(ret), K(minutes)); } else if (FALSE_IT(cancel_current_task())) { - } else if (FALSE_IT(snapshot_interval_ = minutes)) { } else if (OB_FAIL(schedule_one_task())) { LOG_WARN("failed to schedule wr snapshot task after modify snapshot interval", K(ret)); } @@ -147,7 +168,7 @@ void WorkloadRepositoryTask::runTimerTask() is_running_task_ = true; // current snapshot task must stop when next task is time to schedule. - timeout_ts_ = common::ObTimeUtility::current_time() + snapshot_interval_ * 60 * 1000L * 1000L; + timeout_ts_ = common::ObTimeUtility::current_time() + get_snapshot_interval(false/*is_laze_load*/) * 60 * 1000L * 1000L; int64_t snap_id = 0; LOG_INFO("start to take wr snapshot", KPC(this)); @@ -162,14 +183,14 @@ void WorkloadRepositoryTask::runTimerTask() } } // dispatch next wr snapshot task(not repeat). - int64_t interval = timeout_ts_ - common::ObTimeUtility::current_time(); - if (OB_UNLIKELY(interval < 0)) { + int64_t interval_us = timeout_ts_ - common::ObTimeUtility::current_time(); + if (OB_UNLIKELY(interval_us < 0)) { LOG_INFO( - "already timeout wr snapshot interval", K(timeout_ts_), K(interval), K_(snapshot_interval)); - interval = 0; + "already timeout wr snapshot interval", K(timeout_ts_), K(interval_us)); + interval_us = 0; } // should dispatch next wr snapshot task regardless of errors. - if (OB_FAIL(schedule_one_task(interval))) { + if (OB_FAIL(schedule_one_task(interval_us))) { LOG_WARN("failed to schedule wr snapshot task after modify snapshot interval", K(ret)); } @@ -341,7 +362,7 @@ int WorkloadRepositoryTask::create_snapshot_id_sequence() "MINVALUE 1 MAXVALUE 9223372036854775807 NOCACHE ORDER CYCLE", WR_SNAP_ID_SEQNENCE_NAME))) { LOG_WARN("failed to assign create sequence sql string", KR(ret)); - } else if (OB_FAIL(sql_proxy->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to create wr snap_id sequence", KR(ret), K(sql)); } return ret; @@ -363,7 +384,7 @@ int WorkloadRepositoryTask::fetch_snapshot_id_sequence_nextval(int64_t &snap_id) } else if (OB_FAIL(sql.assign_fmt( "SELECT /*+ WORKLOAD_REPOSITORY */ %s.nextval as snap_id FROM DUAL", WR_SNAP_ID_SEQNENCE_NAME))) { LOG_WARN("failed to assign create sequence sql string", KR(ret)); - } else if (OB_FAIL(sql_proxy->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { LOG_WARN("failed to fetch next snap_id sequence", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -382,6 +403,7 @@ int WorkloadRepositoryTask::fetch_snapshot_id_sequence_nextval(int64_t &snap_id) int WorkloadRepositoryTask::get_begin_interval_time(int64_t &begin_interval_time) { int ret = OB_SUCCESS; + int64_t cluster_id = GCONF.cluster_id; ObSqlString sql; SMART_VAR(ObISQLClient::ReadResult, res) { @@ -390,11 +412,11 @@ int WorkloadRepositoryTask::get_begin_interval_time(int64_t &begin_interval_time ret = OB_ERR_UNEXPECTED; LOG_WARN("GCTX.sql_proxy_ is null", K(ret)); } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ time_to_usec(END_INTERVAL_TIME) FROM %s where " - "tenant_id=%ld order by snap_id desc limit 1", - OB_WR_SNAPSHOT_TNAME, OB_SYS_TENANT_ID))) { + "tenant_id=%ld and cluster_id = %ld and snap_id != %ld order by snap_id desc limit 1", + OB_WR_SNAPSHOT_TNAME, OB_SYS_TENANT_ID, cluster_id, LAST_SNAPSHOT_RECORD_SNAP_ID))) { LOG_WARN("failed to format sql", KR(ret)); } else if (OB_FAIL( - GCTX.sql_proxy_->read(res, gen_meta_tenant_id(OB_SYS_TENANT_ID), sql.ptr()))) { + ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(OB_SYS_TENANT_ID), sql.ptr()))) { LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -456,7 +478,7 @@ int WorkloadRepositoryTask::setup_tenant_snapshot_info(int64_t snap_id, uint64_t } else if (OB_FAIL(dml_splicer.splice_batch_insert_sql(OB_WR_SNAPSHOT_TNAME, sql))) { LOG_WARN("failed to generate snapshot insertion sql", KR(ret), K(tenant_id)); } else if (OB_FAIL( - GCTX.sql_proxy_->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to write snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); } else if (affected_rows != 1) { ret = OB_ERR_UNEXPECTED; @@ -493,7 +515,7 @@ int WorkloadRepositoryTask::modify_tenant_snapshot_status_and_startup_time(int64 addr.get_port()))) { LOG_WARN("failed to format update snapshot info sql", KR(ret)); } else if (OB_FAIL( - GCTX.sql_proxy_->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to write snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); } else if (affected_rows != 1) { ret = OB_ERR_UNEXPECTED; @@ -528,7 +550,7 @@ int WorkloadRepositoryTask::fetch_to_delete_snap_id_list_by_time(const int64_t e OB_WR_SNAPSHOT_TNAME, tenant_id, cluster_id, end_ts_of_retention, WR_FETCH_TO_DELETE_SNAP_MAX_NUM))) { LOG_WARN("failed to assign fetch snap_id query string", KR(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->read(res, meta_tenant_id, sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, meta_tenant_id, sql.ptr()))) { LOG_WARN("failed to fetch snap_id query", KR(ret), K(meta_tenant_id), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -583,7 +605,7 @@ int WorkloadRepositoryTask::fetch_to_delete_snap_id_list_by_range(const int64_t OB_WR_SNAPSHOT_TNAME, tenant_id, cluster_id, low_snap_id, high_snap_id))) { LOG_WARN("failed to assign fetch snap_id query string", KR(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->read(res, meta_tenant_id, sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, meta_tenant_id, sql.ptr()))) { LOG_WARN("failed to fetch snap_id query", KR(ret), K(meta_tenant_id), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -658,7 +680,7 @@ int WorkloadRepositoryTask::modify_snap_info_status_to_deleted(const uint64_t te WR_MODIFY_BATCH_SIZE - 1 == i % WR_MODIFY_BATCH_SIZE) { if (OB_FAIL(sql.append_fmt(")"))) { LOG_WARN("sql append failed", K(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->write( + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry( gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to update snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); @@ -716,7 +738,7 @@ int WorkloadRepositoryTask::get_last_snapshot_task_begin_ts(int64_t snap_id, int "cluster_id=%ld and snap_id=%ld limit 1", OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, cluster_id, snap_id))) { LOG_WARN("failed to format sql", KR(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->read(res, OB_SYS_TENANT_ID, sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, OB_SYS_TENANT_ID, sql.ptr()))) { LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -766,7 +788,7 @@ int WorkloadRepositoryTask::check_snapshot_task_finished_for_snap_id( "cluster_id=%ld and snap_id=%ld", OB_WR_SNAPSHOT_TNAME, cluster_id, snap_id))) { LOG_WARN("failed to format sql", KR(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { LOG_WARN("failed to fetch snapshot info", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -830,7 +852,7 @@ int WorkloadRepositoryTask::get_last_snap_id(int64_t &snap_id) " order by snap_id desc limit 1", OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME))) { LOG_WARN("failed to format sql", KR(ret)); - } else if (OB_FAIL(GCTX.sql_proxy_->read(res, OB_SYS_TENANT_ID, sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, OB_SYS_TENANT_ID, sql.ptr()))) { LOG_WARN("failed to fetch latest snapshot id", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -961,7 +983,7 @@ int WorkloadRepositoryTask::update_wr_control(const char *time_num_col_name, con tenant_id))) { LOG_WARN("failed to format update snapshot info sql", KR(ret)); } else if (OB_FAIL( - GCTX.sql_proxy_->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("failed to write snapshot_info", KR(ret), K(sql), K(gen_meta_tenant_id(tenant_id))); } else if (affected_rows != 1) { LOG_TRACE("affected rows is not 1", KR(ret), K(affected_rows), K(sql)); @@ -984,7 +1006,7 @@ int WorkloadRepositoryTask::fetch_retention_usec_from_wr_control(int64_t &retent } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ retention_num FROM %s where tenant_id = %ld", OB_WR_CONTROL_TNAME, tenant_id))) { LOG_WARN("failed to assign create sequence sql string", KR(ret)); - } else if (OB_FAIL(sql_proxy->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { LOG_WARN("failed to fetch next snap_id sequence", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -999,11 +1021,11 @@ int WorkloadRepositoryTask::fetch_retention_usec_from_wr_control(int64_t &retent int64_t affected_rows = 0; if (OB_FAIL(get_init_wr_control_sql_string(OB_SYS_TENANT_ID, wr_control_sql_string))) { LOG_WARN("failed to get init wr control sql string", K(wr_control_sql_string)); - } else if (OB_FAIL(sql_proxy->write(gen_meta_tenant_id(tenant_id), wr_control_sql_string.ptr(), affected_rows))) { + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), wr_control_sql_string.ptr(), affected_rows))) { LOG_WARN("failed to insert default value into wr_control", KR(ret), K(wr_control_sql_string)); } else if (1 != affected_rows) { ret = OB_ERR_UNEXPECTED; - LOG_ERROR("unexpected affected_rows", K(affected_rows)); + LOG_WARN("unexpected affected_rows", K(affected_rows)); } LOG_INFO("no record in __wr_control table, set default value", K(retention)); } else { @@ -1035,7 +1057,7 @@ int WorkloadRepositoryTask::fetch_interval_num_from_wr_control(int64_t &interval } else if (OB_FAIL(sql.assign_fmt("SELECT /*+ WORKLOAD_REPOSITORY */ snapint_num FROM %s where tenant_id = %ld", OB_WR_CONTROL_TNAME, tenant_id))) { LOG_WARN("failed to assign create sequence sql string", KR(ret)); - } else if (OB_FAIL(sql_proxy->read(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { + } else if (OB_FAIL(ObWrCollector::exec_read_sql_with_retry(res, gen_meta_tenant_id(tenant_id), sql.ptr()))) { LOG_WARN("failed to fetch next snap_id sequence", KR(ret), K(sql)); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; @@ -1050,11 +1072,11 @@ int WorkloadRepositoryTask::fetch_interval_num_from_wr_control(int64_t &interval int64_t affected_rows = 0; if (OB_FAIL(get_init_wr_control_sql_string(OB_SYS_TENANT_ID, wr_control_sql_string))) { LOG_WARN("failed to get init wr control sql string", K(wr_control_sql_string)); - } else if (OB_FAIL(sql_proxy->write(gen_meta_tenant_id(tenant_id), wr_control_sql_string.ptr(), affected_rows))) { + } else if (OB_FAIL(ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), wr_control_sql_string.ptr(), affected_rows))) { LOG_WARN("failed to insert default value into wr_control", KR(ret), K(wr_control_sql_string)); } else if (1 != affected_rows) { ret = OB_ERR_UNEXPECTED; - LOG_ERROR("unexpected affected_rows", K(affected_rows)); + LOG_WARN("unexpected affected_rows", K(affected_rows)); } LOG_INFO("no record in __wr_control table, set default value", K(interval)); } else { @@ -1081,7 +1103,7 @@ int WorkloadRepositoryTask::update_snap_info_in_wr_control( OB_WR_CONTROL_TNAME, snap_id, end_interval_time, tenant_id))) { LOG_WARN("sql assign failed", K(ret)); } else if (OB_FAIL( - GCTX.sql_proxy_->write(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { + ObWrCollector::exec_write_sql_with_retry(gen_meta_tenant_id(tenant_id), sql.ptr(), affected_rows))) { LOG_WARN("execute sql failed", KR(ret), K(tenant_id), K(gen_meta_tenant_id(tenant_id)), K(sql)); } else if (OB_UNLIKELY(affected_rows != 1)) { ret = OB_ERR_UNEXPECTED; @@ -1128,10 +1150,10 @@ bool WorkloadRepositoryTask::check_tenant_can_do_wr_task(uint64_t tenant_id) const ObSimpleTenantSchema *tenant_schema = nullptr; if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { LOG_WARN("get min data_version failed", KR(ret), K(tenant_id)); - } else if (data_version < DATA_VERSION_4_2_1_0) { + } else if (data_version < DATA_CURRENT_VERSION) { ret = OB_NOT_SUPPORTED; LOG_WARN("tenant data version is too low for wr", K(tenant_id), K(data_version)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than 4.2.1, workload repository not supported"); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than bin version, workload repository not supported"); } else if (OB_FAIL(schema_service->get_tenant_schema_guard(tenant_id, schema_guard))) { LOG_WARN("failed to get schema guard", K(ret), K(tenant_id)); } else if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) { diff --git a/src/share/wr/ob_wr_task.h b/src/share/wr/ob_wr_task.h index f7f7f3cc1a..21a3ff2dfa 100644 --- a/src/share/wr/ob_wr_task.h +++ b/src/share/wr/ob_wr_task.h @@ -21,6 +21,9 @@ namespace oceanbase namespace share { +#define LAST_SNAPSHOT_RECORD_SNAP_ID -1L +#define LAST_SNAPSHOT_RECORD_CLUSTER_ID -1L +#define LAST_SNAPSHOT_RECORD_SVR_PORT -1L enum class ObWrSnapshotStatus : int64_t { @@ -35,6 +38,8 @@ enum class ObWrSnapshotFlag : int64_t SCHEDULE = 0, MANUAL, IMPORT, + LAST_SCHEDULED_SNAPSHOT, + LAST_AHEAD_SNAPSHOT, }; class WorkloadRepositoryTask : public common::ObTimerTask @@ -43,7 +48,7 @@ public: WorkloadRepositoryTask(); virtual ~WorkloadRepositoryTask() {}; DISABLE_COPY_ASSIGN(WorkloadRepositoryTask); - int schedule_one_task(int64_t interval = 0); + int schedule_one_task(int64_t interval_us = 0); int modify_snapshot_interval(int64_t minutes); void cancel_current_task(); int init(); @@ -160,10 +165,11 @@ public: static int get_init_wr_control_sql_string(const int64_t tenant_id, ObSqlString &sql); bool is_running_task() const { return is_running_task_; }; - int64_t get_snapshot_interval() const { return snapshot_interval_;}; + int64_t get_snapshot_interval(bool is_lazy_load = true); + // when is_lazy_load is false, the func will send inner SQL, avoid frequently calling static bool check_tenant_can_do_wr_task(uint64_t tenant_id); INHERIT_TO_STRING_KV("ObTimerTask", ObTimerTask, - K_(snapshot_interval), K_(tg_id), K_(timeout_ts), K_(is_running_task)); + K_(tg_id), K_(timeout_ts), K_(is_running_task)); static const int64_t DEFAULT_SNAPSHOT_RETENTION = 7L * 24 * 60 ; // 7 days static const int64_t ESTIMATE_PS_RESERVE_TIME = 100 * 1000; // different server's clock skew. static const int64_t DEFAULT_SNAPSHOT_INTERVAL = 60; @@ -187,11 +193,14 @@ private: ObWrSnapshotFlag snap_flag); static int get_last_snapshot_task_begin_ts(int64_t snap_id, int64_t &task_begin_ts); obrpc::ObWrRpcProxy wr_proxy_; - int64_t snapshot_interval_; // in minutes int tg_id_; int64_t timeout_ts_; bool is_running_task_; bool is_inited_; + int64_t lazy_snapshot_interval_min_; + // Since accessing the snapshot_interval requires sending inner SQL, + // after adding the feature of ASH early dump into disk, ASH thread will frequently send requests, blocking ASH execution. + // Therefore, lazy_snapshot_interval_min_ is added to utilize a lazy loading mode to avoid the issue. }; }//end namespace share diff --git a/src/sql/CMakeLists.txt b/src/sql/CMakeLists.txt index 95d7c056fe..26b56ec02d 100644 --- a/src/sql/CMakeLists.txt +++ b/src/sql/CMakeLists.txt @@ -1049,6 +1049,7 @@ ob_set_subtarget(ob_sql monitor monitor/flt/ob_flt_utils.cpp monitor/ob_sql_plan.cpp monitor/ob_plan_info_manager.cpp + monitor/ob_sql_stat_record.cpp ) ob_set_subtarget(ob_sql optimizer diff --git a/src/sql/das/ob_das_ref.cpp b/src/sql/das/ob_das_ref.cpp index b669d2baab..0391c0526d 100644 --- a/src/sql/das/ob_das_ref.cpp +++ b/src/sql/das/ob_das_ref.cpp @@ -522,6 +522,10 @@ int ObDASRef::create_das_task(const ObDASTabletLoc *tablet_loc, task_op->set_tablet_id(tablet_loc->tablet_id_); task_op->set_ls_id(tablet_loc->ls_id_); task_op->set_tablet_loc(tablet_loc); + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + task_op->set_plan_line_id(di->get_ash_stat().plan_line_id_); + } if (OB_FAIL(add_aggregated_task(task_op))) { LOG_WARN("failed to add aggregated task", KR(ret)); } diff --git a/src/sql/das/ob_das_retry_ctrl.cpp b/src/sql/das/ob_das_retry_ctrl.cpp index c8b5e7fe97..2c04508eb2 100644 --- a/src/sql/das/ob_das_retry_ctrl.cpp +++ b/src/sql/das/ob_das_retry_ctrl.cpp @@ -72,18 +72,34 @@ void ObDASRetryCtrl::tablet_location_retry_proc(ObDASRef &das_ref, } else { loc_router.force_refresh_location_cache(true, task_op.get_errcode()); need_retry = true; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di) && di->get_ash_stat().can_start_das_retry() && + OB_NOT_NULL(das_ref.get_exec_ctx().get_my_session())) { + di->get_ash_stat().record_cur_das_test_start_ts( + common::ObTimeUtility::current_time() - task_op.das_task_start_timestamp_, need_retry); + observer::ObQueryRetryCtrl::start_location_error_retry_wait_event( + *das_ref.get_exec_ctx().get_my_session(), task_op.errcode_); + } const ObDASTableLocMeta *loc_meta = tablet_loc->loc_meta_; LOG_INFO("[DAS RETRY] refresh tablet location cache and retry DAS task", "errcode", task_op.get_errcode(), KPC(loc_meta), KPC(tablet_loc)); } } -void ObDASRetryCtrl::tablet_nothing_readable_proc(ObDASRef &, ObIDASTaskOp &task_op, bool &need_retry) +void ObDASRetryCtrl::tablet_nothing_readable_proc(ObDASRef &das_ref, ObIDASTaskOp &task_op, bool &need_retry) { if (is_virtual_table(task_op.get_ref_table_id())) { need_retry = false; } else { need_retry = true; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di) && di->get_ash_stat().can_start_das_retry() && + OB_NOT_NULL(das_ref.get_exec_ctx().get_my_session())) { + di->get_ash_stat().record_cur_das_test_start_ts( + common::ObTimeUtility::current_time() - task_op.das_task_start_timestamp_, need_retry); + observer::ObQueryRetryCtrl::start_replica_not_readable_retry_wait_event( + *das_ref.get_exec_ctx().get_my_session()); + } } } diff --git a/src/sql/das/ob_das_rpc_processor.cpp b/src/sql/das/ob_das_rpc_processor.cpp index 51b4e22c52..7a70f99151 100644 --- a/src/sql/das/ob_das_rpc_processor.cpp +++ b/src/sql/das/ob_das_rpc_processor.cpp @@ -51,15 +51,34 @@ int ObDASBaseAccessP::before_process() mem_attr.tenant_id_ = task.get_task_op()->get_tenant_id(); mem_attr.label_ = "DASRpcPCtx"; exec_ctx_.get_allocator().set_attr(mem_attr); - ObActiveSessionGuard::setup_thread_local_ash(); - ObActiveSessionGuard::get_stat().in_das_remote_exec_ = true; - ObActiveSessionGuard::get_stat().tenant_id_ = task.get_task_op()->get_tenant_id(); - ObActiveSessionGuard::get_stat().trace_id_ = *ObCurTraceId::get_trace_id(); - ObActiveSessionGuard::get_stat().user_id_ = das_remote_info_.user_id_; - ObActiveSessionGuard::get_stat().session_id_ = das_remote_info_.session_id_; - ObActiveSessionGuard::get_stat().plan_id_ = das_remote_info_.plan_id_; - MEMCPY(ObActiveSessionGuard::get_stat().sql_id_, das_remote_info_.sql_id_, - min(sizeof(ObActiveSessionGuard::get_stat().sql_id_), sizeof(das_remote_info_.sql_id_))); + // ash stat should be setted already in rpc thread. + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().in_das_remote_exec_ = true; + di->get_ash_stat().tenant_id_ = task.get_task_op()->get_tenant_id(); + di->get_ash_stat().trace_id_ = *ObCurTraceId::get_trace_id(); + di->get_ash_stat().user_id_ = das_remote_info_.user_id_; + di->get_ash_stat().plan_id_ = das_remote_info_.plan_id_; + di->get_ash_stat().plan_hash_ = das_remote_info_.plan_hash_; + MEMCPY(di->get_ash_stat().sql_id_, das_remote_info_.sql_id_, + min(sizeof(di->get_ash_stat().sql_id_), sizeof(das_remote_info_.sql_id_))); + } + + { + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(task.get_task_op()->get_tenant_id())); + if (tenant_config.is_valid()) { + is_enable_sqlstat_ = tenant_config->_ob_sqlstat_enable && lib::is_diagnose_info_enabled(); + // sqlstat has a dependency on the statistics mechanism, so turning off perf event will turn off sqlstat at the same time. + } + } + + if (is_enable_sqlstat_) { + sqlstat_record_.record_sqlstat_start_value(); + sqlstat_key_.set_sql_id(ObString::make_string(das_remote_info_.sql_id_)); + sqlstat_key_.set_plan_hash(das_remote_info_.plan_hash_); + sqlstat_key_.set_source_addr(ObRpcProcessorBase::get_peer()); + } + if (OB_FAIL(RpcProcessor::before_process())) { LOG_WARN("do rpc processor before_process failed", K(ret)); } else if (das_remote_info_.need_calc_expr_ && @@ -103,6 +122,8 @@ int ObDASBaseAccessP::process() } else { for (int i = 0; OB_SUCC(ret) && i < task_ops.count(); i++) { task_op = task_ops.at(i); + GET_DIAGNOSTIC_INFO->get_ash_stat().plan_line_id_ = task_op->plan_line_id_; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, task_op->get_ls_id().id()); if (OB_FAIL(das_factory->create_das_task_result(task_op->get_type(), op_result))) { LOG_WARN("create das task result failed", K(ret)); } else if (OB_FAIL(task_resp.add_op_result(op_result))) { @@ -183,6 +204,11 @@ int ObDASBaseAccessP::after_process(int error_code) } else if (elapsed_time >= ObServerConfig::get_instance().trace_log_slow_query_watermark) { //slow das task, print trace info FORCE_PRINT_TRACE(THE_TRACE, "[slow das rpc process]"); + } else { + if (is_enable_sqlstat_) { + sqlstat_record_.record_sqlstat_end_value(); + sqlstat_record_.move_to_sqlstat_cache(sqlstat_key_); + } } //执行相关的错误信息不用传递给RPC框架,RPC框架不处理具体的RPC执行错误信息,始终返回OB_SUCCESS return OB_SUCCESS; @@ -191,8 +217,7 @@ int ObDASBaseAccessP::after_process(int error_code) template void ObDASBaseAccessP::cleanup() { - ObActiveSessionGuard::get_stat().reuse(); - ObActiveSessionGuard::setup_default_ash(); + GET_DIAGNOSTIC_INFO->get_ash_stat().in_das_remote_exec_ = false; das_factory_.cleanup(); ObDASBaseAccessP::get_das_factory() = nullptr; if (das_remote_info_.trans_desc_ != nullptr) { diff --git a/src/sql/das/ob_das_rpc_processor.h b/src/sql/das/ob_das_rpc_processor.h index 8075f75006..106d74b2a7 100644 --- a/src/sql/das/ob_das_rpc_processor.h +++ b/src/sql/das/ob_das_rpc_processor.h @@ -37,7 +37,10 @@ public: : das_factory_(CURRENT_CONTEXT->get_arena_allocator()), exec_ctx_(CURRENT_CONTEXT->get_arena_allocator(), gctx.session_mgr_), frame_info_(CURRENT_CONTEXT->get_arena_allocator()), - das_remote_info_() + das_remote_info_(), + is_enable_sqlstat_(false), + sqlstat_key_(), + sqlstat_record_() { RpcProcessor::set_preserve_recv_data(); } @@ -58,6 +61,9 @@ protected: ObExprFrameInfo frame_info_; share::schema::ObSchemaGetterGuard schema_guard_; ObDASRemoteInfo das_remote_info_; + bool is_enable_sqlstat_; + ObSqlStatRecordKey sqlstat_key_; + ObExecutingSqlStatRecord sqlstat_record_; //tsc monitor info int64_t monitor_val_[4]; ObTSCMonitorInfo tsc_monitor_info_; diff --git a/src/sql/das/ob_das_task.cpp b/src/sql/das/ob_das_task.cpp index dd687bf7c3..f3d0c93c4f 100644 --- a/src/sql/das/ob_das_task.cpp +++ b/src/sql/das/ob_das_task.cpp @@ -147,7 +147,6 @@ OB_DEF_DESERIALIZE(ObDASRemoteInfo) typedef ObSQLSessionInfo::ExecCtxSessionRegister MyExecCtxSessionRegister; des_exec_ctx->get_my_session()->set_is_remote(true); MyExecCtxSessionRegister ctx_register(*des_exec_ctx->get_my_session(), *des_exec_ctx); - // for remote das, we use thread local ash stat to record ash. // des_exec_ctx->get_my_session()->set_session_type_with_flag(); // if (OB_FAIL(des_exec_ctx->get_my_session()->set_session_active( // ObString::make_string("REMOTE/DISTRIBUTE DAS PLAN EXECUTING"), @@ -323,6 +322,7 @@ int ObIDASTaskOp::start_das_task() int &ret = errcode_; int simulate_error = EVENT_CALL(EventTable::EN_DAS_SIMULATE_OPEN_ERROR); int need_dump = EVENT_CALL(EventTable::EN_DAS_SIMULATE_DUMP_WRITE_BUFFER); + das_task_start_timestamp_ = common::ObTimeUtility::current_time(); if (OB_UNLIKELY(!is_in_retry() && OB_SUCCESS != simulate_error)) { ret = simulate_error; } else { diff --git a/src/sql/das/ob_das_task.h b/src/sql/das/ob_das_task.h index 953d713759..e91dbbd4e4 100644 --- a/src/sql/das/ob_das_task.h +++ b/src/sql/das/ob_das_task.h @@ -135,9 +135,7 @@ public: uint64_t user_id_; uint64_t session_id_; uint64_t plan_id_; -private: - uint64_t plan_hash_; // no use!!! -public: + uint64_t plan_hash_; ObTSCMonitorInfo *tsc_monitor_info_; }; @@ -173,7 +171,8 @@ public: attach_ctdef_(nullptr), attach_rtdef_(nullptr), das_gts_opt_info_(op_alloc), - plan_line_id_(0) + plan_line_id_(0), + das_task_start_timestamp_(0) { das_task_node_.get_data() = this; } @@ -219,6 +218,8 @@ public: DasTaskNode &get_node() { return das_task_node_; } int get_errcode() const { return errcode_; } void set_errcode(int errcode) { errcode_ = errcode; } + void set_plan_line_id(int64_t plan_line_id) { plan_line_id_ = plan_line_id; } + int64_t get_plan_line_id() const { return plan_line_id_; } void set_attach_ctdef(const ObDASBaseCtDef *attach_ctdef) { attach_ctdef_ = attach_ctdef; } void set_attach_rtdef(ObDASBaseRtDef *attach_rtdef) { attach_rtdef_ = attach_rtdef; } ObDASBaseRtDef *get_attach_rtdef() { return attach_rtdef_; } @@ -285,7 +286,9 @@ protected: uint64_t tenant_id_; int64_t task_id_; ObDASOpType op_type_; //DAS提供的operation type +public: int errcode_; //don't need serialize it +protected: //事务相关信息 union { @@ -337,6 +340,9 @@ protected: ObDASBaseRtDef *attach_rtdef_; ObDASGTSOptInfo das_gts_opt_info_; int64_t plan_line_id_; //plan operator id +public: + int64_t das_task_start_timestamp_; + }; typedef common::ObObjStore DasTaskList; typedef DasTaskList::Iterator DASTaskIter; diff --git a/src/sql/das/ob_data_access_service.cpp b/src/sql/das/ob_data_access_service.cpp index 70d9a3a4a6..2011fa6782 100644 --- a/src/sql/das/ob_data_access_service.cpp +++ b/src/sql/das/ob_data_access_service.cpp @@ -320,12 +320,14 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op retry_continue = false; LOG_INFO("[DAS RETRY] Retry is interrupted by worker interrupt signal", KR(ret)); } + GET_DIAGNOSTIC_INFO->get_ash_stat().stop_das_retry_wait_event(); } else { ret = task_op.errcode_; } } } while (retry_continue); + if (OB_FAIL(ret)) { int tmp_ret = OB_SUCCESS; if (OB_TMP_FAIL(task_op.state_advance())) { @@ -429,8 +431,9 @@ int ObDataAccessService::do_async_remote_das_task( session->get_cur_sql_id(remote_info.sql_id_, sizeof(remote_info.sql_id_)); remote_info.user_id_ = session->get_user_id(); remote_info.session_id_ = session->get_sessid(); - remote_info.plan_id_ = session->get_current_plan_id(); if (OB_NOT_NULL(plan_ctx->get_phy_plan())) { + remote_info.plan_id_ = plan_ctx->get_phy_plan()->get_plan_id(); + remote_info.plan_hash_ = plan_ctx->get_phy_plan()->get_plan_hash_value(); remote_info.need_subschema_ctx_ = plan_ctx->is_subschema_ctx_inited(); } task_arg.set_remote_info(&remote_info); @@ -527,8 +530,9 @@ int ObDataAccessService::do_sync_remote_das_task( session->get_cur_sql_id(remote_info.sql_id_, sizeof(remote_info.sql_id_)); remote_info.user_id_ = session->get_user_id(); remote_info.session_id_ = session->get_sessid(); - remote_info.plan_id_ = session->get_current_plan_id(); if (OB_NOT_NULL(plan_ctx->get_phy_plan())) { + remote_info.plan_id_ = plan_ctx->get_phy_plan()->get_plan_id(); + remote_info.plan_hash_ = plan_ctx->get_phy_plan()->get_plan_hash_value(); remote_info.need_subschema_ctx_ = plan_ctx->is_subschema_ctx_inited(); } diff --git a/src/sql/engine/cmd/ob_kill_executor.cpp b/src/sql/engine/cmd/ob_kill_executor.cpp index 6d85d5edd1..05813b6de6 100644 --- a/src/sql/engine/cmd/ob_kill_executor.cpp +++ b/src/sql/engine/cmd/ob_kill_executor.cpp @@ -376,6 +376,9 @@ int ObKillSession::kill_session(const ObKillSessionArg &arg, ObSQLSessionMgr &se } else if (OB_ISNULL(sess_info)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("session info is NULL", K(ret), K(arg)); + } else if (sess_info->is_real_inner_session()) { + ret = OB_ERR_KILL_DENIED; + LOG_WARN("It is not allowed to close the inner session", K(ret), K(arg)); } else if ((OB_SYS_TENANT_ID == arg.tenant_id_) || ((arg.tenant_id_ == sess_info->get_priv_tenant_id()) && (arg.has_user_super_privilege_ || arg.user_id_ == sess_info->get_user_id()))) { diff --git a/src/sql/engine/dml/ob_dml_service.cpp b/src/sql/engine/dml/ob_dml_service.cpp index f6b82afb12..644264cbbc 100644 --- a/src/sql/engine/dml/ob_dml_service.cpp +++ b/src/sql/engine/dml/ob_dml_service.cpp @@ -1734,7 +1734,9 @@ int ObDMLService::write_row_to_das_op(const ObDASDMLBaseCtDef &ctdef, do { bool buffer_full = false; need_retry = false; - //1. find das dml op + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(table_id_, ctdef.table_id_); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(table_schema_version_, ctdef.schema_version_); + //1. find das dml op OpType *dml_op = nullptr; if (OB_UNLIKELY(!dml_rtctx.das_ref_.has_das_op(tablet_loc, dml_op))) { if (OB_FAIL(dml_rtctx.das_ref_.prepare_das_task(tablet_loc, dml_op))) { diff --git a/src/sql/engine/expr/ob_expr_column_conv.cpp b/src/sql/engine/expr/ob_expr_column_conv.cpp index 1ea0ab86bf..30a15622e9 100644 --- a/src/sql/engine/expr/ob_expr_column_conv.cpp +++ b/src/sql/engine/expr/ob_expr_column_conv.cpp @@ -509,7 +509,7 @@ int ObExprColumnConv::column_convert(const ObExpr &expr, } else { const ObEnumSetInfo *enumset_info = static_cast(expr.extra_info_); const uint64_t cast_mode = enumset_info->cast_mode_; - bool is_strict = CM_IS_STRICT_MODE(cast_mode); + bool is_strict = CM_IS_STRICT_MODE(cast_mode) && !CM_IS_IGNORE_CHARSET_CONVERT_ERR(cast_mode); ObObjType out_type = expr.datum_meta_.type_; ObCollationType out_cs_type = expr.datum_meta_.cs_type_; ObDatum *val = NULL; diff --git a/src/sql/engine/expr/ob_expr_func_sleep.cpp b/src/sql/engine/expr/ob_expr_func_sleep.cpp index 0b1dc7cfc2..ec9dda9254 100644 --- a/src/sql/engine/expr/ob_expr_func_sleep.cpp +++ b/src/sql/engine/expr/ob_expr_func_sleep.cpp @@ -56,7 +56,6 @@ int ObExprSleep::sleep(int64_t usec) int64_t dead_line = ObTimeUtility::current_time() + usec; int64_t usec_rem = usec; useconds_t usec_req = static_cast(MIN(CHECK_INTERVAL_IN_US, usec_rem)); - ObWaitEventGuard wait_guard(ObWaitEventIds::DEFAULT_SLEEP, 0, usec); while(usec_req > 0) { ob_usleep(usec_req); if (OB_FAIL(THIS_WORKER.check_status())) { diff --git a/src/sql/engine/ob_des_exec_context.cpp b/src/sql/engine/ob_des_exec_context.cpp index f7020cd32f..90722d87ec 100644 --- a/src/sql/engine/ob_des_exec_context.cpp +++ b/src/sql/engine/ob_des_exec_context.cpp @@ -56,7 +56,6 @@ void ObDesExecContext::cleanup_session() GCTX.session_mgr_->mark_sessid_unused(free_session_ctx_.sessid_); } } - ObActiveSessionGuard::setup_default_ash(); // enforce cleanup for future RPC cases } void ObDesExecContext::show_session() @@ -123,6 +122,7 @@ int ObDesExecContext::create_my_session(uint64_t tenant_id) } } if (OB_SUCC(ret)) { + my_session_->set_thread_id(GETTID()); //notice: can't unlink exec context and session info here typedef ObSQLSessionInfo::ExecCtxSessionRegister MyExecCtxSessionRegister; MyExecCtxSessionRegister ctx_register(*my_session_, *this); @@ -173,7 +173,6 @@ DEFINE_DESERIALIZE(ObDesExecContext) // alloc from session manager, increase active session number if (OB_SUCC(ret) && free_session_ctx_.sessid_ != ObSQLSessionInfo::INVALID_SESSID) { free_session_ctx_.tenant_id_ = my_session_->get_effective_tenant_id(); - ObTenantStatEstGuard g(free_session_ctx_.tenant_id_); EVENT_INC(ACTIVE_SESSIONS); free_session_ctx_.has_inc_active_num_ = true; } diff --git a/src/sql/engine/ob_operator.cpp b/src/sql/engine/ob_operator.cpp index d4d9545a4d..d7d0f057d7 100644 --- a/src/sql/engine/ob_operator.cpp +++ b/src/sql/engine/ob_operator.cpp @@ -1319,7 +1319,7 @@ int ObOperator::get_next_row() } } } - end_ash_line_id_reg(); + end_ash_line_id_reg(ret); end_cpu_time_counting(); return ret; } @@ -1482,7 +1482,7 @@ int ObOperator::get_next_batch(const int64_t max_row_cnt, const ObBatchRows *&ba brs_.set_all_rows_active(false); } - end_ash_line_id_reg(); + end_ash_line_id_reg(ret); end_cpu_time_counting(); return ret; } diff --git a/src/sql/engine/ob_operator.h b/src/sql/engine/ob_operator.h index fda1b04687..45c8042e19 100644 --- a/src/sql/engine/ob_operator.h +++ b/src/sql/engine/ob_operator.h @@ -638,17 +638,23 @@ protected: inline void begin_ash_line_id_reg() { // begin with current operator - ObActiveSessionGuard::get_stat().plan_line_id_ = static_cast(spec_.id_);//TODO(xiaochu.yh): fix uint64 to int32 + GET_DIAGNOSTIC_INFO->get_ash_stat().plan_line_id_ = static_cast(spec_.id_);//TODO(xiaochu.yh): fix uint64 to int32 } - inline void end_ash_line_id_reg() + inline void end_ash_line_id_reg(int ret) { - // move back to parent operator - // known issue: when switch from batch to row in same op, - // we shift line id to parent op un-intently. but we tolerate this inaccuracy - if (OB_LIKELY(spec_.get_parent())) { - common::ObActiveSessionGuard::get_stat().plan_line_id_ = static_cast(spec_.get_parent()->id_);//TODO(xiaochu.yh): fix uint64 to int32 - } else { - common::ObActiveSessionGuard::get_stat().plan_line_id_ = -1; + ObDiagnosticInfo *di = common::ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + // move back to parent operator + // known issue: when switch from batch to row in same op, + // we shift line id to parent op un-intently. but we tolerate this inaccuracy + if (OB_LIKELY(spec_.get_parent())) { + di->get_ash_stat().plan_line_id_ = static_cast(spec_.get_parent()->id_);//TODO(xiaochu.yh): fix uint64 to int32 + } else { + di->get_ash_stat().plan_line_id_ = -1; + } + if (OB_FAIL(ret) && -1 == di->get_ash_stat().retry_plan_line_id_) { + di->get_ash_stat().retry_plan_line_id_ = static_cast(spec_.id_); + } } } #ifdef ENABLE_DEBUG_LOG diff --git a/src/sql/engine/ob_physical_plan.cpp b/src/sql/engine/ob_physical_plan.cpp index 736b0f4a4d..7d99080391 100644 --- a/src/sql/engine/ob_physical_plan.cpp +++ b/src/sql/engine/ob_physical_plan.cpp @@ -247,6 +247,7 @@ void ObPhysicalPlan::reset() is_enable_px_fast_reclaim_ = false; subschema_ctx_.reset(); all_local_session_vars_.reset(); + sql_stat_record_value_.reset(); udf_has_dml_stmt_ = false; is_inner_sql_ = false; is_batch_params_execute_ = false; diff --git a/src/sql/engine/ob_physical_plan.h b/src/sql/engine/ob_physical_plan.h index 5bd779f086..e2ed788c26 100644 --- a/src/sql/engine/ob_physical_plan.h +++ b/src/sql/engine/ob_physical_plan.h @@ -678,6 +678,7 @@ public: //the DML statement needs to be executed through get_next_row bool need_drive_dml_query_; ExprFixedArray var_init_exprs_; + sql::ObExecutedSqlStatRecord sql_stat_record_value_; private: bool is_returning_; //是否设置了returning diff --git a/src/sql/engine/px/ob_dfo_mgr.cpp b/src/sql/engine/px/ob_dfo_mgr.cpp index f1554856bf..41dcf1ac98 100644 --- a/src/sql/engine/px/ob_dfo_mgr.cpp +++ b/src/sql/engine/px/ob_dfo_mgr.cpp @@ -207,6 +207,9 @@ int ObDfoWorkerAssignment::calc_admited_worker_count(const ObIArray &dfo const int64_t query_admited = task_exec_ctx->get_admited_worker_cnt(); if (query_expected > 0 && 0 >= query_admited) { ret = OB_ERR_INSUFFICIENT_PX_WORKER; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(dop_, px_expected); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(required_px_workers_number_, query_expected); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(admitted_px_workers_number_, query_admited); LOG_WARN("not enough thread resource", K(ret), K(px_expected), K(query_admited), K(query_expected)); } else if (0 == query_expected) { // note: 对于单表、dop=1的查询,会走 fast dfo,此时 query_expected = 0 diff --git a/src/sql/engine/px/ob_px_admission.cpp b/src/sql/engine/px/ob_px_admission.cpp index 9eb305a1d1..0043966e74 100644 --- a/src/sql/engine/px/ob_px_admission.cpp +++ b/src/sql/engine/px/ob_px_admission.cpp @@ -154,6 +154,9 @@ int ObPxAdmission::enter_query_admission(ObSQLSessionInfo &session, } else if (admit_worker_count <= 0) { plan.inc_delayed_px_querys(); ret = OB_ERR_INSUFFICIENT_PX_WORKER; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(dop_, plan.get_px_dop()); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(required_px_workers_number_, req_worker_count); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(admitted_px_workers_number_, admit_worker_count); LOG_INFO("This query is out of px worker resources and needs to be delayed; " "disconnection is unnecessary.", K(admit_worker_count), diff --git a/src/sql/engine/px/ob_px_rpc_processor.cpp b/src/sql/engine/px/ob_px_rpc_processor.cpp index 4e2539a58d..2b03a7d78d 100644 --- a/src/sql/engine/px/ob_px_rpc_processor.cpp +++ b/src/sql/engine/px/ob_px_rpc_processor.cpp @@ -60,12 +60,11 @@ void ObInitSqcP::destroy() int report_ret = OB_SUCCESS; ObPxSqcHandler::release_handler(arg_.sqc_handler_, report_ret); } - ObActiveSessionGuard::setup_default_ash(); } int ObInitSqcP::process() { - ObActiveSessionGuard::get_stat().in_px_execution_ = true; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_px_execution_ = true; int ret = OB_SUCCESS; LOG_TRACE("receive dfo", K_(arg)); ObPxSqcHandler *sqc_handler = arg_.sqc_handler_; @@ -97,6 +96,9 @@ int ObInitSqcP::process() LOG_WARN("fail to do thread auto scaling", K(ret), K(result_.reserved_thread_count_)); } else if (result_.reserved_thread_count_ <= 0) { ret = OB_ERR_INSUFFICIENT_PX_WORKER; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(dop_, sqc_handler->get_phy_plan().get_px_dop()); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(required_px_workers_number_, 1); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(admitted_px_workers_number_, result_.reserved_thread_count_); LOG_WARN("Worker thread res not enough", K_(result)); } else if (OB_FAIL(sqc_handler->link_qc_sqc_channel())) { LOG_WARN("Failed to link qc sqc channel", K(ret)); @@ -235,7 +237,7 @@ int ObInitSqcP::after_process(int error_code) session->set_session_sleep(); } - ObActiveSessionGuard::get_stat().in_px_execution_ = false; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_px_execution_ = false; /** * 此处需要清理中断,并把分配的线程数和handler释放. * worker正常启动后,此时它的引用计数被更新成了 @@ -386,12 +388,11 @@ void ObInitFastSqcP::destroy() int report_ret = OB_SUCCESS; ObPxSqcHandler::release_handler(arg_.sqc_handler_, report_ret); } - ObActiveSessionGuard::setup_default_ash(); } int ObInitFastSqcP::process() { - ObActiveSessionGuard::get_stat().in_sql_execution_ = true; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_sql_execution_ = true; int ret = OB_SUCCESS; LOG_TRACE("receive dfo", K_(arg)); ObPxSqcHandler *sqc_handler = arg_.sqc_handler_; @@ -440,7 +441,7 @@ int ObInitFastSqcP::process() ObInterruptUtil::update_schema_error_code(&(sqc_handler->get_exec_ctx()), ret); } - ObActiveSessionGuard::get_stat().in_sql_execution_ = false; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_sql_execution_ = false; if (OB_NOT_NULL(sqc_handler)) { // link channel之前或者link过程可能会失败. // 如果sqc和qc没有link, 由response将 ret 通知给px. diff --git a/src/sql/engine/px/ob_px_scheduler.cpp b/src/sql/engine/px/ob_px_scheduler.cpp index 346dfcc4b3..6fb517b746 100644 --- a/src/sql/engine/px/ob_px_scheduler.cpp +++ b/src/sql/engine/px/ob_px_scheduler.cpp @@ -322,7 +322,7 @@ int ObPxMsgProc::process_sqc_finish_msg_once(ObExecContext &ctx, const ObPxFinis LOG_WARN("fail to merge feedback info", K(ret)); } else if (OB_ISNULL(session->get_tx_desc())) { } else if (OB_FAIL(MTL(transaction::ObTransService*) - ->add_tx_exec_result(*session->get_tx_desc(), + ->add_tx_exec_result(*session->get_tx_desc(), pkt.get_trans_result()))) { LOG_WARN("fail merge result", K(ret), "packet_trans_result", pkt.get_trans_result(), diff --git a/src/sql/engine/px/ob_px_target_mgr.cpp b/src/sql/engine/px/ob_px_target_mgr.cpp index 4f1ec58ac5..ed5047adb8 100644 --- a/src/sql/engine/px/ob_px_target_mgr.cpp +++ b/src/sql/engine/px/ob_px_target_mgr.cpp @@ -130,7 +130,8 @@ void ObPxTargetMgr::run1() lib::set_thread_name("PxTargetMgr", get_thread_idx()); while (!has_set_stop()) { // sleep 100 * 1000 us - ob_usleep(PX_REFRESH_TARGET_INTERVEL_US); + ob_usleep(PX_REFRESH_TARGET_INTERVEL_US, true/*is_idle_sleep*/); + refresh_times++; px_info_map_.for_each(px_res_refresh_funtor); diff --git a/src/sql/engine/px/ob_px_task_process.cpp b/src/sql/engine/px/ob_px_task_process.cpp index 8b2be5b5fc..8c1e5a8e72 100644 --- a/src/sql/engine/px/ob_px_task_process.cpp +++ b/src/sql/engine/px/ob_px_task_process.cpp @@ -136,6 +136,7 @@ int ObPxTaskProcess::process() enqueue_timestamp_ = ObTimeUtility::current_time(); process_timestamp_ = enqueue_timestamp_; ObExecRecord exec_record; + ObExecutingSqlStatRecord sqlstat_record; ObExecTimestamp exec_timestamp; ObWaitEventDesc max_wait_desc; ObWaitEventStat total_wait_desc; @@ -155,10 +156,10 @@ int ObPxTaskProcess::process() const bool enable_perf_event = lib::is_diagnose_info_enabled(); const bool enable_sql_audit = GCONF.enable_sql_audit && session->get_local_ob_enable_sql_audit(); + const bool enable_sqlstat = session->is_sqlstat_enabled(); ObAuditRecordData &audit_record = session->get_raw_audit_record(); ObWorkerSessionGuard worker_session_guard(session); ObSQLSessionInfo::LockGuard lock_guard(session->get_query_lock()); - ObSessionStatEstGuard stat_est_guard(session->get_effective_tenant_id(), session->get_sessid()); session->set_current_trace_id(ObCurTraceId::get_trace_id()); session->get_raw_audit_record().request_memory_used_ = 0; observer::ObProcessMallocCallback pmcb(0, @@ -174,10 +175,18 @@ int ObPxTaskProcess::process() arg_.exec_ctx_->set_branch_id(arg_.task_.get_branch_id()); ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : NULL); ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL); - + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + session->set_ash_stat_value(di->get_ash_stat()); + } if (enable_perf_event) { exec_record.record_start(); } + if (enable_sqlstat && OB_NOT_NULL(arg_.exec_ctx_->get_sql_ctx())) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session->get_is_in_retry()); + session->sql_sess_record_sql_stat_start_value(sqlstat_record); + } //监控项统计开始 exec_start_timestamp_ = enqueue_timestamp_; @@ -202,6 +211,14 @@ int ObPxTaskProcess::process() audit_record.exec_record_ = exec_record; audit_record.update_event_stage_state(); } + if (enable_sqlstat && OB_NOT_NULL(arg_.exec_ctx_->get_sql_ctx())) { + sqlstat_record.record_sqlstat_end_value(); + ObPhysicalPlan *phy_plan = arg_.des_phy_plan_; + ObString sql = ObString::make_string("PX DFO EXECUTING"); + sqlstat_record.set_is_plan_cache_hit(arg_.exec_ctx_->get_sql_ctx()->plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(*session, + sql, phy_plan, true/*is_px_remote_exec*/); + } if (enable_sql_audit) { if (OB_ISNULL(arg_.sqc_task_ptr_)){ diff --git a/src/sql/engine/px/ob_px_worker.cpp b/src/sql/engine/px/ob_px_worker.cpp index c55fd16489..f8306f9447 100644 --- a/src/sql/engine/px/ob_px_worker.cpp +++ b/src/sql/engine/px/ob_px_worker.cpp @@ -261,7 +261,6 @@ void PxWorkerFinishFunctor::operator ()() { // 每个 worker 结束后,都释放一个槽位 ObPxSubAdmission::release(1); - ObActiveSessionGuard::setup_default_ash(); } diff --git a/src/sql/engine/table/ob_external_table_access_service.cpp b/src/sql/engine/table/ob_external_table_access_service.cpp index 71364e8f62..e45d633de4 100644 --- a/src/sql/engine/table/ob_external_table_access_service.cpp +++ b/src/sql/engine/table/ob_external_table_access_service.cpp @@ -560,6 +560,10 @@ int ObExternalTableAccessService::table_scan( ObNewRowIterator *&result) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + const share::ObLSID &ls_id = param.ls_id_; + const common::ObTabletID &data_tablet_id = param.tablet_id_; + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = data_tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; ObExternalTableRowIterator* row_iter = NULL; @@ -617,6 +621,10 @@ int ObExternalTableAccessService::table_scan( int ObExternalTableAccessService::table_rescan(ObVTableScanParam ¶m, ObNewRowIterator *result) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + const share::ObLSID &ls_id = param.ls_id_; + const common::ObTabletID &data_tablet_id = param.tablet_id_; + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = data_tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; if (OB_ISNULL(result)) { ret = OB_ERR_UNEXPECTED; @@ -649,6 +657,8 @@ int ObExternalTableAccessService::table_rescan(ObVTableScanParam ¶m, ObNewRo int ObExternalTableAccessService::reuse_scan_iter(const bool switch_param, ObNewRowIterator *iter) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = 0; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, 0); UNUSED(switch_param); iter->reset(); return OB_SUCCESS; @@ -657,6 +667,8 @@ int ObExternalTableAccessService::reuse_scan_iter(const bool switch_param, ObNew int ObExternalTableAccessService::revert_scan_iter(ObNewRowIterator *iter) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = 0; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, 0); int ret = OB_SUCCESS; if (OB_ISNULL(iter)) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index 696434c9f5..7a52b1dbaf 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -2441,7 +2441,7 @@ int ObTableScanOp::inner_get_next_row_for_tsc() } return ret; } - +ERRSIM_POINT_DEF(EN_TABLE_SCAN_RETRY_WAIT_EVENT_ERRSIM); int ObTableScanOp::inner_get_next_batch(const int64_t max_row_cnt) { int ret = OB_SUCCESS; @@ -2453,7 +2453,9 @@ int ObTableScanOp::inner_get_next_batch(const int64_t max_row_cnt) if (enable_random_output && max_row_cnt > 1) { gen_rand_size_and_skip_bits(max_row_cnt, rand_row_cnt, rand_append_bits); } - if (OB_FAIL(inner_get_next_batch_for_tsc(rand_row_cnt))) { + if (OB_UNLIKELY(EN_TABLE_SCAN_RETRY_WAIT_EVENT_ERRSIM)) { + ret = EN_TABLE_SCAN_RETRY_WAIT_EVENT_ERRSIM; + } else if (OB_FAIL(inner_get_next_batch_for_tsc(rand_row_cnt))) { LOG_WARN("failed to get next batch", K(ret)); } @@ -3336,7 +3338,9 @@ int ObTableScanOp::transform_physical_rowid_rowkey(ObIAllocator &allocator, int ObTableScanOp::inner_get_next_row() { int ret = OB_SUCCESS; - if (OB_UNLIKELY(MY_SPEC.is_spatial_ddl())) { + if (OB_UNLIKELY(EN_TABLE_SCAN_RETRY_WAIT_EVENT_ERRSIM)) { + ret = EN_TABLE_SCAN_RETRY_WAIT_EVENT_ERRSIM; + } else if (OB_UNLIKELY(MY_SPEC.is_spatial_ddl())) { if (OB_FAIL(inner_get_next_spatial_index_row())) { if (ret != OB_ITER_END) { LOG_WARN("spatial index ddl : get next spatial index row failed", K(ret)); diff --git a/src/sql/executor/ob_remote_executor_processor.cpp b/src/sql/executor/ob_remote_executor_processor.cpp index c09199bb8a..a493f78063 100644 --- a/src/sql/executor/ob_remote_executor_processor.cpp +++ b/src/sql/executor/ob_remote_executor_processor.cpp @@ -59,7 +59,7 @@ int ObRemoteBaseExecuteP::base_before_process(int64_t tenant_schema_version, int64_t sys_schema_version, const DependenyTableStore &dependency_tables) { - ObActiveSessionGuard::get_stat().in_sql_execution_ = true; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_sql_execution_ = true; bool table_version_equal = false; int ret = OB_SUCCESS; process_timestamp_ = ObTimeUtility::current_time(); @@ -638,6 +638,7 @@ int ObRemoteBaseExecuteP::execute_with_sql(ObRemoteTask &task) int ret = OB_SUCCESS; NG_TRACE(exec_remote_plan_begin); ObExecRecord exec_record; + ObExecutingSqlStatRecord sqlstat_record; ObExecTimestamp exec_timestamp; exec_timestamp.exec_type_ = RpcProcessor; int64_t local_tenant_schema_version = -1; @@ -668,7 +669,7 @@ int ObRemoteBaseExecuteP::execute_with_sql(ObRemoteTask &task) // 设置诊断功能环境 if (OB_SUCC(ret)) { - ObSessionStatEstGuard stat_est_guard(session->get_effective_tenant_id(), session->get_sessid()); + const bool enable_sqlstat = session->is_sqlstat_enabled(); SQL_INFO_GUARD(task.get_remote_sql_info()->remote_sql_, session->get_cur_sql_id()); // 初始化ObTask的执行环节 // @@ -676,13 +677,16 @@ int ObRemoteBaseExecuteP::execute_with_sql(ObRemoteTask &task) // 执行ObTask, 处理结果通过Result返回 ObWaitEventDesc max_wait_desc; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { exec_record.record_start(); } + if (enable_sqlstat && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session->get_is_in_retry()); + } if (OB_FAIL(gctx_.sql_engine_->handle_remote_query(plan_ctx->get_remote_sql_info(), *exec_ctx_.get_sql_ctx(), exec_ctx_, @@ -758,6 +762,11 @@ int ObRemoteBaseExecuteP::execute_with_sql(ObRemoteTask &task) audit_record.update_event_stage_state(); } + if (enable_sqlstat && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_is_plan_cache_hit(exec_ctx_.get_sql_ctx()->plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(*session, exec_ctx_.get_sql_ctx()->cur_sql_ ,plan); + } //此处代码要放在scanner.set_err_code(ret)代码前,避免ret被都写成了OB_SUCCESS record_sql_audit_and_plan_stat(plan, session); } @@ -837,14 +846,13 @@ int ObRemoteBaseExecuteP::base_after_process() //slow mini task, print trace info FORCE_PRINT_TRACE(THE_TRACE, "[slow remote task]"); } - ObActiveSessionGuard::get_stat().in_sql_execution_ = false; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_sql_execution_ = false; return ret; } template void ObRemoteBaseExecuteP::base_cleanup() { - ObActiveSessionGuard::setup_default_ash(); exec_ctx_.cleanup_session(); exec_errcode_ = OB_SUCCESS; obrpc::ObRpcProcessor::cleanup(); @@ -939,6 +947,7 @@ int ObRpcRemoteExecuteP::process() ret = OB_SUCCESS; NG_TRACE(exec_remote_plan_begin); ObExecRecord exec_record; + ObExecutingSqlStatRecord sqlstat_record; ObExecTimestamp exec_timestamp; exec_timestamp.exec_type_ = RpcProcessor; // arg_是一个ObTask对象 @@ -965,9 +974,7 @@ int ObRpcRemoteExecuteP::process() // 设置诊断功能环境 if (OB_SUCC(ret)) { - ObSessionStatEstGuard stat_est_guard( - session->get_effective_tenant_id(), - session->get_sessid()); + const bool enable_sqlstat = session->is_sqlstat_enabled(); SQL_INFO_GUARD(task.get_sql_string(), session->get_cur_sql_id()); // 初始化ObTask的执行环节 // @@ -977,12 +984,15 @@ int ObRpcRemoteExecuteP::process() ObPhysicalPlanCtx *plan_ctx = NULL; ObWaitEventDesc max_wait_desc; ObWaitEventStat total_wait_desc; - ObDiagnoseSessionInfo *di = ObDiagnoseSessionInfo::get_local_diagnose_info(); { - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : NULL, di); - ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL, di); + ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : nullptr); + ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : nullptr); if (enable_perf_event) { - exec_record.record_start(di); + exec_record.record_start(); + } + if (enable_sqlstat && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { + sqlstat_record.record_sqlstat_start_value(); + sqlstat_record.set_is_in_retry(session->get_is_in_retry()); } if (OB_FAIL(ret)) { } else if (OB_ISNULL(plan_ctx = GET_PHY_PLAN_CTX(exec_ctx_))) { @@ -1049,6 +1059,11 @@ int ObRpcRemoteExecuteP::process() audit_record.exec_record_ = exec_record; audit_record.update_event_stage_state(); } + if (enable_sqlstat && OB_NOT_NULL(exec_ctx_.get_sql_ctx())) { + sqlstat_record.record_sqlstat_end_value(); + sqlstat_record.set_is_plan_cache_hit(exec_ctx_.get_sql_ctx()->plan_cache_hit_); + sqlstat_record.move_to_sqlstat_cache(*session, exec_ctx_.get_sql_ctx()->cur_sql_, &phy_plan_); + } //此处代码要放在scanner.set_err_code(ret)代码前,避免ret被都写成了OB_SUCCESS record_sql_audit_and_plan_stat(&phy_plan_, session); diff --git a/src/sql/executor/ob_task.cpp b/src/sql/executor/ob_task.cpp index 76e5af9a02..0fc69c20e7 100644 --- a/src/sql/executor/ob_task.cpp +++ b/src/sql/executor/ob_task.cpp @@ -438,6 +438,14 @@ OB_DEF_DESERIALIZE(ObRemoteTask) session_info_->set_mysql_cmd(obmysql::COM_QUERY); } OB_UNIS_DECODE(remote_sql_info_->is_batched_stmt_); + if (OB_SUCC(ret)) { + if (OB_FAIL(session_info_->set_session_active( + ObString::make_string("REMOTE/DISTRIBUTE SQL EXECUTING"), + obmysql::COM_QUERY))) { + LOG_WARN("set remote session active failed", K(ret)); + } + EVENT_INC(ACTIVE_SESSIONS); + } } dependency_tables_.set_allocator(&(exec_ctx_->get_allocator())); OB_UNIS_DECODE(dependency_tables_); diff --git a/src/sql/monitor/ob_exec_stat.h b/src/sql/monitor/ob_exec_stat.h index 6e66b12a87..27ef5f6f2a 100644 --- a/src/sql/monitor/ob_exec_stat.h +++ b/src/sql/monitor/ob_exec_stat.h @@ -33,6 +33,7 @@ EVENT_INFO(BLOCKSCAN_ROW_CNT, blockscan_row_cnt) EVENT_INFO(PUSHDOWN_STORAGE_FILTER_ROW_CNT, pushdown_storage_filter_row_cnt) EVENT_INFO(FUSE_ROW_CACHE_HIT, fuse_row_cache_hit) EVENT_INFO(SCHEDULE_TIME, schedule_time) +EVENT_INFO(NETWORK_WAIT_TIME, network_wait_time) #endif #ifndef OCEANBASE_SQL_OB_EXEC_STAT_H @@ -43,6 +44,7 @@ EVENT_INFO(SCHEDULE_TIME, schedule_time) #include "lib/net/ob_addr.h" #include "sql/ob_sql_define.h" #include "sql/plan_cache/ob_plan_cache_util.h" +#include "lib/stat/ob_diagnostic_info.h" namespace oceanbase { namespace sql @@ -80,10 +82,10 @@ struct ObExecRecord ret; \ }) -#define RECORD(se, di) \ +#define RECORD(se) \ do { \ - oceanbase::common::ObDiagnoseSessionInfo *diag_session_info = \ - (NULL != di) ? di : oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); \ + oceanbase::common::ObDiagnosticInfo *diag_session_info = \ + oceanbase::common::ObLocalDiagnosticInfo::get(); \ if (NULL != diag_session_info) { \ oceanbase::common::ObStatEventAddStatArray &arr = diag_session_info->get_add_stat_stats(); \ io_read_count_##se##_= EVENT_STAT_GET(arr, ObStatEventIds::IO_READ_COUNT); \ @@ -105,6 +107,7 @@ struct ObExecRecord application_time_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::APWAIT_TIME); \ concurrency_time_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::CCWAIT_TIME); \ schedule_time_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::SCHEDULE_WAIT_TIME); \ + network_wait_time_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::NETWORK_WAIT_TIME); \ } \ } while(0); @@ -114,12 +117,12 @@ struct ObExecRecord event##_ += event##_end_ - event##_start_; \ } while(0); - void record_start(common::ObDiagnoseSessionInfo *di = NULL) { - RECORD(start, di); + void record_start() { + RECORD(start); } - void record_end(common::ObDiagnoseSessionInfo *di = NULL) { - RECORD(end, di); + void record_end() { + RECORD(end); } void update_stat() { @@ -145,11 +148,12 @@ struct ObExecRecord UPDATE_EVENT(blockscan_row_cnt); UPDATE_EVENT(pushdown_storage_filter_row_cnt); UPDATE_EVENT(fuse_row_cache_hit); + UPDATE_EVENT(network_wait_time); } - uint64_t get_cur_memstore_read_row_count(common::ObDiagnoseSessionInfo *di = NULL) { - oceanbase::common::ObDiagnoseSessionInfo *diag_session_info = - (NULL != di) ? di : oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); + uint64_t get_cur_memstore_read_row_count(common::ObDiagnosticInfo *di = NULL) { + oceanbase::common::ObDiagnosticInfo *diag_session_info = + (NULL != di) ? di : oceanbase::common::ObLocalDiagnosticInfo::get(); uint64_t cur_memstore_read_row_count = 0; if (NULL != diag_session_info) { oceanbase::common::ObStatEventAddStatArray &arr = diag_session_info->get_add_stat_stats(); @@ -160,9 +164,9 @@ struct ObExecRecord return cur_memstore_read_row_count; } - uint64_t get_cur_ssstore_read_row_count(common::ObDiagnoseSessionInfo *di = NULL) { - oceanbase::common::ObDiagnoseSessionInfo *diag_session_info = - (NULL != di) ? di : oceanbase::common::ObDiagnoseSessionInfo::get_local_diagnose_info(); + uint64_t get_cur_ssstore_read_row_count(common::ObDiagnosticInfo *di = NULL) { + oceanbase::common::ObDiagnosticInfo *diag_session_info = + (NULL != di) ? di : oceanbase::common::ObLocalDiagnosticInfo::get(); uint64_t cur_ssstore_read_row_count = 0; if (NULL != diag_session_info) { oceanbase::common::ObStatEventAddStatArray &arr = diag_session_info->get_add_stat_stats(); @@ -318,6 +322,7 @@ struct ObAuditRecordData { partition_hit_ = true; is_perf_event_closed_ = false; pl_trace_id_.reset(); + stmt_type_ = sql::stmt::T_NONE; } int64_t get_elapsed_time() const @@ -338,15 +343,6 @@ struct ObAuditRecordData { void update_event_stage_state() { exec_record_.update_stat(); - const int64_t cpu_time = MAX(exec_timestamp_.elapsed_t_ - exec_record_.wait_time_, 0); - const int64_t elapsed_time = MAX(exec_timestamp_.elapsed_t_, 0); - if(is_inner_sql_) { - EVENT_ADD(SYS_TIME_MODEL_DB_INNER_TIME, elapsed_time); - EVENT_ADD(SYS_TIME_MODEL_DB_INNER_CPU, cpu_time); - } else { - EVENT_ADD(SYS_TIME_MODEL_DB_TIME, elapsed_time); - EVENT_ADD(SYS_TIME_MODEL_DB_CPU, cpu_time); - } } bool is_timeout() const { diff --git a/src/sql/monitor/ob_sql_stat_record.cpp b/src/sql/monitor/ob_sql_stat_record.cpp new file mode 100644 index 0000000000..718ea49fbb --- /dev/null +++ b/src/sql/monitor/ob_sql_stat_record.cpp @@ -0,0 +1,656 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SQL + +#include "sql/monitor/ob_sql_stat_record.h" +#include "sql/engine/ob_physical_plan.h" +#include "lib/stat/ob_diagnose_info.h" +#include "sql/session/ob_sql_session_info.h" +#include "lib/atomic/ob_atomic.h" +#include "sql/ob_sql_context.h" +#include "lib/allocator/page_arena.h" // ObArenaAllocator +#include "lib/time/ob_tsc_timestamp.h" +#include "observer/ob_server.h" + +using namespace oceanbase::common; + +namespace oceanbase +{ +namespace sql +{ +int ObSqlStatRecordKey::deep_copy(common::ObIAllocator &allocator, const ObILibCacheKey &other) +{ + UNUSED(allocator); + int ret = OB_SUCCESS; + if (OB_FAIL(deep_copy(other))) { + LOG_WARN("failed to deep copy sql stat record key", K(ret)); + } + return ret; +} + +int ObSqlStatRecordKey::deep_copy(const ObILibCacheKey &other) +{ + int ret = OB_SUCCESS; + const ObSqlStatRecordKey &sql_stat_key = static_cast(other); + MEMCPY(sql_id_, sql_stat_key.sql_id_, common::OB_MAX_SQL_ID_LENGTH); + plan_hash_ = sql_stat_key.plan_hash_; + namespace_ = sql_stat_key.namespace_; + source_addr_ = sql_stat_key.source_addr_; + return ret; +} + +uint64_t ObSqlStatRecordKey::hash() const +{ + uint64_t hash_val = 0; + hash_val = source_addr_.hash(); + hash_val = murmurhash(&plan_hash_, sizeof(plan_hash_), hash_val); + hash_val = common::murmurhash(&sql_id_, common::OB_MAX_SQL_ID_LENGTH, hash_val); + return hash_val; +} + +int ObSqlStatRecordKey::hash(uint64_t &hash_val) const +{ + hash_val = hash(); + return OB_SUCCESS; +} + +bool ObSqlStatRecordKey::is_equal(const ObILibCacheKey &other) const +{ + const ObSqlStatRecordKey &sql_stat_key = static_cast(other); + bool cmp_ret = (0 == MEMCMP(sql_id_, sql_stat_key.sql_id_, common::OB_MAX_SQL_ID_LENGTH)) + && (sql_stat_key.plan_hash_ == plan_hash_) + && (sql_stat_key.source_addr_ == source_addr_); + return cmp_ret; +} + +int ObSqlStatInfo::init( + const ObSqlStatRecordKey& key, + const ObSQLSessionInfo &session_info, + const ObString &sql, + const ObPhysicalPlan *plan) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(key_.deep_copy(key))){ + LOG_WARN("failed to assign sql stat key", K(ret)); + } else { + sql_type_ = session_info.get_stmt_type(); + sql_cs_type_ = session_info.get_local_collation_connection(); + parsing_db_id_ = session_info.get_database_id(); + parsing_user_id_= session_info.get_user_id() < 0 ? 0: session_info.get_user_id(); + ObString db_name = session_info.get_database_name(); + if (!db_name.empty()) { + ObString::obstr_size_t size = MIN(static_cast(STRLEN(db_name.ptr()) + 1), OB_MAX_DATABASE_NAME_LENGTH); + MEMCPY(parsing_db_name_, db_name.ptr(), size); + parsing_db_name_[size] = '\0'; + } + + if (OB_ISNULL(plan)) { + if (!sql.empty()) { + sql.to_string(query_sql_, OB_MAX_SQL_STAT_QUERY_SQL_LEN); + int32_t size = MIN(sql.length(), OB_MAX_SQL_STAT_QUERY_SQL_LEN); + query_sql_[size] = '\0'; + } + } else { + plan_id_ = plan->get_plan_id(); + plan_type_ = plan->get_plan_type(); + first_load_time_ = plan->stat_.gen_time_; + ObString src_stmt; + if (plan->need_param()) { + src_stmt = plan->stat_.stmt_; + } else { + src_stmt = plan->stat_.raw_sql_; + } + if (!src_stmt.empty()) { + src_stmt.to_string(query_sql_, OB_MAX_SQL_STAT_QUERY_SQL_LEN); + int32_t size = MIN(src_stmt.length(), OB_MAX_SQL_STAT_QUERY_SQL_LEN); + query_sql_[size] = '\0'; + } + } + } + return ret; +} + +void ObSqlStatInfo::reset() +{ + key_.reset(); + plan_id_ = 0; + plan_type_ = 0; + parsing_db_id_ = 0; + query_sql_[0] = '\0'; + query_sql_[OB_MAX_SQL_STAT_QUERY_SQL_LEN] = '\0'; + sql_cs_type_ = common::CS_TYPE_INVALID; + sql_type_ = 0; + parsing_db_name_[0] = '\0'; + parsing_db_name_[OB_MAX_DATABASE_NAME_LENGTH] = '\0'; + first_load_time_ = 0; +} + +int ObSqlStatInfo::assign(const ObSqlStatInfo& other) +{ + int ret = OB_SUCCESS; + common::ObArenaAllocator no_use; + if (OB_FAIL(key_.deep_copy(no_use , other.get_key()))){ + LOG_WARN("failed to assign sql stat key", K(ret)); + } else { + plan_id_ = other.get_plan_id(); + plan_type_ = other.get_plan_type(); + parsing_db_id_ = other.get_parsing_db_id(); + parsing_user_id_ = other.get_parsing_user_id(); + MEMCPY(query_sql_, other.get_query_sql(), static_cast(STRLEN(other.get_query_sql()) + 1)); + MEMCPY(parsing_db_name_, other.get_parsing_db_name(), static_cast(STRLEN(other.get_parsing_db_name()) + 1)); + sql_cs_type_ = other.get_sql_cs_type(); + sql_type_ = other.get_sql_type(); + first_load_time_ = other.get_first_load_time(); + } + return ret; +} + +ObExecutingSqlStatRecord::ObExecutingSqlStatRecord() +{ + is_in_retry_ = false; + is_route_miss_ = false; + is_plan_cache_hit_ = false; +#define DEF_SQL_STAT_ITEM_INIT(def_name) \ + def_name##_start_ = 0; \ + def_name##_end_ = 0; + DEF_SQL_STAT_ITEM_INIT(disk_reads); + DEF_SQL_STAT_ITEM_INIT(buffer_gets); + DEF_SQL_STAT_ITEM_INIT(elapsed_time); + DEF_SQL_STAT_ITEM_INIT(cpu_time); + DEF_SQL_STAT_ITEM_INIT(ccwait); + DEF_SQL_STAT_ITEM_INIT(userio_wait); + DEF_SQL_STAT_ITEM_INIT(apwait); + DEF_SQL_STAT_ITEM_INIT(physical_read_requests); + DEF_SQL_STAT_ITEM_INIT(physical_read_bytes); + DEF_SQL_STAT_ITEM_INIT(write_throttle); + DEF_SQL_STAT_ITEM_INIT(rows_processed); + DEF_SQL_STAT_ITEM_INIT(memstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(rpc); + DEF_SQL_STAT_ITEM_INIT(fetches); + DEF_SQL_STAT_ITEM_INIT(partition); + DEF_SQL_STAT_ITEM_INIT(nested_sql); +#undef DEF_SQL_STAT_ITEM_INIT +} + +#define RECORD_ITEM(se) \ + do { \ + ObDiagnosticInfo *di_info = ObLocalDiagnosticInfo::get(); \ + elapsed_time_##se##_ = rdtsc() * 1000 / OBSERVER.get_cpu_frequency_khz(); \ + if (OB_NOT_NULL(di_info)) { \ + ObStatEventAddStatArray &arr = di_info->get_add_stat_stats(); \ + disk_reads_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::IO_READ_COUNT); \ + buffer_gets_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::ROW_CACHE_HIT) * 2 + \ + EVENT_STAT_GET(arr, ObStatEventIds::FUSE_ROW_CACHE_HIT) * 2 + \ + EVENT_STAT_GET(arr, ObStatEventIds::BLOOM_FILTER_FILTS) * 2 + \ + EVENT_STAT_GET(arr, ObStatEventIds::BLOCK_CACHE_HIT) + \ + disk_reads_##se##_; \ + cpu_time_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::SYS_TIME_MODEL_DB_CPU); \ + ccwait_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::CCWAIT_TIME); \ + userio_wait_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::USER_IO_WAIT_TIME); \ + apwait_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::APWAIT_TIME); \ + physical_read_requests_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::IO_READ_COUNT); \ + physical_read_bytes_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::IO_READ_BYTES); \ + write_throttle_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::STORAGE_WRITING_THROTTLE_TIME); \ + memstore_read_rows_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::MEMSTORE_READ_ROW_COUNT); \ + minor_ssstore_read_rows_##se##_ = \ + EVENT_STAT_GET(arr, ObStatEventIds::MINOR_SSSTORE_READ_ROW_COUNT); \ + major_ssstore_read_rows_##se##_ = \ + EVENT_STAT_GET(arr, ObStatEventIds::MAJOR_SSSTORE_READ_ROW_COUNT); \ + rpc_##se##_ = EVENT_STAT_GET(arr, ObStatEventIds::RPC_PACKET_OUT); \ + } \ + } while (0); + +void ObExecutingSqlStatRecord::reset() +{ + is_in_retry_ = false; + is_route_miss_ = false; + is_plan_cache_hit_ = false; +#define DEF_SQL_STAT_ITEM_INIT(def_name) \ + def_name##_start_ = 0; \ + def_name##_end_ = 0; + DEF_SQL_STAT_ITEM_INIT(disk_reads); + DEF_SQL_STAT_ITEM_INIT(buffer_gets); + DEF_SQL_STAT_ITEM_INIT(elapsed_time); + DEF_SQL_STAT_ITEM_INIT(cpu_time); + DEF_SQL_STAT_ITEM_INIT(ccwait); + DEF_SQL_STAT_ITEM_INIT(userio_wait); + DEF_SQL_STAT_ITEM_INIT(apwait); + DEF_SQL_STAT_ITEM_INIT(physical_read_requests); + DEF_SQL_STAT_ITEM_INIT(physical_read_bytes); + DEF_SQL_STAT_ITEM_INIT(write_throttle); + DEF_SQL_STAT_ITEM_INIT(rows_processed); + DEF_SQL_STAT_ITEM_INIT(memstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_INIT(rpc); + DEF_SQL_STAT_ITEM_INIT(fetches); + DEF_SQL_STAT_ITEM_INIT(partition); + DEF_SQL_STAT_ITEM_INIT(nested_sql); +#undef DEF_SQL_STAT_ITEM_INIT +} + +int ObExecutingSqlStatRecord::assign(const ObExecutingSqlStatRecord& other) +{ + is_in_retry_ = other.get_is_in_retry(); + is_route_miss_ = other.is_route_miss(); + is_plan_cache_hit_ = other.is_plan_cache_hit(); +#define DEF_SQL_STAT_ITEM_COPY(def_name) \ + def_name##_start_ = other.def_name##_start_; \ + def_name##_end_ = other.def_name##_end_; + DEF_SQL_STAT_ITEM_COPY(disk_reads); + DEF_SQL_STAT_ITEM_COPY(buffer_gets); + DEF_SQL_STAT_ITEM_COPY(elapsed_time); + DEF_SQL_STAT_ITEM_COPY(cpu_time); + DEF_SQL_STAT_ITEM_COPY(ccwait); + DEF_SQL_STAT_ITEM_COPY(userio_wait); + DEF_SQL_STAT_ITEM_COPY(apwait); + DEF_SQL_STAT_ITEM_COPY(physical_read_requests); + DEF_SQL_STAT_ITEM_COPY(physical_read_bytes); + DEF_SQL_STAT_ITEM_COPY(write_throttle); + DEF_SQL_STAT_ITEM_COPY(rows_processed); + DEF_SQL_STAT_ITEM_COPY(memstore_read_rows); + DEF_SQL_STAT_ITEM_COPY(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_COPY(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_COPY(rpc); + DEF_SQL_STAT_ITEM_COPY(fetches); + DEF_SQL_STAT_ITEM_COPY(partition); + DEF_SQL_STAT_ITEM_COPY(nested_sql); +#undef DEF_SQL_STAT_ITEM_COPY + return OB_SUCCESS; +} + +int ObExecutingSqlStatRecord::record_sqlstat_start_value() +{ + RECORD_ITEM(start); + return OB_SUCCESS; +} + +int ObExecutingSqlStatRecord::record_sqlstat_end_value() +{ + RECORD_ITEM(end); + return OB_SUCCESS; +} + +#undef RECORD_ITEM + +int ObExecutingSqlStatRecord::move_to_sqlstat_cache( + ObSQLSessionInfo &session_info, + ObString &cur_sql, + ObPhysicalPlan *plan /*= nullptr*/, + const bool is_px_remote_exec /*= false*/) +{ + int ret = OB_SUCCESS; + // 1. init key + ObSqlStatRecordKey key; + session_info.get_cur_sql_id(key.sql_id_, sizeof(key.sql_id_)); + key.set_plan_hash(plan== nullptr? session_info.get_current_plan_hash(): plan->get_plan_hash_value()); + if (is_px_remote_exec) { + key.set_source_addr(session_info.get_peer_addr()); + } + LOG_DEBUG("view sqlstat cache key and query_sql", K(ret), K(key), K(cur_sql)); + + if (key.is_valid()) { + if (OB_ISNULL(plan)) { + ObCacheObjGuard guard; + guard.init(sql::CacheRefHandleID::SQL_STAT_NODE_HANDLE); + bool is_use_cache = true; + if (OB_FAIL(ObSqlStatRecordUtil::get_cache_obj(key, guard))) { + if (ret == OB_SQL_PC_NOT_EXIST) { + // not found, need create + ret =OB_SUCCESS; + is_use_cache = false; + if (OB_FAIL(ObSqlStatRecordUtil::create_cache_obj(key, guard))) { + LOG_WARN("failed to create cache obj", K(ret)); + } + } else { + LOG_WARN("failed to get cache obj", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_ISNULL(guard.get_cache_obj())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache obj is NULL", KR(ret)); + } else { + ObSqlStatRecordObj *cache_obj = static_cast(guard.get_cache_obj()); + ObExecutedSqlStatRecord *sql_stat_value = cache_obj->get_record_value(); + if (!is_use_cache) { + if (OB_FAIL(sql_stat_value->get_sql_stat_info().init(key, session_info, cur_sql, plan))) { + LOG_WARN("failed to init sql stat info", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(sql_stat_value->sum_stat_value(*this))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } + } + } + } + } else { + ObExecutedSqlStatRecord *sql_stat_value = const_cast(&(plan->sql_stat_record_value_)); + if (OB_ISNULL(sql_stat_value)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_stat_value is NULL", KR(ret)); + } else { + if (!sql_stat_value->get_key().is_valid()) { + if (OB_FAIL(sql_stat_value->get_sql_stat_info().init(key, session_info, cur_sql, plan))) { + LOG_WARN("failed to init sql stat info", K(ret)); + } + } + + if (OB_SUCC(ret) && OB_FAIL(sql_stat_value->sum_stat_value(*this))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } + } + } + } else { + LOG_WARN("the key is not valid which at plan cache mgr", KR(ret)); + } + return ret; +} + + +int ObExecutingSqlStatRecord::move_to_sqlstat_cache(ObSqlStatRecordKey& key) +{ + int ret = OB_SUCCESS; + if (key.is_valid()) { + ObCacheObjGuard guard; + guard.init(sql::CacheRefHandleID::SQL_STAT_NODE_HANDLE); + bool is_use_cache = true; + if (OB_FAIL(ObSqlStatRecordUtil::get_cache_obj(key, guard))) { + if (ret == OB_SQL_PC_NOT_EXIST) { + // not found, need create + ret =OB_SUCCESS; + is_use_cache = false; + if (OB_FAIL(ObSqlStatRecordUtil::create_cache_obj(key, guard))) { + LOG_WARN("failed to create cache obj", K(ret)); + } + } else { + LOG_WARN("failed to get cache obj", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_ISNULL(guard.get_cache_obj())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache obj is NULL", KR(ret)); + } else { + ObSqlStatRecordObj *cache_obj = static_cast(guard.get_cache_obj()); + ObExecutedSqlStatRecord *sql_stat_value = cache_obj->get_record_value(); + if (!is_use_cache) { + sql_stat_value->get_sql_stat_info().set_key(key); + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(sql_stat_value->sum_stat_value(*this))) { + LOG_WARN("sql_stat_value sum value failed", KR(ret)); + } + } + } + } + } + return ret; +} + +int ObExecutedSqlStatRecord::copy_sql_stat_info(const ObSqlStatInfo& sql_stat_info) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(sql_stat_info_.assign(sql_stat_info))) { + LOG_WARN("failed to assign sql stat info",K(ret), K(sql_stat_info)); + } + return ret; +} + +int ObExecutedSqlStatRecord::sum_stat_value(ObExecutingSqlStatRecord& executing_record) +{ + int ret = OB_SUCCESS; + (void)ATOMIC_AAF(&executions_total_, executing_record.get_is_in_retry()? 0:1 ); + (void)ATOMIC_AAF(&retry_total_, executing_record.get_is_in_retry()? 1:0 ); + + (void)ATOMIC_AAF(&disk_reads_total_, executing_record.get_disk_reads_delta()); + (void)ATOMIC_AAF(&buffer_gets_total_, executing_record.get_buffer_gets_delta()); + (void)ATOMIC_AAF(&elapsed_time_total_, executing_record.get_elapsed_time_delta()); + (void)ATOMIC_AAF(&cpu_time_total_, executing_record.get_cpu_time_delta()); + (void)ATOMIC_AAF(&ccwait_total_, executing_record.get_ccwait_delta()); + (void)ATOMIC_AAF(&userio_wait_total_, executing_record.get_userio_wait_delta()); + (void)ATOMIC_AAF(&apwait_total_, executing_record.get_apwait_delta()); + (void)ATOMIC_AAF(&physical_read_requests_total_, executing_record.get_physical_read_requests_delta()); + (void)ATOMIC_AAF(&physical_read_bytes_total_, executing_record.get_physical_read_bytes_delta()); + (void)ATOMIC_AAF(&write_throttle_total_, executing_record.get_write_throttle_delta()); + (void)ATOMIC_AAF(&rows_processed_total_, executing_record.get_rows_processed_delta()); + (void)ATOMIC_AAF(&memstore_read_rows_total_, executing_record.get_memstore_read_rows_delta()); + (void)ATOMIC_AAF(&minor_ssstore_read_rows_total_, executing_record.get_minor_ssstore_read_rows_delta()); + (void)ATOMIC_AAF(&major_ssstore_read_rows_total_, executing_record.get_major_ssstore_read_rows_delta()); + (void)ATOMIC_AAF(&rpc_total_, executing_record.get_rpc_delta()); + (void)ATOMIC_AAF(&fetches_total_, executing_record.get_fetches_delta()); + (void)ATOMIC_AAF(&partition_total_, executing_record.get_partition_delta()); + (void)ATOMIC_AAF(&nested_sql_total_, executing_record.get_nested_sql_delta()); + (void)ATOMIC_AAF(&route_miss_total_, executing_record.is_route_miss()? 1:0); + (void)ATOMIC_AAF(&plan_cache_hit_total_, executing_record.is_plan_cache_hit()); + return OB_SUCCESS; +} + +int ObExecutedSqlStatRecord::sum_stat_value(ObExecutedSqlStatRecord& executed_record) +{ + int ret = OB_SUCCESS; + (void)ATOMIC_AAF(&executions_total_, executed_record.get_executions_total() ); + (void)ATOMIC_AAF(&retry_total_, executed_record.get_retry_total() ); + + (void)ATOMIC_AAF(&disk_reads_total_, executed_record.get_disk_reads_total()); + (void)ATOMIC_AAF(&buffer_gets_total_, executed_record.get_buffer_gets_total()); + (void)ATOMIC_AAF(&elapsed_time_total_, executed_record.get_elapsed_time_total()); + (void)ATOMIC_AAF(&cpu_time_total_, executed_record.get_cpu_time_total()); + (void)ATOMIC_AAF(&ccwait_total_, executed_record.get_ccwait_total()); + (void)ATOMIC_AAF(&userio_wait_total_, executed_record.get_userio_wait_total()); + (void)ATOMIC_AAF(&apwait_total_, executed_record.get_apwait_total()); + (void)ATOMIC_AAF(&physical_read_requests_total_, executed_record.get_physical_read_requests_total()); + (void)ATOMIC_AAF(&physical_read_bytes_total_, executed_record.get_physical_read_bytes_total()); + (void)ATOMIC_AAF(&write_throttle_total_, executed_record.get_write_throttle_total()); + (void)ATOMIC_AAF(&rows_processed_total_, executed_record.get_rows_processed_total()); + (void)ATOMIC_AAF(&memstore_read_rows_total_, executed_record.get_memstore_read_rows_total()); + (void)ATOMIC_AAF(&minor_ssstore_read_rows_total_, executed_record.get_minor_ssstore_read_rows_total()); + (void)ATOMIC_AAF(&major_ssstore_read_rows_total_, executed_record.get_major_ssstore_read_rows_total()); + (void)ATOMIC_AAF(&rpc_total_, executed_record.get_rpc_total()); + (void)ATOMIC_AAF(&fetches_total_, executed_record.get_fetches_total()); + (void)ATOMIC_AAF(&partition_total_, executed_record.get_partition_total()); + (void)ATOMIC_AAF(&nested_sql_total_, executed_record.get_nested_sql_total()); + (void)ATOMIC_AAF(&route_miss_total_, executed_record.get_route_miss_total()); + return OB_SUCCESS; +} +int ObExecutedSqlStatRecord::assign(const ObExecutedSqlStatRecord& other) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(sql_stat_info_.assign(other.get_sql_stat_info()))){ + LOG_WARN("failed to assign sql stat info", K(ret)); + } else { +#define DEF_ASSIGN_FUNC(def_name) \ + def_name##_total_ = other.get_##def_name##_total(); \ + def_name##_last_snap_ = other.get_##def_name##_last_snap(); + DEF_ASSIGN_FUNC(executions); + DEF_ASSIGN_FUNC(disk_reads); + DEF_ASSIGN_FUNC(buffer_gets); + DEF_ASSIGN_FUNC(elapsed_time); + DEF_ASSIGN_FUNC(cpu_time); + DEF_ASSIGN_FUNC(ccwait); + DEF_ASSIGN_FUNC(userio_wait); + DEF_ASSIGN_FUNC(apwait); + DEF_ASSIGN_FUNC(physical_read_requests); + DEF_ASSIGN_FUNC(physical_read_bytes); + DEF_ASSIGN_FUNC(write_throttle); + DEF_ASSIGN_FUNC(rows_processed); + DEF_ASSIGN_FUNC(memstore_read_rows); + DEF_ASSIGN_FUNC(minor_ssstore_read_rows); + DEF_ASSIGN_FUNC(major_ssstore_read_rows); + DEF_ASSIGN_FUNC(rpc); + DEF_ASSIGN_FUNC(fetches); + DEF_ASSIGN_FUNC(retry); + DEF_ASSIGN_FUNC(partition); + DEF_ASSIGN_FUNC(nested_sql); + DEF_ASSIGN_FUNC(route_miss); + DEF_ASSIGN_FUNC(plan_cache_hit); +#undef DEF_ASSIGN_FUNC + } + return ret; +} + +int ObExecutedSqlStatRecord::reset() +{ + int ret = OB_SUCCESS; + sql_stat_info_.reset(); +#define DEF_RESET_FUNC(def_name) \ + def_name##_total_ = 0; \ + def_name##_last_snap_ = 0; + DEF_RESET_FUNC(executions); + DEF_RESET_FUNC(disk_reads); + DEF_RESET_FUNC(buffer_gets); + DEF_RESET_FUNC(elapsed_time); + DEF_RESET_FUNC(cpu_time); + DEF_RESET_FUNC(ccwait); + DEF_RESET_FUNC(userio_wait); + DEF_RESET_FUNC(apwait); + DEF_RESET_FUNC(physical_read_requests); + DEF_RESET_FUNC(physical_read_bytes); + DEF_RESET_FUNC(write_throttle); + DEF_RESET_FUNC(rows_processed); + DEF_RESET_FUNC(memstore_read_rows); + DEF_RESET_FUNC(minor_ssstore_read_rows); + DEF_RESET_FUNC(major_ssstore_read_rows); + DEF_RESET_FUNC(rpc); + DEF_RESET_FUNC(fetches); + DEF_RESET_FUNC(retry); + DEF_RESET_FUNC(partition); + DEF_RESET_FUNC(nested_sql); + DEF_RESET_FUNC(route_miss); + DEF_RESET_FUNC(plan_cache_hit); +#undef DEF_RESET_FUNC + + return ret; +} + +int ObExecutedSqlStatRecord::update_last_snap_record_value() +{ + int ret = OB_SUCCESS; + #define DEF_UPDATE_LAST_SNAP_FUNC(def_name) \ + def_name##_last_snap_ = def_name##_total_; + DEF_UPDATE_LAST_SNAP_FUNC(executions); + DEF_UPDATE_LAST_SNAP_FUNC(disk_reads); + DEF_UPDATE_LAST_SNAP_FUNC(buffer_gets); + DEF_UPDATE_LAST_SNAP_FUNC(elapsed_time); + DEF_UPDATE_LAST_SNAP_FUNC(cpu_time); + DEF_UPDATE_LAST_SNAP_FUNC(ccwait); + DEF_UPDATE_LAST_SNAP_FUNC(userio_wait); + DEF_UPDATE_LAST_SNAP_FUNC(apwait); + DEF_UPDATE_LAST_SNAP_FUNC(physical_read_requests); + DEF_UPDATE_LAST_SNAP_FUNC(physical_read_bytes); + DEF_UPDATE_LAST_SNAP_FUNC(write_throttle); + DEF_UPDATE_LAST_SNAP_FUNC(rows_processed); + DEF_UPDATE_LAST_SNAP_FUNC(memstore_read_rows); + DEF_UPDATE_LAST_SNAP_FUNC(minor_ssstore_read_rows); + DEF_UPDATE_LAST_SNAP_FUNC(major_ssstore_read_rows); + DEF_UPDATE_LAST_SNAP_FUNC(rpc); + DEF_UPDATE_LAST_SNAP_FUNC(fetches); + DEF_UPDATE_LAST_SNAP_FUNC(retry); + DEF_UPDATE_LAST_SNAP_FUNC(partition); + DEF_UPDATE_LAST_SNAP_FUNC(nested_sql); + DEF_UPDATE_LAST_SNAP_FUNC(route_miss); + DEF_UPDATE_LAST_SNAP_FUNC(plan_cache_hit); + #undef DEF_UPDATE_LAST_SNAP_FUNC + return ret; +} +/*************************************************************************************************/ + +int ObSqlStatRecordNode::inner_get_cache_obj(ObILibCacheCtx &ctx, + ObILibCacheKey *key, + ObILibCacheObject *&cache_obj) +{ + UNUSED(ctx); + UNUSED(key); + int ret = OB_SUCCESS; + if (OB_ISNULL(cache_obj_)) { + ret = OB_SQL_PC_NOT_EXIST; + LOG_WARN("fail to get cache obj", K(ret)); + } else { + cache_obj = cache_obj_; + } + return ret; +} + +int ObSqlStatRecordNode::inner_add_cache_obj(ObILibCacheCtx &ctx, + ObILibCacheKey *key, + ObILibCacheObject *cache_obj) +{ + UNUSED(ctx); + UNUSED(key); + int ret = OB_SUCCESS; + if (OB_ISNULL(cache_obj)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache obj is null", K(ret)); + } else { + cache_obj_ = cache_obj; + } + return ret; +} + +int ObSqlStatRecordUtil::get_cache_obj(ObSqlStatRecordKey &key, ObCacheObjGuard& guard) +{ + int ret = OB_SUCCESS; + sql::ObILibCacheCtx cache_ctx; + ObPlanCache* lib_cache = nullptr; + ObReqTimeGuard req_timeinfo_guard; + if (OB_ISNULL(GCTX.omt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get multi tenant from GCTX", K(ret)); + } else if (OB_ISNULL(lib_cache = MTL(ObPlanCache*))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get plan cache", K(ret)); + } else if (OB_FAIL(lib_cache->get_cache_obj(cache_ctx, &key, guard))) { + if (ret == OB_SQL_PC_NOT_EXIST) { + LOG_INFO("sql stat record not found",K(ret), K(key)); + } else { + LOG_WARN("fail to get cache obj", K(ret), K(key)); + } + } + return ret; +} + +int ObSqlStatRecordUtil::create_cache_obj(ObSqlStatRecordKey &key, ObCacheObjGuard& guard) +{ + int ret = OB_SUCCESS; + DISABLE_SQL_MEMLEAK_GUARD; + sql::ObILibCacheCtx cache_ctx; + ObPlanCache* lib_cache = nullptr; + ObSqlStatRecordObj *cache_obj = nullptr; + ObReqTimeGuard req_timeinfo_guard; + if (OB_ISNULL(GCTX.omt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get multi tenant from GCTX", K(ret)); + } else if (OB_ISNULL(lib_cache = MTL(ObPlanCache*))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get plan cache", K(ret)); + } else if (OB_FAIL(ObCacheObjectFactory::alloc(guard, + ObLibCacheNameSpace::NS_SQLSTAT, + lib_cache->get_tenant_id()))) { + LOG_WARN("fail to alloc new cache obj", K(ret)); + } else if (OB_ISNULL(cache_obj = static_cast(guard.get_cache_obj()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get cache obj", K(ret)); + } else if (OB_FAIL(lib_cache->add_cache_obj(cache_ctx, &key, cache_obj))) { + LOG_WARN( "fail to add cache obj to lib cache", K(ret), K(key)); + } + return ret; +} +} // end of namespace sql +} // end of namespace oceanbase diff --git a/src/sql/monitor/ob_sql_stat_record.h b/src/sql/monitor/ob_sql_stat_record.h new file mode 100644 index 0000000000..fa409cbf33 --- /dev/null +++ b/src/sql/monitor/ob_sql_stat_record.h @@ -0,0 +1,342 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ +#ifndef _OB_SQL_STAT_RECORD_H_ +#define _OB_SQL_STAT_RECORD_H_ +#include "sql/ob_sql_context.h" +#include "sql/plan_cache/ob_i_lib_cache_key.h" +#include "sql/plan_cache/ob_i_lib_cache_node.h" +#include "sql/plan_cache/ob_i_lib_cache_object.h" +#include "sql/plan_cache/ob_i_lib_cache_context.h" +#include "lib/utility/utility.h" +#include "sql/plan_cache/ob_lib_cache_register.h" +#include "lib/atomic/ob_atomic.h" + +#define OB_MAX_SQL_STAT_QUERY_SQL_LEN 1024 +namespace oceanbase +{ +namespace sql +{ + +struct ObSqlStatRecordKey : public sql::ObILibCacheKey +{ +public: + ObSqlStatRecordKey() + : sql::ObILibCacheKey(ObLibCacheNameSpace::NS_SQLSTAT), + plan_hash_(0), + source_addr_() + { + sql_id_[0] = '\0'; + sql_id_[common::OB_MAX_SQL_ID_LENGTH] = '\0'; + } + + void reset() + { + namespace_ = ObLibCacheNameSpace::NS_SQLSTAT; + sql_id_[0] = '\0'; + sql_id_[common::OB_MAX_SQL_ID_LENGTH] = '\0'; + plan_hash_ = 0; + source_addr_.reset(); + } + virtual int deep_copy(common::ObIAllocator &allocator, const sql::ObILibCacheKey &other); + int deep_copy(const sql::ObILibCacheKey &other); + virtual uint64_t hash() const; + int hash(uint64_t &hash_val) const; + virtual bool is_equal(const sql::ObILibCacheKey &other) const; + inline bool is_valid() const { return sql_id_[0] != '\0'; } + void set_sql_id(const ObString& sql_id) { sql_id.to_string(sql_id_, OB_MAX_SQL_ID_LENGTH); } + void set_plan_hash(const uint64_t plan_hash_val) { ATOMIC_STORE(&plan_hash_,plan_hash_val); } + void set_source_addr(const ObAddr &source_addr) { source_addr_ = source_addr; } + TO_STRING_KV(K_(sql_id), K_(plan_hash), K_(source_addr)); +public: + char sql_id_[common::OB_MAX_SQL_ID_LENGTH + 1]; + uint64_t plan_hash_; + common::ObAddr source_addr_; +}; + +class ObSqlStatInfo +{ +public: + ObSqlStatInfo(): key_(), plan_id_(0), plan_type_(0), parsing_db_id_(0) + { + query_sql_[0] = '\0'; + query_sql_[OB_MAX_SQL_STAT_QUERY_SQL_LEN] = '\0'; + sql_cs_type_ = common::CS_TYPE_INVALID; + sql_type_ = 0; + parsing_db_name_[0] = '\0'; + parsing_db_name_[OB_MAX_DATABASE_NAME_LENGTH] = '\0'; + first_load_time_ = 0; + } + ~ObSqlStatInfo() = default; + int init(const ObSqlStatRecordKey& key, + const ObSQLSessionInfo &session_info, + const ObString &sql, + const ObPhysicalPlan *plan); + void reset(); + int assign(const ObSqlStatInfo& other); + const ObSqlStatRecordKey& get_key() const {return key_;} + ObSqlStatRecordKey& get_key() {return key_;} + void set_key(ObSqlStatRecordKey& key) { key_.deep_copy(key); } + int64_t get_plan_id() const { return plan_id_; } + int64_t get_plan_type() const { return plan_type_;} + const char* get_query_sql() const {return query_sql_; } + int64_t get_sql_type() const { return sql_type_;} + ObCollationType get_sql_cs_type() const {return sql_cs_type_; } + int64_t get_parsing_db_id() const { return parsing_db_id_; } + const char* get_parsing_db_name() const { return parsing_db_name_; } + int64_t get_parsing_user_id() const { return parsing_user_id_; } + int64_t get_first_load_time() const { return first_load_time_; } + void set_first_load_time(const int64_t first_load_time) { first_load_time_ = first_load_time; } + TO_STRING_KV(K_(key), K_(plan_id), K_(plan_type), K_(query_sql), K_(sql_type), K_(parsing_db_id), K_(parsing_user_id)); +private: + ObSqlStatRecordKey key_; + int64_t plan_id_; + int64_t plan_type_; + char query_sql_[OB_MAX_SQL_STAT_QUERY_SQL_LEN+1]; + common::ObCollationType sql_cs_type_; + int64_t sql_type_; + int64_t parsing_db_id_; + char parsing_db_name_[OB_MAX_DATABASE_NAME_LENGTH+1]; + int64_t parsing_user_id_; + int64_t first_load_time_; +}; + +struct ObSqlCtx; +class ObExecutingSqlStatRecord +{ +public: + ObExecutingSqlStatRecord(); + ~ObExecutingSqlStatRecord() = default; + void reset(); + int assign(const ObExecutingSqlStatRecord& other); + int record_sqlstat_start_value(); + int record_sqlstat_end_value(); + // WARNNIGN!!! + // It is forbidden to use the cur_plan_ pointer on sql_ctx_, + // which can be modified and risks CORE. It is only safe to use the result_set pointer. + int move_to_sqlstat_cache(ObSQLSessionInfo &session_info, + ObString &cur_sql, + ObPhysicalPlan *plan = nullptr, + const bool is_px_remote_exec = false); + int move_to_sqlstat_cache(ObSqlStatRecordKey& key); // just for das remote exec + + bool get_is_in_retry() const { return is_in_retry_; } + void set_is_in_retry(const bool is_in_retry) { is_in_retry_ = is_in_retry; } + void set_rows_processed(int64_t rows_processed) { rows_processed_end_ = rows_processed; } + void inc_fetch_cnt() { fetches_end_ ++; } + void set_partition_cnt(int64_t partition_cnt) { partition_end_ = partition_cnt; } + bool is_route_miss() const { return is_route_miss_; } + void set_is_route_miss(const bool is_route_miss) { is_route_miss_ = is_route_miss; } + bool is_plan_cache_hit() const { return is_plan_cache_hit_;} + void set_is_plan_cache_hit(const bool is_plan_cache_hit) { is_plan_cache_hit_ = is_plan_cache_hit; } +#define DEF_SQL_STAT_ITEM_DELTA_FUNC(def_name) \ + int64_t get_##def_name##_delta() const { \ + int64_t delta = def_name##_end_ - def_name##_start_; \ + return delta>0? delta: 0; \ + } + DEF_SQL_STAT_ITEM_DELTA_FUNC(disk_reads); + DEF_SQL_STAT_ITEM_DELTA_FUNC(buffer_gets); + DEF_SQL_STAT_ITEM_DELTA_FUNC(elapsed_time); + DEF_SQL_STAT_ITEM_DELTA_FUNC(cpu_time); + DEF_SQL_STAT_ITEM_DELTA_FUNC(ccwait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(userio_wait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(apwait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(physical_read_requests); + DEF_SQL_STAT_ITEM_DELTA_FUNC(physical_read_bytes); + DEF_SQL_STAT_ITEM_DELTA_FUNC(write_throttle); + DEF_SQL_STAT_ITEM_DELTA_FUNC(rows_processed); + DEF_SQL_STAT_ITEM_DELTA_FUNC(memstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(rpc); + DEF_SQL_STAT_ITEM_DELTA_FUNC(fetches); + DEF_SQL_STAT_ITEM_DELTA_FUNC(partition); + DEF_SQL_STAT_ITEM_DELTA_FUNC(nested_sql); +#undef DEF_SQL_STAT_ITEM_DELTA_FUNC +public: + bool is_in_retry_; + bool is_route_miss_; + bool is_plan_cache_hit_; +#define DEF_SQL_STAT_ITEM(def_name) \ + int64_t def_name##_start_; \ + int64_t def_name##_end_; + DEF_SQL_STAT_ITEM(disk_reads); + DEF_SQL_STAT_ITEM(buffer_gets); + DEF_SQL_STAT_ITEM(elapsed_time); + DEF_SQL_STAT_ITEM(cpu_time); + DEF_SQL_STAT_ITEM(ccwait); + DEF_SQL_STAT_ITEM(userio_wait); + DEF_SQL_STAT_ITEM(apwait); + DEF_SQL_STAT_ITEM(physical_read_requests); + DEF_SQL_STAT_ITEM(physical_read_bytes); + DEF_SQL_STAT_ITEM(write_throttle); + DEF_SQL_STAT_ITEM(rows_processed); + DEF_SQL_STAT_ITEM(memstore_read_rows); + DEF_SQL_STAT_ITEM(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM(rpc); + DEF_SQL_STAT_ITEM(fetches); + DEF_SQL_STAT_ITEM(partition); + DEF_SQL_STAT_ITEM(nested_sql); +#undef DEF_SQL_STAT_ITEM +}; + +class ObExecutedSqlStatRecord +{ +public: + ObExecutedSqlStatRecord(): sql_stat_info_() + { +#define DEF_SQL_STAT_ITEM_CONSTRUCT(def_name) \ + def_name##_total_ = 0; \ + def_name##_last_snap_ = 0; + DEF_SQL_STAT_ITEM_CONSTRUCT(executions); + DEF_SQL_STAT_ITEM_CONSTRUCT(disk_reads); + DEF_SQL_STAT_ITEM_CONSTRUCT(buffer_gets); + DEF_SQL_STAT_ITEM_CONSTRUCT(elapsed_time); + DEF_SQL_STAT_ITEM_CONSTRUCT(cpu_time); + DEF_SQL_STAT_ITEM_CONSTRUCT(ccwait); + DEF_SQL_STAT_ITEM_CONSTRUCT(userio_wait); + DEF_SQL_STAT_ITEM_CONSTRUCT(apwait); + DEF_SQL_STAT_ITEM_CONSTRUCT(physical_read_requests); + DEF_SQL_STAT_ITEM_CONSTRUCT(physical_read_bytes); + DEF_SQL_STAT_ITEM_CONSTRUCT(write_throttle); + DEF_SQL_STAT_ITEM_CONSTRUCT(rows_processed); + DEF_SQL_STAT_ITEM_CONSTRUCT(memstore_read_rows); + DEF_SQL_STAT_ITEM_CONSTRUCT(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_CONSTRUCT(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_CONSTRUCT(rpc); + DEF_SQL_STAT_ITEM_CONSTRUCT(fetches); + DEF_SQL_STAT_ITEM_CONSTRUCT(retry); + DEF_SQL_STAT_ITEM_CONSTRUCT(partition); + DEF_SQL_STAT_ITEM_CONSTRUCT(nested_sql); + DEF_SQL_STAT_ITEM_CONSTRUCT(route_miss); + DEF_SQL_STAT_ITEM_CONSTRUCT(plan_cache_hit); +#undef DEF_SQL_STAT_ITEM_CONSTRUCT + } + + ~ObExecutedSqlStatRecord() = default; + int copy_sql_stat_info(const ObSqlStatInfo& sql_stat_info); + int sum_stat_value(ObExecutingSqlStatRecord& executing_record); + int sum_stat_value(ObExecutedSqlStatRecord& executed_record); + ObSqlStatInfo& get_sql_stat_info() {return sql_stat_info_;} + const ObSqlStatInfo& get_sql_stat_info() const {return sql_stat_info_;} + ObSqlStatRecordKey& get_key() {return sql_stat_info_.get_key();}; + const ObSqlStatRecordKey& get_key() const {return sql_stat_info_.get_key();}; + int assign(const ObExecutedSqlStatRecord& other); + int reset(); + int update_last_snap_record_value(); + #define DEF_SQL_STAT_ITEM_DELTA_FUNC(def_name) \ + int64_t get_##def_name##_total() const { return def_name##_total_;} \ + int64_t get_##def_name##_last_snap() const { return def_name##_last_snap_;} \ + int64_t get_##def_name##_delta() const { \ + int64_t delta = def_name##_total_ - def_name##_last_snap_; \ + return delta > 0 ? delta: 0; \ + } + DEF_SQL_STAT_ITEM_DELTA_FUNC(executions); + DEF_SQL_STAT_ITEM_DELTA_FUNC(disk_reads); + DEF_SQL_STAT_ITEM_DELTA_FUNC(buffer_gets); + DEF_SQL_STAT_ITEM_DELTA_FUNC(elapsed_time); + DEF_SQL_STAT_ITEM_DELTA_FUNC(cpu_time); + DEF_SQL_STAT_ITEM_DELTA_FUNC(ccwait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(userio_wait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(apwait); + DEF_SQL_STAT_ITEM_DELTA_FUNC(physical_read_requests); + DEF_SQL_STAT_ITEM_DELTA_FUNC(physical_read_bytes); + DEF_SQL_STAT_ITEM_DELTA_FUNC(write_throttle); + DEF_SQL_STAT_ITEM_DELTA_FUNC(rows_processed); + DEF_SQL_STAT_ITEM_DELTA_FUNC(memstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM_DELTA_FUNC(rpc); + DEF_SQL_STAT_ITEM_DELTA_FUNC(fetches); + DEF_SQL_STAT_ITEM_DELTA_FUNC(retry); + DEF_SQL_STAT_ITEM_DELTA_FUNC(partition); + DEF_SQL_STAT_ITEM_DELTA_FUNC(nested_sql); + DEF_SQL_STAT_ITEM_DELTA_FUNC(route_miss); + DEF_SQL_STAT_ITEM_DELTA_FUNC(plan_cache_hit); + #undef DEF_SQL_STAT_ITEM_DELTA_FUNC + + TO_STRING_KV(K_(sql_stat_info)); +private: + ObSqlStatInfo sql_stat_info_; + #define DEF_SQL_STAT_ITEM(def_name) \ + int64_t def_name##_total_; \ + int64_t def_name##_last_snap_; + DEF_SQL_STAT_ITEM(executions); + DEF_SQL_STAT_ITEM(disk_reads); + DEF_SQL_STAT_ITEM(buffer_gets); + DEF_SQL_STAT_ITEM(elapsed_time); + DEF_SQL_STAT_ITEM(cpu_time); + DEF_SQL_STAT_ITEM(ccwait); + DEF_SQL_STAT_ITEM(userio_wait); + DEF_SQL_STAT_ITEM(apwait); + DEF_SQL_STAT_ITEM(physical_read_requests); + DEF_SQL_STAT_ITEM(physical_read_bytes); + DEF_SQL_STAT_ITEM(write_throttle); + DEF_SQL_STAT_ITEM(rows_processed); + DEF_SQL_STAT_ITEM(memstore_read_rows); + DEF_SQL_STAT_ITEM(minor_ssstore_read_rows); + DEF_SQL_STAT_ITEM(major_ssstore_read_rows); + DEF_SQL_STAT_ITEM(rpc); + DEF_SQL_STAT_ITEM(fetches); + DEF_SQL_STAT_ITEM(retry); + DEF_SQL_STAT_ITEM(partition); + DEF_SQL_STAT_ITEM(nested_sql); + DEF_SQL_STAT_ITEM(route_miss); + DEF_SQL_STAT_ITEM(plan_cache_hit); + #undef DEF_SQL_STAT_ITEM +}; + + +/*************************************************************************************************/ + +class ObSqlStatRecordNode: public ObILibCacheNode +{ +public: + ObSqlStatRecordNode(ObPlanCache *lib_cache, lib::MemoryContext &mem_context) + : ObILibCacheNode(lib_cache, mem_context), + cache_obj_(nullptr) {} + virtual ~ObSqlStatRecordNode() {} + virtual int inner_get_cache_obj(sql::ObILibCacheCtx &ctx, + sql::ObILibCacheKey *key, + sql::ObILibCacheObject *&cache_obj) override; + virtual int inner_add_cache_obj(sql::ObILibCacheCtx &ctx, + sql::ObILibCacheKey *key, + sql::ObILibCacheObject *cache_obj) override; +private: + sql::ObILibCacheObject *cache_obj_; +}; + +class ObSqlStatRecordObj: public sql::ObILibCacheObject +{ +public: + ObSqlStatRecordObj(lib::MemoryContext &mem_context) + : sql::ObILibCacheObject(ObLibCacheNameSpace::NS_SQLSTAT, mem_context), + record_value_() {} + + virtual ~ObSqlStatRecordObj() = default; + OB_INLINE sql::ObExecutedSqlStatRecord* get_record_value() { return &record_value_; } + OB_INLINE const sql::ObExecutedSqlStatRecord* get_record_value() const { return &record_value_; } +private: + sql::ObExecutedSqlStatRecord record_value_; +}; + +class ObSqlStatRecordUtil +{ +public: + static int get_cache_obj(ObSqlStatRecordKey &key, ObCacheObjGuard& guard); + static int create_cache_obj(ObSqlStatRecordKey &key, ObCacheObjGuard& guard); + int add_cache_obj(ObSqlStatRecordKey &key, ObCacheObjGuard& guard); +}; +} // end sql +} // end oceanbase + +#endif /* _OB_SQL_STAT_RECORD_H_ */ diff --git a/src/sql/ob_end_trans_callback.cpp b/src/sql/ob_end_trans_callback.cpp index 1fd466c548..37427b66bd 100644 --- a/src/sql/ob_end_trans_callback.cpp +++ b/src/sql/ob_end_trans_callback.cpp @@ -17,6 +17,7 @@ #include "lib/profile/ob_perf_event.h" #include "sql/ob_sql_utils.h" #include "sql/session/ob_sql_session_info.h" +#include "lib/stat/ob_diagnostic_info_guard.h" using namespace oceanbase::transaction; using namespace oceanbase::common; namespace oceanbase @@ -44,12 +45,14 @@ ObExclusiveEndTransCallback::~ObExclusiveEndTransCallback() ObEndTransAsyncCallback::ObEndTransAsyncCallback() : ObExclusiveEndTransCallback(), - mysql_end_trans_cb_() + mysql_end_trans_cb_(), + diagnostic_info_(nullptr) { } ObEndTransAsyncCallback::~ObEndTransAsyncCallback() { + reset_diagnostic_info(); } void ObEndTransAsyncCallback::callback(int cb_param, const transaction::ObTransID &trans_id) @@ -60,14 +63,16 @@ void ObEndTransAsyncCallback::callback(int cb_param, const transaction::ObTransI void ObEndTransAsyncCallback::callback(int cb_param) { - sql::ObSQLSessionInfo *session_info = mysql_end_trans_cb_.get_sess_info_ptr(); // Add ASH flags to async commit of transactions // In the start of async commit in func named ` ObSqlTransControl::do_end_trans_() `, // set the ash flag named `in_committing_` to true. - if (NULL != session_info) { - ObActiveSessionGuard::setup_ash(session_info->get_ash_stat()); - ObActiveSessionGuard::get_stat().in_committing_ = false; - ObActiveSessionGuard::get_stat().in_sql_execution_ = true; + ObDiagnosticInfoSwitchGuard g(diagnostic_info_); + if (OB_NOT_NULL(diagnostic_info_)) { + common::ObDiagnosticInfo *di = diagnostic_info_; + reset_diagnostic_info(); + di->get_ash_stat().in_committing_ = false; + di->get_ash_stat().in_sql_execution_ = true; + di->end_wait_event(ObWaitEventIds::ASYNC_COMMITTING_WAIT, false); } bool need_disconnect = false; if (OB_UNLIKELY(!has_set_need_rollback_)) { @@ -92,7 +97,22 @@ void ObEndTransAsyncCallback::callback(int cb_param) cb_param = this->last_err_; mysql_end_trans_cb_.callback(cb_param); } +} +void ObEndTransAsyncCallback::set_diagnostic_info(common::ObDiagnosticInfo *diagnostic_info) +{ + if (nullptr == diagnostic_info_) { + diagnostic_info_ = diagnostic_info; + common::ObLocalDiagnosticInfo::inc_ref(diagnostic_info_); + } + +}; +void ObEndTransAsyncCallback::reset_diagnostic_info() +{ + if (nullptr != diagnostic_info_) { + common::ObLocalDiagnosticInfo::dec_ref(diagnostic_info_); + diagnostic_info_ = nullptr; + } } }/* ns sql*/ diff --git a/src/sql/ob_end_trans_callback.h b/src/sql/ob_end_trans_callback.h index daecc81ec6..cc3576e86e 100644 --- a/src/sql/ob_end_trans_callback.h +++ b/src/sql/ob_end_trans_callback.h @@ -97,10 +97,14 @@ public: { ObExclusiveEndTransCallback::reset(); mysql_end_trans_cb_.reset(); + reset_diagnostic_info(); } + void set_diagnostic_info(common::ObDiagnosticInfo *diagnostic_info); + void reset_diagnostic_info(); private: /* macro */ observer::ObSqlEndTransCb mysql_end_trans_cb_; + common::ObDiagnosticInfo *diagnostic_info_; DISALLOW_COPY_AND_ASSIGN(ObEndTransAsyncCallback); }; diff --git a/src/sql/ob_i_end_trans_callback.h b/src/sql/ob_i_end_trans_callback.h index b094554590..04a5bc47ff 100644 --- a/src/sql/ob_i_end_trans_callback.h +++ b/src/sql/ob_i_end_trans_callback.h @@ -100,6 +100,10 @@ public: call_counter_ = 0; callback_counter_ = 0; } + inline bool is_called() + { + return callback_counter_ == call_counter_; + } protected: // 为了检查是否存在重复调用callback,或漏调callback的问题 inline void CHECK_BALANCE(const char *type) const diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 2ffe548c1c..42d3ad28f6 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -151,8 +151,10 @@ OB_INLINE int ObResultSet::open_plan() int ObResultSet::open() { int ret = OB_SUCCESS; + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_sql_execution); my_session_.set_process_query_time(ObClockGenerator::getClock()); LinkExecCtxGuard link_guard(my_session_, get_exec_context()); + ObRetryWaitEventInfoGuard retry_info_guard(my_session_); FLTSpanGuard(open); if (lib::is_oracle_mode() && get_exec_context().get_nested_level() >= OB_MAX_RECURSIVE_SQL_LEVELS) { @@ -466,7 +468,9 @@ int ObResultSet::end_stmt(const bool is_rollback) //see the call reference in LinkExecCtxGuard int ObResultSet::get_next_row(const common::ObNewRow *&row) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_sql_execution); LinkExecCtxGuard link_guard(my_session_, get_exec_context()); + ObRetryWaitEventInfoGuard retry_info_guard(my_session_); return inner_get_next_row(row); } @@ -928,7 +932,9 @@ OB_INLINE int ObResultSet::do_close_plan(int errcode, ObExecContext &ctx) int ObResultSet::do_close(int *client_ret) { int ret = OB_SUCCESS; + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_sql_execution); LinkExecCtxGuard link_guard(my_session_, get_exec_context()); + ObRetryWaitEventInfoGuard retry_info_guard(my_session_); FLTSpanGuard(close); const bool is_tx_active = my_session_.is_in_transaction(); diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 71ddd11e0b..1afad35f4e 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -6501,6 +6501,7 @@ int ObSPIService::inner_open(ObPLExecCtx *ctx, ret = OB_ERR_UNEXPECTED; LOG_WARN("Argument in pl context is NULL", K(session), K(ret)); } else { + ObPLASHGuard guard(ObPLASHGuard::ObPLASHStatus::IS_SQL_EXECUTION); bool old_client_return_rowid = session->is_client_return_rowid(); bool is_inner_session = session->is_inner(); ObSQLSessionInfo::SessionType old_session_type = session->get_session_type(); @@ -7291,6 +7292,7 @@ int ObSPIService::get_result(ObPLExecCtx *ctx, } else if (!for_cursor) { //虽然不需要存储结果,但是也需要把get_next调一遍 ObResultSet *ob_result_set = static_cast(result_set); if (ob_result_set->is_with_rows()) { // SELECT或DML RETURNING + ObPLASHGuard guard(ObPLASHGuard::ObPLASHStatus::IS_SQL_EXECUTION); if (lib::is_oracle_mode()) { // ORACLE Mode: only iterate to end const ObNewRow *row = NULL; while (OB_SUCC(ob_result_set->get_next_row(row))) { @@ -8385,6 +8387,7 @@ int ObSPIService::fetch_row(void *result_set, ObNewRow &cur_row) { int ret = OB_SUCCESS; + ObPLASHGuard guard(ObPLASHGuard::ObPLASHStatus::IS_SQL_EXECUTION); if (OB_ISNULL(result_set)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Argument passed in is NULL", K(result_set), K(ret)); diff --git a/src/sql/ob_sql_context.cpp b/src/sql/ob_sql_context.cpp index 59df440dcc..1192100a14 100644 --- a/src/sql/ob_sql_context.cpp +++ b/src/sql/ob_sql_context.cpp @@ -140,6 +140,7 @@ void ObQueryRetryInfo::reset() last_query_retry_err_ = OB_SUCCESS; retry_cnt_ = 0; query_switch_leader_retry_timeout_ts_ = 0; + query_retry_ash_diag_info_.reset(); } void ObQueryRetryInfo::clear() @@ -282,6 +283,7 @@ void ObSqlCtx::clear() cur_stmt_ = nullptr; is_text_ps_mode_ = false; ins_opt_ctx_.clear(); + cur_plan_ = nullptr; } OB_SERIALIZE_MEMBER(ObSqlCtx, stmt_type_); diff --git a/src/sql/ob_sql_context.h b/src/sql/ob_sql_context.h index d5752fd4c0..eb9ef5a778 100644 --- a/src/sql/ob_sql_context.h +++ b/src/sql/ob_sql_context.h @@ -26,6 +26,7 @@ #include "observer/omt/ob_tenant_config_mgr.h" #include "share/client_feedback/ob_feedback_partition_struct.h" #include "sql/dblink/ob_dblink_utils.h" +#include "sql/monitor/ob_sql_stat_record.h" #ifdef OB_BUILD_SPM #include "sql/spm/ob_spm_define.h" #endif @@ -349,6 +350,47 @@ struct ObInsertRewriteOptCtx int64_t row_count_; }; +struct ObQueryRetryASHDiagInfo { +public: + ObQueryRetryASHDiagInfo() + :ls_id_(0), + holder_tx_id_(0), + holder_data_seq_num_(0), + holder_lock_timestamp_(0), + table_id_(0), + table_schema_version_(0), + sys_ls_leader_addr_(0), + dop_(0), + required_px_workers_number_(0), + admitted_px_workers_number_(0) + {} + + ~ObQueryRetryASHDiagInfo() = default; + void reset() { + ls_id_ = 0; + holder_tx_id_ = 0; + holder_data_seq_num_ = 0; + holder_lock_timestamp_ = 0; + table_id_ = 0; + table_schema_version_ = 0; + sys_ls_leader_addr_ = 0; + dop_ = 0; + required_px_workers_number_ = 0; + admitted_px_workers_number_ = 0; + } + +public: + int64_t ls_id_; + int64_t holder_tx_id_; + int64_t holder_data_seq_num_; + int64_t holder_lock_timestamp_; + int64_t table_id_; + int64_t table_schema_version_; + int64_t sys_ls_leader_addr_; + int64_t dop_; + int64_t required_px_workers_number_; + int64_t admitted_px_workers_number_; +}; class ObQueryRetryInfo { @@ -358,7 +400,8 @@ public: is_rpc_timeout_(false), last_query_retry_err_(common::OB_SUCCESS), retry_cnt_(0), - query_switch_leader_retry_timeout_ts_(0) + query_switch_leader_retry_timeout_ts_(0), + query_retry_ash_diag_info_() { } virtual ~ObQueryRetryInfo() {} @@ -404,6 +447,8 @@ public: void inc_retry_cnt() { retry_cnt_++; } int64_t get_retry_cnt() const { return retry_cnt_; } + ObQueryRetryASHDiagInfo* get_query_retry_ash_diag_info_ptr() { return &query_retry_ash_diag_info_; } + const ObQueryRetryASHDiagInfo& get_retry_ash_diag_info() const { return query_retry_ash_diag_info_; } TO_STRING_KV(K_(inited), K_(is_rpc_timeout), K_(last_query_retry_err)); @@ -421,6 +466,7 @@ private: int64_t retry_cnt_; // for fast fail, int64_t query_switch_leader_retry_timeout_ts_; + ObQueryRetryASHDiagInfo query_retry_ash_diag_info_; private: DISALLOW_COPY_AND_ASSIGN(ObQueryRetryInfo); }; @@ -736,6 +782,7 @@ public: TO_STRING_KV(K(stmt_type_)); private: share::ObFeedbackRerouteInfo *reroute_info_; + }; struct ObQueryCtx diff --git a/src/sql/ob_sql_trans_control.cpp b/src/sql/ob_sql_trans_control.cpp index e3fe27574e..8d2b995fbe 100644 --- a/src/sql/ob_sql_trans_control.cpp +++ b/src/sql/ob_sql_trans_control.cpp @@ -533,13 +533,20 @@ int ObSqlTransControl::do_end_trans_(ObSQLSessionInfo *session, LOG_WARN("fail to inc session ref", K(ret)); } else { callback->handout(); - // Add ASH flags to async commit of transactions - // In the end of async commit in func named ` ObEndTransAsyncCallback::callback() `, - // set the ash flag named `in_committing_` to false. - ObActiveSessionGuard::get_stat().in_committing_ = true; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().in_committing_ = true; + di->begin_wait_event(ObWaitEventIds::ASYNC_COMMITTING_WAIT); + } + callback->set_diagnostic_info(di); if(OB_FAIL(txs->submit_commit_tx(*tx_ptr, expire_ts, *callback, &trace_info))) { LOG_WARN("submit commit tx fail", K(ret), KP(callback), K(expire_ts), KPC(tx_ptr)); + callback->reset_diagnostic_info(); GCTX.session_mgr_->revert_session(session); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().in_committing_ = false; + di->end_wait_event(ObWaitEventIds::ASYNC_COMMITTING_WAIT); + } callback->handin(); } } diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 52224d5c39..8804e09fa9 100755 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -17350,7 +17350,7 @@ static uint64_t virtual_table_index_scan_white_list[2]{ bool ObJoinOrder::virtual_table_index_can_range_scan(uint64_t table_id) { bool bret = false; - for (int i = 0; i < sizeof(virtual_table_index_scan_white_list); i++) { + for (int i = 0; i < ARRAYSIZEOF(virtual_table_index_scan_white_list); i++) { if (table_id == virtual_table_index_scan_white_list[i]) { bret = true; break; diff --git a/src/sql/parser/ob_sql_parser.cpp b/src/sql/parser/ob_sql_parser.cpp index f5671206de..4568574ae9 100644 --- a/src/sql/parser/ob_sql_parser.cpp +++ b/src/sql/parser/ob_sql_parser.cpp @@ -21,6 +21,7 @@ #include "lib/ash/ob_active_session_guard.h" #endif #include "sql/parser/parser_utility.h" +#include "lib/stat/ob_diagnostic_info_guard.h" #include @@ -34,7 +35,7 @@ int ObSQLParser::parse(const char * str_ptr, const int64_t str_len, ParseResult int ret = OB_SUCCESS; #ifndef SQL_PARSER_COMPILATION // proxy don't need this, only for observer - ObActiveSessionGuard::get_stat().in_parse_ = true; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_parse_ = true; #endif if (OB_FAIL(parse_init(&result))) { // do nothing @@ -42,7 +43,7 @@ int ObSQLParser::parse(const char * str_ptr, const int64_t str_len, ParseResult // do nothing } #ifndef SQL_PARSER_COMPILATION - ObActiveSessionGuard::get_stat().in_parse_ = false; + GET_DIAGNOSTIC_INFO->get_ash_stat().in_parse_ = false; #endif return ret; } diff --git a/src/sql/plan_cache/ob_lib_cache_register.h b/src/sql/plan_cache/ob_lib_cache_register.h index 4a6ffa5ed4..34291f0bce 100644 --- a/src/sql/plan_cache/ob_lib_cache_register.h +++ b/src/sql/plan_cache/ob_lib_cache_register.h @@ -22,6 +22,7 @@ LIB_CACHE_OBJ_DEF(NS_CALLSTMT, "CALLSTMT", pl::ObPLObjectKey, pl::ObPLObjectSet, #ifdef OB_BUILD_SPM LIB_CACHE_OBJ_DEF(NS_SPM, "SPM", ObBaselineKey, ObSpmSet, ObPlanBaselineItem, "OB_SQL_SPM_OBJ") // baseline cache #endif /*OB_BUILD_SPM*/ +LIB_CACHE_OBJ_DEF(NS_SQLSTAT, "SQLSTAT", sql::ObSqlStatRecordKey, sql::ObSqlStatRecordNode, sql::ObSqlStatRecordObj, "OB_SQLSTAT_OBJ") // sql stat cache LIB_CACHE_OBJ_DEF(NS_KV_SCHEMA, "KV_SCHEMA_INFO", table::ObKvSchemaCacheKey, table::ObTableApiCacheNode, table::ObKvSchemaCacheObj, "OB_KVSCHEMA_OBJ") // OBKV schema cache #endif /*LIB_CACHE_OBJ_DEF*/ diff --git a/src/sql/plan_cache/ob_pc_ref_handle.cpp b/src/sql/plan_cache/ob_pc_ref_handle.cpp index cf774fe8af..ee4bd501ea 100644 --- a/src/sql/plan_cache/ob_pc_ref_handle.cpp +++ b/src/sql/plan_cache/ob_pc_ref_handle.cpp @@ -67,6 +67,8 @@ const char* ObCacheRefHandleMgr::handle_name(const CacheRefHandleID handle_id) "sql_plan_handle", "callstmt_handle", "pc_diag_handle", + "sql_stat_handle", + "virtual_table_sql_stat_handle", "kv_schema_info_handle" }; static_assert(sizeof(handle_names)/sizeof(const char*) == MAX_HANDLE, "invalid handle name array"); diff --git a/src/sql/plan_cache/ob_pc_ref_handle.h b/src/sql/plan_cache/ob_pc_ref_handle.h index a52fe606e9..a585ac39b3 100644 --- a/src/sql/plan_cache/ob_pc_ref_handle.h +++ b/src/sql/plan_cache/ob_pc_ref_handle.h @@ -131,6 +131,8 @@ enum CacheRefHandleID SQL_PLAN_HANDLE, CALLSTMT_HANDLE, PC_DIAG_HANDLE, + SQL_STAT_NODE_HANDLE, + VT_SQL_STAT_HANDLE, KV_SCHEMA_INFO_HANDLE, MAX_HANDLE }; diff --git a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp index dea8b6f88b..4a7cd7cb7f 100644 --- a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp +++ b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp @@ -2214,14 +2214,6 @@ static int alter_system_set_reset_constraint_check_and_add_item_mysql_mode(obrpc ret = OB_OP_NOT_ALLOW; LOG_WARN("cluster_id is not allowed to modify"); LOG_USER_ERROR(OB_OP_NOT_ALLOW, "alter the parameter cluster_id"); - } else if (0 == STRCMP(item.name_.ptr(), QUERY_RESPPONSE_TIME_FLUSH)) { - if(OB_FAIL(observer::ObRSTCollector::get_instance().flush_query_response_time(item.exec_tenant_id_, item.value_.str()))){ - LOG_WARN("set query response time flush", K(ret)); - } - } else if (0 == STRCMP(item.name_.ptr(), QUERY_RESPPONSE_TIME_STATS)) { - if(OB_FAIL(observer::ObRSTCollector::get_instance().control_query_response_time(item.exec_tenant_id_, item.value_.str()))){ - LOG_WARN("set query response time stats", K(ret)); - } } else if (!can_set_trace_control_info && session_info != NULL && 0 == STRCMP(item.name_.ptr(), OB_STR_TRC_CONTROL_INFO) && diff --git a/src/sql/resolver/cmd/ob_show_resolver.cpp b/src/sql/resolver/cmd/ob_show_resolver.cpp index 8cb1dcb60e..c568019df5 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.cpp +++ b/src/sql/resolver/cmd/ob_show_resolver.cpp @@ -3609,7 +3609,7 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_PRIVILEGES, DEFINE_SHOW_CLAUSE_SET(SHOW_QUERY_RESPONSE_TIME, NULL, - "SELECT response_time as RESPONSE_TIME, count as COUNT, total as TOTAL FROM %s.%s where tenant_id = %lu", + "SELECT response_time as RESPONSE_TIME, sum(count) as COUNT, sum(total) as TOTAL FROM %s.%s where tenant_id = %lu group by response_time", NULL, NULL); diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 4c05ab5bfa..c5afe393fa 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -43,6 +43,7 @@ #include "sql/engine/expr/ob_expr_regexp_context.h" #include "share/ob_compatibility_control.h" #include "sql/ob_optimizer_trace_impl.h" +#include "lib/stat/ob_diagnostic_info_container.h" using namespace oceanbase::common; using namespace oceanbase::share; @@ -124,6 +125,7 @@ ObBasicSessionInfo::ObBasicSessionInfo(const uint64_t tenant_id) cur_phy_plan_(NULL), plan_id_(0), last_plan_id_(0), + plan_hash_(0), flt_vars_(), capability_(), proxy_capability_(), @@ -165,7 +167,8 @@ ObBasicSessionInfo::ObBasicSessionInfo(const uint64_t tenant_id) last_refresh_schema_version_(OB_INVALID_VERSION), force_rich_vector_format_(ForceRichFormatStatus::Disable), config_use_rich_format_(true), - sys_var_config_hash_val_(0) + sys_var_config_hash_val_(0), + is_real_inner_session_(false) { thread_data_.reset(); MEMSET(sys_vars_, 0, sizeof(sys_vars_)); @@ -179,6 +182,7 @@ ObBasicSessionInfo::ObBasicSessionInfo(const uint64_t tenant_id) inc_sys_var_alloc_[0] = &inc_sys_var_alloc1_; inc_sys_var_alloc_[1] = &inc_sys_var_alloc2_; influence_plan_var_indexs_.set_attr(ObMemAttr(orig_tenant_id_, "PlanVaIdx")); + thread_name_[0] = '\0'; } ObBasicSessionInfo::~ObBasicSessionInfo() @@ -476,6 +480,7 @@ void ObBasicSessionInfo::reset(bool skip_sys_var) cur_phy_plan_ = NULL; plan_id_ = 0; last_plan_id_ = 0; + plan_hash_ = 0; capability_.capability_ = 0; proxy_capability_.capability_ = 0; client_attribute_capability_.capability_ = 0; @@ -540,6 +545,7 @@ void ObBasicSessionInfo::reset(bool skip_sys_var) proxy_user_id_ = OB_INVALID_ID; config_use_rich_format_ = true; sys_var_config_hash_val_ = 0; + is_real_inner_session_ = false; } int ObBasicSessionInfo::reset_timezone() @@ -739,6 +745,7 @@ int ObBasicSessionInfo::set_user(const ObString &user_name, const ObString &host LOG_WARN("fail to write user_at_host_name to string_buf_", K(tmp_string), K(ret)); } else { user_id_ = user_id; + GET_DIAGNOSTIC_INFO->get_ash_stat().user_id_ = get_user_id(); } } return ret; @@ -2188,14 +2195,46 @@ int ObBasicSessionInfo::set_cur_phy_plan(ObPhysicalPlan *cur_phy_plan) } else { cur_phy_plan_ = cur_phy_plan; plan_id_ = cur_phy_plan->get_plan_id(); - ash_stat_.plan_id_ = plan_id_; + plan_hash_ = cur_phy_plan->get_plan_hash_value(); int64_t len = cur_phy_plan->stat_.sql_id_.length(); MEMCPY(sql_id_, cur_phy_plan->stat_.sql_id_.ptr(), len); sql_id_[len] = '\0'; + + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().plan_id_ = plan_id_; + di->get_ash_stat().plan_hash_ = plan_hash_; + MEMMOVE(di->get_ash_stat().sql_id_, sql_id_, + min(sizeof(di->get_ash_stat().sql_id_), sizeof(sql_id_))); + } } return ret; } +void ObBasicSessionInfo::set_ash_stat_value(ObActiveSessionStat &ash_stat) +{ + ash_stat.stmt_type_ = get_stmt_type(); + ash_stat.plan_id_ = plan_id_; + ash_stat.plan_hash_ = plan_hash_; + MEMMOVE(ash_stat.sql_id_, sql_id_, + min(sizeof(ash_stat.sql_id_), sizeof(sql_id_))); + ash_stat.tenant_id_ = tenant_id_; + ash_stat.user_id_ = get_user_id(); + ash_stat.trace_id_ = get_current_trace_id(); + ash_stat.tid_ = GETTID(); + ash_stat.group_id_ = THIS_WORKER.get_group_id(); +} + +void ObBasicSessionInfo::set_current_trace_id(common::ObCurTraceId::TraceId *trace_id) +{ + if (OB_ISNULL(trace_id)) { + } else { + curr_trace_id_ = *trace_id; + GET_DIAGNOSTIC_INFO->get_ash_stat().trace_id_ = curr_trace_id_; + } +} + + void ObBasicSessionInfo::reset_cur_phy_plan_to_null() { cur_phy_plan_ = NULL; @@ -2209,6 +2248,11 @@ void ObBasicSessionInfo::set_cur_sql_id(char *sql_id) } else { MEMCPY(sql_id_, sql_id, common::OB_MAX_SQL_ID_LENGTH); sql_id_[32] = '\0'; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + MEMMOVE(di->get_ash_stat().sql_id_, sql_id_, + min(sizeof(di->get_ash_stat().sql_id_), sizeof(sql_id_))); + } } } @@ -6358,14 +6402,13 @@ int ObBasicSessionInfo::set_session_active(const ObString &sql, LockGuard lock_guard(thread_data_mutex_); if (OB_FAIL(store_query_string_(sql))) { LOG_WARN("store query string fail", K(ret)); - } else if (OB_FAIL(set_session_state_(QUERY_ACTIVE))) { - LOG_WARN("fail to set session state", K(ret)); + } else if (OB_FAIL(set_session_active())) { + LOG_WARN("fail to set session active", K(ret)); } else { thread_data_.cur_query_start_time_ = query_receive_ts; thread_data_.mysql_cmd_ = cmd; thread_data_.last_active_time_ = last_active_time_ts; thread_data_.is_request_end_ = false; - ObActiveSessionGuard::setup_ash(ash_stat_); } return ret; } @@ -6377,22 +6420,40 @@ int ObBasicSessionInfo::set_session_active(const ObString &label, LockGuard lock_guard(thread_data_mutex_); if (OB_FAIL(store_query_string_(label))) { LOG_WARN("store query string fail", K(ret)); - } else if (OB_FAIL(set_session_state_(QUERY_ACTIVE))) { - LOG_WARN("fail to set session state", K(ret)); + } else if (OB_FAIL(set_session_active())) { + LOG_WARN("fail to set session active", K(ret)); } else { thread_data_.mysql_cmd_ = cmd; thread_data_.is_request_end_ = false; - ObActiveSessionGuard::setup_ash(ash_stat_); } return ret; } +int ObBasicSessionInfo::set_session_active() +{ + int ret = OB_SUCCESS; + if (OB_FAIL(set_session_state_(QUERY_ACTIVE))) { + LOG_WARN("fail to set session state", K(ret)); + } else { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + set_ash_stat_value(di->get_ash_stat()); + } + } + return ret; +} void ObBasicSessionInfo::set_session_sleep() { + int ret = OB_SUCCESS; LockGuard lock_guard(thread_data_mutex_); set_session_state_(SESSION_SLEEP); thread_data_.mysql_cmd_ = obmysql::COM_SLEEP; thread_id_ = 0; + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().end_retry_wait_event(); + di->get_ash_stat().block_sessid_ = 0; + } } int ObBasicSessionInfo::base_save_session(BaseSavedValue &saved_value, bool skip_cur_stmt_tables) diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index 62173c6509..17d9f8f619 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -53,6 +53,9 @@ namespace oceanbase namespace observer { class ObSMConnection; } +namespace common { +class ObDiagnosticInfo; +} using sql::FLTControlInfo; namespace sql { @@ -221,6 +224,7 @@ public: } inline void set_stmt_type(stmt::StmtType stmt_type) { + GET_DIAGNOSTIC_INFO->get_ash_stat().stmt_type_ = stmt_type; stmt_type_ = stmt_type; } TO_STRING_KV(K(table_id_), @@ -443,6 +447,7 @@ public: int update_max_packet_size(); int64_t get_thread_id() const { return thread_id_; } void set_thread_id(int64_t t) { thread_id_ = t; } + const char* get_thread_name() const { return thread_name_; } void set_valid(const bool valid) {is_valid_ = valid;}; int set_client_version(const common::ObString &client_version); int set_driver_version(const common::ObString &driver_version); @@ -882,6 +887,9 @@ public: bool get_is_in_retry() { return SESS_NOT_IN_RETRY != thread_data_.is_in_retry_; } + bool get_is_in_retry() const { + return SESS_NOT_IN_RETRY != thread_data_.is_in_retry_; + } bool get_is_in_retry_for_dup_tbl() { return SESS_IN_RETRY_FOR_DUP_TBL == thread_data_.is_in_retry_; } @@ -912,6 +920,7 @@ public: // for remote / px task int set_session_active(const ObString &label, obmysql::ObMySQLCmd cmd); + int set_session_active(); const common::ObString get_current_query_string() const; const common::ObString get_top_query_string() const; uint64_t get_current_statement_id() const { return thread_data_.cur_statement_id_; } @@ -1035,7 +1044,9 @@ public: const ObString get_cur_sql_id() const { return ObString(sql_id_); } void get_cur_sql_id(char *sql_id_buf, int64_t sql_id_buf_size) const; void set_cur_sql_id(char *sql_id); + void reset_cur_sql_id() {sql_id_[0] = '\0';} int set_cur_phy_plan(ObPhysicalPlan *cur_phy_plan); + virtual void set_ash_stat_value(ObActiveSessionStat &ash_stat); void reset_cur_phy_plan_to_null(); void get_flt_span_id(ObString &span_id) const; @@ -1303,6 +1314,17 @@ public: const common::ObCurTraceId::TraceId &get_last_trace_id() const { return last_trace_id_; } const common::ObCurTraceId::TraceId &get_current_trace_id() const { return curr_trace_id_; } uint64_t get_current_plan_id() const { return plan_id_; } + void reset_current_plan_id() + { + plan_id_ = 0; + GET_DIAGNOSTIC_INFO->get_ash_stat().plan_id_ = 0; + } + uint64_t get_current_plan_hash() const { return plan_hash_; } + void reset_current_plan_hash() + { + plan_hash_ = 0; + GET_DIAGNOSTIC_INFO->get_ash_stat().plan_hash_ = 0; + } uint64_t get_last_plan_id() const { return last_plan_id_; } void set_last_plan_id(uint64_t plan_id) { last_plan_id_ = plan_id; } void set_current_execution_id(int64_t execution_id) { current_execution_id_ = execution_id; } @@ -1313,13 +1335,7 @@ public: last_trace_id_ = *trace_id; } } - void set_current_trace_id(common::ObCurTraceId::TraceId *trace_id) - { - if (OB_ISNULL(trace_id)) { - } else { - curr_trace_id_ = *trace_id; - } - } + void set_current_trace_id(common::ObCurTraceId::TraceId *trace_id); // forbid use jit int get_jit_enabled_mode(ObJITEnableMode &jit_mode) const { @@ -1448,7 +1464,6 @@ public: int set_session_temp_table_used(const bool is_used); int get_session_temp_table_used(bool &is_used) const; int get_enable_optimizer_null_aware_antijoin(bool &is_enabled) const; - common::ActiveSessionStat &get_ash_stat() { return ash_stat_; } void update_tenant_config_version(int64_t v) { cached_tenant_config_version_ = v; }; static int check_optimizer_features_enable_valid(const ObObj &val); int get_compatibility_control(share::ObCompatType &compat_type) const; @@ -1457,6 +1472,8 @@ public: int check_feature_enable(const share::ObCompatFeatureType feature_type, bool &is_enable) const; void trace_all_sys_vars() const; void reuse_labels() { labels_.reuse(); } + bool is_real_inner_session() const { return is_real_inner_session_; } + void set_real_inner_session(bool value) { is_real_inner_session_ = value; } protected: int process_session_variable(share::ObSysVarClassType var, const common::ObObj &value, const bool check_timezone_valid = true, @@ -2355,6 +2372,7 @@ private: char sql_id_[common::OB_MAX_SQL_ID_LENGTH + 1]; uint64_t plan_id_; // for ASH sampling, get current SQL's sql_id & plan_id uint64_t last_plan_id_; + uint64_t plan_hash_; ObFLTVars flt_vars_; //=======================ObProxy && OCJ related============================ @@ -2466,7 +2484,6 @@ private: // 构造当前 session 的线程 id,用于 all_virtual_processlist 中的 THREAD_ID 字段 // 通过本 id 可以快速对 worker 做 `pstack THREADID` 操作 int64_t thread_id_; - common::ActiveSessionStat ash_stat_; // indicate whether user password is expired, is set when session is established. // will not be changed during whole session lifetime unless user changes password // in this session. @@ -2488,6 +2505,11 @@ private: common::ObSEArray enable_role_ids_; uint64_t sys_var_config_hash_val_; + char thread_name_[OB_THREAD_NAME_BUF_LEN]; + bool is_real_inner_session_; + // Currently, when inner sql is executed, the session will be created from session_mgr in most cases. We think he is an inner session; + // In addition, in situations such as PL execution, the external session will be passed to the inner sql Connection. In this case, it is not considered an inner session. + // There are differences between the two in terms of ASH statistics and so on, so they should be distinguished. public: bool get_enable_hyperscan_regexp_engine() const; }; diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 138b22f750..2dd5157583 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -213,7 +213,8 @@ ObSQLSessionInfo::ObSQLSessionInfo(const uint64_t tenant_id) : is_session_sync_support_(false), job_info_(nullptr), failover_mode_(false), - service_name_() + service_name_(), + executing_sql_stat_record_() { MEMSET(tenant_buff_, 0, sizeof(share::ObTenantSpaceFetcher)); MEMSET(vip_buf_, 0, sizeof(vip_buf_)); @@ -413,6 +414,7 @@ void ObSQLSessionInfo::reset(bool skip_sys_var) job_info_ = nullptr; failover_mode_ = false; service_name_.reset(); + executing_sql_stat_record_.reset(); } void ObSQLSessionInfo::clean_status() @@ -670,6 +672,21 @@ bool ObSQLSessionInfo::is_enable_new_query_range() const return bret; } + +bool ObSQLSessionInfo::is_sqlstat_enabled() const +{ + bool bret = false; + if (lib::is_diagnose_info_enabled()) { + int64_t tenant_id = get_effective_tenant_id(); + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + bret = tenant_config->_ob_sqlstat_enable; + // sqlstat has a dependency on the statistics mechanism, so turning off perf event will turn off sqlstat at the same time. + } + } + return bret; +} + void ObSQLSessionInfo::destroy(bool skip_sys_var) { if (is_inited_) { @@ -3274,25 +3291,43 @@ bool ObSQLSessionInfo::has_sess_info_modified() const { int ObSQLSessionInfo::set_module_name(const common::ObString &mod) { int ret = OB_SUCCESS; + int64_t size = min(common::OB_MAX_MOD_NAME_LENGTH, mod.length()); MEMSET(module_buf_, 0x00, common::OB_MAX_MOD_NAME_LENGTH); - MEMCPY(module_buf_, mod.ptr(), min(common::OB_MAX_MOD_NAME_LENGTH, mod.length())); - client_app_info_.module_name_.assign(&module_buf_[0], min(common::OB_MAX_MOD_NAME_LENGTH, mod.length())); + MEMCPY(module_buf_, mod.ptr(), size); + client_app_info_.module_name_.assign(&module_buf_[0], size); + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + MEMCPY(di->get_ash_stat().module_, mod.ptr(), + min(static_cast(sizeof(di->get_ash_stat().module_)), size)); + } return ret; } int ObSQLSessionInfo::set_action_name(const common::ObString &act) { int ret = OB_SUCCESS; + int64_t size = min(common::OB_MAX_ACT_NAME_LENGTH, act.length()); MEMSET(action_buf_, 0x00, common::OB_MAX_ACT_NAME_LENGTH); - MEMCPY(action_buf_, act.ptr(), min(common::OB_MAX_ACT_NAME_LENGTH, act.length())); - client_app_info_.action_name_.assign(&action_buf_[0], min(common::OB_MAX_ACT_NAME_LENGTH, act.length())); + MEMCPY(action_buf_, act.ptr(), size); + client_app_info_.action_name_.assign(&action_buf_[0], size); + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + MEMCPY(di->get_ash_stat().action_, act.ptr(), + min(static_cast(sizeof(di->get_ash_stat().action_)), size)); + } return ret; } int ObSQLSessionInfo::set_client_info(const common::ObString &client_info) { int ret = OB_SUCCESS; + int64_t size = min(common::OB_MAX_CLIENT_INFO_LENGTH, client_info.length()); MEMSET(client_info_buf_, 0x00, common::OB_MAX_CLIENT_INFO_LENGTH); - MEMCPY(client_info_buf_, client_info.ptr(), min(common::OB_MAX_CLIENT_INFO_LENGTH, client_info.length())); - client_app_info_.client_info_.assign(&client_info_buf_[0], min(common::OB_MAX_CLIENT_INFO_LENGTH, client_info.length())); + MEMCPY(client_info_buf_, client_info.ptr(), size); + client_app_info_.client_info_.assign(&client_info_buf_[0], size); + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + MEMCPY(di->get_ash_stat().client_id_, client_info.ptr(), + min(static_cast(sizeof(di->get_ash_stat().client_id_)), size)); + } return ret; } @@ -4787,3 +4822,47 @@ int ObSQLSessionInfo::set_audit_filter_name(const common::ObString &filter_name) } return ret; } + +int ObSQLSessionInfo::sql_sess_record_sql_stat_start_value(ObExecutingSqlStatRecord& executing_sqlstat) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(executing_sql_stat_record_.assign(executing_sqlstat))) { + LOG_WARN("failed to assign executing sql stat record"); + } else { + ObDiagnosticInfo *di = ObLocalDiagnosticInfo::get(); + if (OB_NOT_NULL(di)) { + di->get_ash_stat().record_cur_query_start_ts(get_is_in_retry()); + } + } + return ret; +} + +void ObSQLSessionInfo::set_ash_stat_value(ObActiveSessionStat &ash_stat) +{ + ObBasicSessionInfo::set_ash_stat_value(ash_stat); + if (!get_module_name().empty()) { + int64_t size = get_module_name().length() > ASH_MODULE_STR_LEN + ? ASH_MODULE_STR_LEN + : get_module_name().length(); + MEMCPY(ash_stat.module_, get_module_name().ptr(), size); + ash_stat.module_[size] = '\0'; + } + + // fill action for user session + if (!get_action_name().empty()) { + int64_t size = get_action_name().length() > ASH_ACTION_STR_LEN + ? ASH_ACTION_STR_LEN + : get_action_name().length(); + MEMCPY(ash_stat.action_, get_action_name().ptr(), size); + ash_stat.action_[size] = '\0'; + } + + // fill client id for user session + if (!get_client_identifier().empty()) { + int64_t size = get_client_identifier().length() > ASH_CLIENT_ID_STR_LEN + ? ASH_CLIENT_ID_STR_LEN + : get_client_identifier().length(); + MEMCPY(ash_stat.client_id_, get_client_identifier().ptr(), size); + ash_stat.client_id_[size] = '\0'; + } +} diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index e7e16ab56e..1471c124d9 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -647,7 +647,6 @@ public: int close_all(sql::ObSQLSessionInfo &session) { int ret = OB_SUCCESS; - ObSessionStatEstGuard guard(session.get_effective_tenant_id(), session.get_sessid()); while (pl_cursor_map_.size() > 0) { // ignore error, just log, try to close all cursor in this loop. int ret = OB_SUCCESS; CursorMap::iterator iter = pl_cursor_map_.begin(); @@ -1234,7 +1233,7 @@ public: } int set_client_id(const common::ObString &client_identifier); - + virtual void set_ash_stat_value(ObActiveSessionStat &ash_stat); bool has_sess_info_modified() const; int set_module_name(const common::ObString &mod); int set_action_name(const common::ObString &act); @@ -1312,6 +1311,7 @@ public: bool is_var_assign_use_das_enabled() const; bool is_nlj_spf_use_rich_format_enabled() const; int is_adj_index_cost_enabled(bool &enabled, int64_t &stats_cost_percent) const; + bool is_sqlstat_enabled() const; bool is_spf_mlj_group_rescan_enabled() const; int is_preserve_order_for_pagination_enabled(bool &enabled) const; int get_spm_mode(int64_t &spm_mode); @@ -1508,6 +1508,10 @@ public: int set_service_name(const ObString& service_name); int check_service_name_and_failover_mode() const; int check_service_name_and_failover_mode(const uint64_t tenant_id) const; + int64_t get_tx_id_with_thread_data_lock() { + ObSQLSessionInfo::LockGuard guard(get_thread_data_lock()); + return tx_desc_ != NULL ? tx_desc_->get_tx_id().get_id() : transaction::ObTransID().get_id(); + } public: bool has_tx_level_temp_table() const { return tx_desc_ && tx_desc_->with_temporary_table(); } void set_affected_rows_is_changed(int64_t affected_rows); @@ -1743,6 +1747,8 @@ public: inline int64_t get_out_bytes() const { return ATOMIC_LOAD(&out_bytes_); } inline void inc_out_bytes(int64_t out_bytes) { IGNORE_RETURN ATOMIC_FAA(&out_bytes_, out_bytes); } bool is_pl_prepare_stage() const; + inline ObExecutingSqlStatRecord& get_executing_sql_stat_record() {return executing_sql_stat_record_; } + int sql_sess_record_sql_stat_start_value(ObExecutingSqlStatRecord& executing_sqlstat); dbms_scheduler::ObDBMSSchedJobInfo *get_job_info() const { return job_info_; } void set_job_info(dbms_scheduler::ObDBMSSchedJobInfo *job_info) { job_info_ = job_info; } private: @@ -1780,6 +1786,7 @@ private: bool failover_mode_; ObServiceNameString service_name_; common::ObString audit_filter_name_; + ObExecutingSqlStatRecord executing_sql_stat_record_; }; diff --git a/src/sql/session/ob_sql_session_mgr.cpp b/src/sql/session/ob_sql_session_mgr.cpp index 81296420f6..f0c513706f 100644 --- a/src/sql/session/ob_sql_session_mgr.cpp +++ b/src/sql/session/ob_sql_session_mgr.cpp @@ -32,6 +32,7 @@ #include "sql/session/ob_user_resource_mgr.h" #include "sql/monitor/flt/ob_flt_control_info_mgr.h" #include "storage/concurrency_control/ob_multi_version_garbage_collector.h" +#include "lib/ash/ob_active_session_guard.h" using namespace oceanbase::common; using namespace oceanbase::sql; @@ -271,7 +272,7 @@ ObSQLSessionInfo *ObSQLSessionMgr::ValueAlloc::alloc_value(uint64_t tenant_id) LOG_INFO("alloc_session_count", K(alloc_total_count)); } } else { - LOG_ERROR("switch tenant failed", K(ret), K(tenant_id)); + LOG_WARN("switch tenant failed", K(ret), K(tenant_id)); } return session; } @@ -323,7 +324,6 @@ void ObSQLSessionMgr::ValueAlloc::free_value(ObSQLSessionInfo *session) if (free_total_count > 0 && free_total_count % 10000 == 0) { LOG_INFO("free_session_count", K(free_total_count)); } - ObActiveSessionGuard::setup_default_ash(); } } @@ -471,6 +471,7 @@ int ObSQLSessionMgr::create_session(const uint64_t tenant_id, const uint32_t client_sessid, const int64_t client_create_time) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_connection_mgr); int ret = OB_SUCCESS; int err = OB_SUCCESS; session_info = NULL; @@ -574,6 +575,7 @@ int ObSQLSessionMgr::create_session(const uint64_t tenant_id, int ObSQLSessionMgr::free_session(const ObFreeSessionCtx &ctx) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_connection_mgr); int ret = OB_SUCCESS; uint32_t sessid = ctx.sessid_; uint64_t proxy_sessid = ctx.proxy_sessid_; @@ -605,7 +607,6 @@ int ObSQLSessionMgr::free_session(const ObFreeSessionCtx &ctx) if (OB_FAIL(sessinfo_map_.del(Key(sessid)))) { LOG_WARN("fail to remove session from session map", K(ret), K(sessid), K(proxy_sessid)); } else if (tenant_id != 0 && sessid != 0 && has_inc) { - ObTenantStatEstGuard guard(tenant_id); EVENT_DEC(ACTIVE_SESSIONS); } return ret; diff --git a/src/storage/access/ob_block_row_store.cpp b/src/storage/access/ob_block_row_store.cpp index e03f51190b..9cc08daf0b 100644 --- a/src/storage/access/ob_block_row_store.cpp +++ b/src/storage/access/ob_block_row_store.cpp @@ -112,6 +112,7 @@ int ObBlockRowStore::apply_blockscan( const bool can_pushdown, ObTableScanStoreStat &table_store_stat) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_filter_rows); int ret = OB_SUCCESS; int64_t access_count = micro_scanner.get_access_cnt(); if (iter_param_->has_lob_column_out()) { diff --git a/src/storage/access/ob_multiple_merge.cpp b/src/storage/access/ob_multiple_merge.cpp index 8ee8af1dbd..8444b9c4c6 100644 --- a/src/storage/access/ob_multiple_merge.cpp +++ b/src/storage/access/ob_multiple_merge.cpp @@ -1274,6 +1274,7 @@ int ObMultipleMerge::fill_virtual_columns(ObDatumRow &row) int ObMultipleMerge::check_filtered(const ObDatumRow &row, bool &filtered) { + ACTIVE_SESSION_FLAG_SETTER_GUARD(in_filter_rows); int ret = OB_SUCCESS; ObSampleFilterExecutor *sample_executor = static_cast(access_ctx_->get_sample_executor()); if (nullptr != sample_executor && OB_FAIL(sample_executor->check_filtered_after_fuse(filtered))) { diff --git a/src/storage/access/ob_sstable_row_getter.cpp b/src/storage/access/ob_sstable_row_getter.cpp index 4ec4f88f7f..24a5b36c2b 100644 --- a/src/storage/access/ob_sstable_row_getter.cpp +++ b/src/storage/access/ob_sstable_row_getter.cpp @@ -129,6 +129,13 @@ int ObSSTableRowGetter::inner_get_next_row(const ObDatumRow *&store_row) LOG_WARN("failed to set row scn", K(ret)); } EVENT_INC(ObStatEventIds::SSSTORE_READ_ROW_COUNT); + if (OB_NOT_NULL(sstable_)) { + if (sstable_->is_minor_sstable()) { + EVENT_INC(ObStatEventIds::MINOR_SSSTORE_READ_ROW_COUNT); + } else if (sstable_->is_major_sstable()) { + EVENT_INC(ObStatEventIds::MAJOR_SSSTORE_READ_ROW_COUNT); + } + } LOG_DEBUG("inner get next row", KPC(store_row), KPC(read_handle_.rowkey_)); } return ret; diff --git a/src/storage/access/ob_sstable_row_multi_getter.cpp b/src/storage/access/ob_sstable_row_multi_getter.cpp index 76733f14c7..77b0899649 100644 --- a/src/storage/access/ob_sstable_row_multi_getter.cpp +++ b/src/storage/access/ob_sstable_row_multi_getter.cpp @@ -133,6 +133,13 @@ int ObSSTableRowMultiGetter::inner_get_next_row(const blocksstable::ObDatumRow * LOG_WARN("failed to set row scn", K(ret)); } EVENT_INC(ObStatEventIds::SSSTORE_READ_ROW_COUNT); + if (OB_NOT_NULL(sstable_)) { + if (sstable_->is_minor_sstable()) { + EVENT_INC(ObStatEventIds::MINOR_SSSTORE_READ_ROW_COUNT); + } else if (sstable_->is_major_sstable()) { + EVENT_INC(ObStatEventIds::MAJOR_SSSTORE_READ_ROW_COUNT); + } + } LOG_DEBUG("inner get next row", K(*store_row)); } } diff --git a/src/storage/access/ob_sstable_row_scanner.cpp b/src/storage/access/ob_sstable_row_scanner.cpp index 30c08c4953..6ecc662812 100644 --- a/src/storage/access/ob_sstable_row_scanner.cpp +++ b/src/storage/access/ob_sstable_row_scanner.cpp @@ -343,6 +343,13 @@ int ObSSTableRowScanner::inner_get_next_row(const ObDatumRow *&sto LOG_WARN("failed to set row scn", K(ret)); } EVENT_INC(ObStatEventIds::SSSTORE_READ_ROW_COUNT); + if (OB_NOT_NULL(sstable_)) { + if (sstable_->is_minor_sstable()) { + EVENT_INC(ObStatEventIds::MINOR_SSSTORE_READ_ROW_COUNT); + } else if (sstable_->is_major_sstable()) { + EVENT_INC(ObStatEventIds::MAJOR_SSSTORE_READ_ROW_COUNT); + } + } LOG_DEBUG("[INDEX BLOCK] inner get next row", KPC(store_row)); } LOG_DEBUG("chaser debug", K(ret), KPC(store_row), KPC(iter_param_)); diff --git a/src/storage/compaction/ob_mview_compaction_util.cpp b/src/storage/compaction/ob_mview_compaction_util.cpp index 6d4faa82dd..c40666d326 100644 --- a/src/storage/compaction/ob_mview_compaction_util.cpp +++ b/src/storage/compaction/ob_mview_compaction_util.cpp @@ -402,7 +402,6 @@ int ObMviewCompactionHelper::validate_row_count(const ObMergeParameter &merge_pa } else if (OB_FAIL(ObMviewCompactionHelper::create_inner_connection(session, conn))) { LOG_WARN("Failed to create inner connection", K(ret)); } else { - ObSessionStatEstGuard sess_stat_guard(MTL_ID(), session->get_sessid()); if (OB_FAIL(conn->execute_read(GCONF.cluster_id, MTL_ID(), sql.ptr(), read_result))) { LOG_WARN("Failed to execute", K(ret), K(sql)); } else if (OB_ISNULL(sql_result = static_cast(read_result.get_result()))) { diff --git a/src/storage/compaction/ob_partition_merge_iter.cpp b/src/storage/compaction/ob_partition_merge_iter.cpp index a646e01573..edac84ebb9 100644 --- a/src/storage/compaction/ob_partition_merge_iter.cpp +++ b/src/storage/compaction/ob_partition_merge_iter.cpp @@ -2160,18 +2160,12 @@ ObPartitionMVRowMergeIter::ObPartitionMVRowMergeIter(common::ObIAllocator &alloc free_session_ctx_(), session_(nullptr), conn_(nullptr), - sql_result_(nullptr), - sess_stat_guard_(nullptr) + sql_result_(nullptr) { } ObPartitionMVRowMergeIter::~ObPartitionMVRowMergeIter() { - if (nullptr != sess_stat_guard_) { - sess_stat_guard_->~ObSessionStatEstGuard(); - allocator_.free(sess_stat_guard_); - sess_stat_guard_ = nullptr; - } read_result_.~ReadResult(); // need decons before session ObMviewCompactionHelper::release_inner_connection(conn_); ObMviewCompactionHelper::release_inner_session(free_session_ctx_, session_); @@ -2247,9 +2241,6 @@ int ObPartitionMVRowMergeIter::inner_init(const ObMergeParameter &merge_param) LOG_WARN("Failed to create inner session", K(ret), KPC(merge_param.mview_merge_param_)); } else if (OB_FAIL(ObMviewCompactionHelper::create_inner_connection(session_, conn_))) { LOG_WARN("Failed to create inner connection", K(ret), K_(sql_idx)); - } else if (OB_ISNULL(sess_stat_guard_ = OB_NEWx(ObSessionStatEstGuard, &allocator_, MTL_ID(), session_->get_sessid()))) { - ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("Failed to alloc session stat guard", K(ret), K_(sql_idx), K(sql)); } else if (OB_FAIL(conn_->execute_read(GCONF.cluster_id, MTL_ID(), sql.ptr(), read_result_))) { LOG_WARN("Failed to execute", K(ret), K_(sql_idx), K(sql)); } else if (OB_ISNULL(sql_result_ = static_cast(read_result_.get_result()))) { diff --git a/src/storage/compaction/ob_partition_merge_iter.h b/src/storage/compaction/ob_partition_merge_iter.h index 43b4bbc2ba..7e7a4e6028 100644 --- a/src/storage/compaction/ob_partition_merge_iter.h +++ b/src/storage/compaction/ob_partition_merge_iter.h @@ -417,7 +417,7 @@ public: const ObITableReadInfo *read_info) override; virtual int next() override; TO_STRING_KV(K_(is_delete), K_(is_replace), K_(sql_idx), K_(sql_read_col_cnt), K_(store_col_cnt), - K_(free_session_ctx), KP_(session), KP_(conn), KP_(sql_result), KP_(sess_stat_guard)); + K_(free_session_ctx), KP_(session), KP_(conn), KP_(sql_result)); protected: virtual int inner_init(const ObMergeParameter &merge_param) override; virtual bool inner_check(const ObMergeParameter &merge_param) override; @@ -433,7 +433,6 @@ private: sql::ObSQLSessionInfo *session_; sqlclient::ObISQLConnection *conn_; observer::ObInnerSQLResult *sql_result_; - ObSessionStatEstGuard *sess_stat_guard_; }; static const int64_t DEFAULT_ITER_COUNT = 16; diff --git a/src/storage/compaction/ob_tablet_merge_task.cpp b/src/storage/compaction/ob_tablet_merge_task.cpp index 17bb1d6473..91cb9d526f 100644 --- a/src/storage/compaction/ob_tablet_merge_task.cpp +++ b/src/storage/compaction/ob_tablet_merge_task.cpp @@ -858,7 +858,6 @@ int ObTabletMergeDag::prepare_merge_ctx(bool &finish_flag) int ObTabletMergePrepareTask::process() { int ret = OB_SUCCESS; - ObTenantStatEstGuard stat_est_guard(MTL_ID()); ObBasicTabletMergeCtx *ctx = NULL; ObTaskController::get().switch_task(share::ObTaskType::DATA_MAINTAIN); bool finish_flag = false; @@ -1126,7 +1125,6 @@ int ObTabletMergeTask::generate_next_task(ObITask *&next_task) int ObTabletMergeTask::process() { int ret = OB_SUCCESS; - ObTenantStatEstGuard stat_est_guard(MTL_ID()); ObTaskController::get().switch_task(share::ObTaskType::DATA_MAINTAIN); #ifdef ERRSIM diff --git a/src/storage/ddl/ob_ddl_redo_log_writer.cpp b/src/storage/ddl/ob_ddl_redo_log_writer.cpp index 938e5f34b1..3c45d8309b 100644 --- a/src/storage/ddl/ob_ddl_redo_log_writer.cpp +++ b/src/storage/ddl/ob_ddl_redo_log_writer.cpp @@ -1438,7 +1438,7 @@ int ObDDLRedoLogWriter::write_commit_log_with_retry( LOG_WARN("write ddl commit log failed", K(ret)); } if (ObDDLRedoLogWriter::need_retry(ret)) { - usleep(1000L * 1000L); // 1s + ob_usleep(1000L * 1000L); // 1s ++retry_count; LOG_INFO("retry write ddl commit log", K(ret), K(table_key), K(retry_count)); } else { @@ -1997,7 +1997,7 @@ int ObDDLRedoLogWriterCallback::retry(const int64_t timeout_us, FLOG_INFO("retry write ddl macro redo success", K(ret), K(table_key_), K(macro_block_id)); } if (ObDDLRedoLogWriter::need_retry(ret)) { - usleep(1000L * 1000L); // 1s + ob_usleep(1000L * 1000L); // 1s ++retry_count; LOG_INFO("retry write ddl macro redo log", K(ret), K(table_key_), K(retry_count)); } else { diff --git a/src/storage/high_availability/ob_rebuild_service.cpp b/src/storage/high_availability/ob_rebuild_service.cpp index 88578fdb63..44134d18c3 100644 --- a/src/storage/high_availability/ob_rebuild_service.cpp +++ b/src/storage/high_availability/ob_rebuild_service.cpp @@ -452,6 +452,7 @@ void ObRebuildService::run1() if (OB_SERVER_IS_INIT == ret || fast_sleep_cnt_ > 0) { wait_time_ms = WAIT_SERVER_IN_SERVICE_TIME_MS; } + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait(wait_time_ms); fast_sleep_cnt_ = 0; } diff --git a/src/storage/high_availability/ob_storage_ha_diagnose_service.cpp b/src/storage/high_availability/ob_storage_ha_diagnose_service.cpp index aa5fc0a7fe..d751231809 100644 --- a/src/storage/high_availability/ob_storage_ha_diagnose_service.cpp +++ b/src/storage/high_availability/ob_storage_ha_diagnose_service.cpp @@ -155,6 +155,7 @@ void ObStorageHADiagService::run1() #ifdef ERRSIM wait_time_ms = GCONF.errsim_transfer_diagnose_server_wait_time / 1000; #endif + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait(wait_time_ms); } } diff --git a/src/storage/high_availability/ob_storage_ha_service.cpp b/src/storage/high_availability/ob_storage_ha_service.cpp index fd2a0148f4..5f9c51a37c 100644 --- a/src/storage/high_availability/ob_storage_ha_service.cpp +++ b/src/storage/high_availability/ob_storage_ha_service.cpp @@ -145,6 +145,7 @@ void ObStorageHAService::run1() if (has_set_stop() || wakeup_cnt_ > 0) { wakeup_cnt_ = 0; } else { + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait(SCHEDULER_WAIT_TIME_MS); } } diff --git a/src/storage/high_availability/ob_transfer_service.cpp b/src/storage/high_availability/ob_transfer_service.cpp index 2c1f38a82e..4189b71bcb 100644 --- a/src/storage/high_availability/ob_transfer_service.cpp +++ b/src/storage/high_availability/ob_transfer_service.cpp @@ -150,6 +150,7 @@ void ObTransferService::run1() if (tenant_config.is_valid()) { wait_time_ms = tenant_config->_transfer_service_wakeup_interval / 1000; } + ObBKGDSessInActiveGuard inactive_guard; thread_cond_.wait(wait_time_ms); } } diff --git a/src/storage/memtable/ob_lock_wait_mgr.cpp b/src/storage/memtable/ob_lock_wait_mgr.cpp index 4620b1802d..14c417ab0d 100644 --- a/src/storage/memtable/ob_lock_wait_mgr.cpp +++ b/src/storage/memtable/ob_lock_wait_mgr.cpp @@ -208,7 +208,7 @@ void ObLockWaitMgr::run1() row_holder_mapper_.clear(); } } - ob_usleep(10000); + ob_usleep(10000, true/*is_idle_sleep*/); } } diff --git a/src/storage/ob_bloom_filter_task.cpp b/src/storage/ob_bloom_filter_task.cpp index fdc713911c..18e888fb40 100644 --- a/src/storage/ob_bloom_filter_task.cpp +++ b/src/storage/ob_bloom_filter_task.cpp @@ -103,7 +103,6 @@ int ObBloomFilterBuildTask::process() int ret = OB_SUCCESS; ObBloomFilterCacheValue bfcache_value; - ObTenantStatEstGuard stat_est_guard(MTL_ID()); if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id_) || OB_UNLIKELY(!macro_id_.is_valid()) || OB_UNLIKELY(prefix_len_ <= 0)) { diff --git a/src/storage/tablelock/ob_lock_inner_connection_util.cpp b/src/storage/tablelock/ob_lock_inner_connection_util.cpp index 13be69cf8b..3ff8c32c1c 100644 --- a/src/storage/tablelock/ob_lock_inner_connection_util.cpp +++ b/src/storage/tablelock/ob_lock_inner_connection_util.cpp @@ -575,7 +575,7 @@ int ObInnerConnectionLockUtil::replace_lock( const bool local_execute = conn->is_local_execute(GCONF.cluster_id, tenant_id); - SMART_VAR(ObInnerSQLResult, res, conn->get_session()) + SMART_VAR(ObInnerSQLResult, res, conn->get_session(), conn->is_inner_session()) { if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; @@ -631,7 +631,7 @@ int ObInnerConnectionLockUtil::replace_lock(const uint64_t tenant_id, const bool local_execute = conn->is_local_execute(GCONF.cluster_id, tenant_id); - SMART_VAR(ObInnerSQLResult, res, conn->get_session()) + SMART_VAR(ObInnerSQLResult, res, conn->get_session(), conn->is_inner_session()) { if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; @@ -925,7 +925,7 @@ int ObInnerConnectionLockUtil::request_lock_( const bool local_execute = conn->is_local_execute(GCONF.cluster_id, tenant_id); - SMART_VAR(ObInnerSQLResult, res, conn->get_session()) + SMART_VAR(ObInnerSQLResult, res, conn->get_session(), conn->is_inner_session()) { if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; @@ -998,7 +998,7 @@ int ObInnerConnectionLockUtil::request_lock_( const bool local_execute = conn->is_local_execute(GCONF.cluster_id, tenant_id); - SMART_VAR(ObInnerSQLResult, res, conn->get_session()) + SMART_VAR(ObInnerSQLResult, res, conn->get_session(), conn->is_inner_session()) { if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; diff --git a/src/storage/tenant_snapshot/ob_tenant_snapshot_service.cpp b/src/storage/tenant_snapshot/ob_tenant_snapshot_service.cpp index ab70ece642..4381fb2b68 100644 --- a/src/storage/tenant_snapshot/ob_tenant_snapshot_service.cpp +++ b/src/storage/tenant_snapshot/ob_tenant_snapshot_service.cpp @@ -788,6 +788,7 @@ void ObTenantSnapshotService::run1() { ObThreadCondGuard guard(cond_); const uint64_t idle_time = calculate_idle_time_(); + ObBKGDSessInActiveGuard inactive_guard; cond_.wait(idle_time); } } diff --git a/src/storage/tmp_file/ob_tmp_file_thread_job.cpp b/src/storage/tmp_file/ob_tmp_file_thread_job.cpp index 3efe24cb31..4bb01cfb7f 100644 --- a/src/storage/tmp_file/ob_tmp_file_thread_job.cpp +++ b/src/storage/tmp_file/ob_tmp_file_thread_job.cpp @@ -29,7 +29,7 @@ int ObTmpFileSwapJob::init(int64_t expect_swap_size, uint32_t timeout_ms) STORAGE_LOG(WARN, "ObTmpFileSwapJob init twice", KR(ret)); } else if (timeout_ms <= 0) { ret = OB_INVALID_ARGUMENT; - } else if (OB_FAIL(swap_cond_.init(ObWaitEventIds::NULL_EVENT))) { + } else if (OB_FAIL(swap_cond_.init(ObWaitEventIds::THREAD_IDLING_COND_WAIT))) { STORAGE_LOG(WARN, "ObTmpFileSwapJob init cond failed", KR(ret)); } else { is_inited_ = true; diff --git a/src/storage/tmp_file/ob_tmp_file_thread_wrapper.cpp b/src/storage/tmp_file/ob_tmp_file_thread_wrapper.cpp index 835e9fb619..1851289ff0 100644 --- a/src/storage/tmp_file/ob_tmp_file_thread_wrapper.cpp +++ b/src/storage/tmp_file/ob_tmp_file_thread_wrapper.cpp @@ -774,7 +774,7 @@ int ObTmpFileSwapTG::init() if (IS_INIT) { ret = OB_INIT_TWICE; STORAGE_LOG(WARN, "ObTmpFileSwapTG init twice"); - } else if (OB_FAIL(idle_cond_.init(ObWaitEventIds::NULL_EVENT))) { + } else if (OB_FAIL(idle_cond_.init(ObWaitEventIds::THREAD_IDLING_COND_WAIT))) { STORAGE_LOG(WARN, "failed to init condition variable", KR(ret)); } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::TmpFileSwap, tg_id_))) { STORAGE_LOG(WARN, "fail to create swap thread", KR(ret)); diff --git a/src/storage/tx/ob_dup_table_util.cpp b/src/storage/tx/ob_dup_table_util.cpp index 56975ae254..ea5b6d5575 100644 --- a/src/storage/tx/ob_dup_table_util.cpp +++ b/src/storage/tx/ob_dup_table_util.cpp @@ -1853,6 +1853,7 @@ void ObDupTableLoopWorker::run1() time_used = ObTimeUtility::current_time() - start_time; if (time_used < LOOP_INTERVAL) { + ObBKGDSessInActiveGuard inactive_guard; usleep(LOOP_INTERVAL - time_used); } } diff --git a/src/storage/tx/ob_gts_source.cpp b/src/storage/tx/ob_gts_source.cpp index b0f9b7da6a..9a46c7d91d 100644 --- a/src/storage/tx/ob_gts_source.cpp +++ b/src/storage/tx/ob_gts_source.cpp @@ -548,6 +548,7 @@ int ObGtsSource::get_gts_leader_(ObAddr &leader) TRANS_LOG(WARN, "gts cache leader is invalid", KR(ret), K(leader), K(*this)); } } + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(sys_ls_leader_addr_, static_cast(leader.get_ipv4() << 31 | leader.get_port())); return ret; } diff --git a/src/storage/tx/ob_standby_timestamp_service.cpp b/src/storage/tx/ob_standby_timestamp_service.cpp index b0e5db1f55..653c80789a 100644 --- a/src/storage/tx/ob_standby_timestamp_service.cpp +++ b/src/storage/tx/ob_standby_timestamp_service.cpp @@ -149,7 +149,7 @@ void ObStandbyTimestampService::run1() int64_t end_tstamp = ObTimeUtility::current_time(); int64_t wait_interval = GCONF.weak_read_version_refresh_interval - (end_tstamp - begin_tstamp); if (wait_interval > 0) { - ob_usleep(wait_interval); + ob_usleep(wait_interval, true/*is_idle_sleep*/); } } TRANS_LOG(INFO, "ObStandbyTimestampService thread end", K_(tenant_id)); diff --git a/src/storage/tx/ob_trans_define_v4.cpp b/src/storage/tx/ob_trans_define_v4.cpp index 71ddfce457..231fad5c9a 100644 --- a/src/storage/tx/ob_trans_define_v4.cpp +++ b/src/storage/tx/ob_trans_define_v4.cpp @@ -580,6 +580,7 @@ void ObTxDesc::reset() addr_.reset(); tx_id_.reset(); + GET_DIAGNOSTIC_INFO->get_ash_stat().tx_id_ = 0; xid_.reset(); xa_tightly_couple_ = true; xa_start_addr_.reset(); @@ -635,6 +636,18 @@ void ObTxDesc::reset() modified_tables_.reset(); } +void ObTxDesc::set_tx_id(const ObTransID &tx_id) +{ + tx_id_ = tx_id; + GET_DIAGNOSTIC_INFO->get_ash_stat().tx_id_ = tx_id.get_id(); +} + +void ObTxDesc::reset_tx_id() +{ + tx_id_.reset(); + GET_DIAGNOSTIC_INFO->get_ash_stat().tx_id_ = 0; +} + const ObString &ObTxDesc::get_tx_state_str() const { static const ObString TxStateName[] = { diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index 358ad1efee..90572e5d16 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -708,8 +708,8 @@ private: private: /* these routine should be called by txn-service only to avoid corrupted state */ void reset(); - void set_tx_id(const ObTransID &tx_id) { tx_id_ = tx_id; } - void reset_tx_id() { tx_id_.reset(); } + void set_tx_id(const ObTransID &tx_id); + void reset_tx_id(); // udpate clean part's unknown field int update_clean_part(const share::ObLSID &id, const int64_t epoch, diff --git a/src/storage/tx/ob_trans_event.cpp b/src/storage/tx/ob_trans_event.cpp index 62d172307d..03b25cb864 100644 --- a/src/storage/tx/ob_trans_event.cpp +++ b/src/storage/tx/ob_trans_event.cpp @@ -87,68 +87,68 @@ int64_t ObTransStatItem::to_string(char *buf, const int64_t buf_len) const void ObTransStatistic::add_sys_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); // EVENT_ADD(TRANS_SYSTEM_TRANS_COUNT, value); //sys_trans_count_stat_.add(value); } void ObTransStatistic::add_user_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_USER_TRANS_COUNT, value); //user_trans_count_stat_.add(value); } void ObTransStatistic::add_commit_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_COMMIT_COUNT, value); } void ObTransStatistic::add_rollback_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_ROLLBACK_COUNT, value); } void ObTransStatistic::add_trans_start_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_START_COUNT, value); } void ObTransStatistic::add_trans_timeout_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_TIMEOUT_COUNT, value); } void ObTransStatistic::add_trans_total_used_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_TOTAL_USED_TIME, value); //trans_total_used_time_stat_.add(value); } void ObTransStatistic::add_elr_enable_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_ELR_ENABLE_COUNT, value); } void ObTransStatistic::add_elr_unable_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_ELR_UNABLE_COUNT, value); } void ObTransStatistic::add_read_elr_row_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(READ_ELR_ROW_COUNT, value); } void ObTransStatistic::add_local_stmt_count(const uint64_t tenant_id, const int64_t value) { UNUSED(value); - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_LOCAL_STMT_COUNT, value); //local_stmt_stat_.add(value); } @@ -156,7 +156,7 @@ void ObTransStatistic::add_local_stmt_count(const uint64_t tenant_id, const int6 void ObTransStatistic::add_remote_stmt_count(const uint64_t tenant_id, const int64_t value) { UNUSED(value); - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_REMOTE_STMT_COUNT, value); //remote_stmt_stat_.add(value); } @@ -164,7 +164,7 @@ void ObTransStatistic::add_remote_stmt_count(const uint64_t tenant_id, const int void ObTransStatistic::add_distributed_stmt_count(const uint64_t tenant_id, const int64_t value) { UNUSED(value); - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_DISTRIBUTED_STMT_COUNT, value); //distributed_stmt_stat_.add(value); } @@ -172,356 +172,356 @@ void ObTransStatistic::add_distributed_stmt_count(const uint64_t tenant_id, cons void ObTransStatistic::add_clog_submit_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_COMMIT_LOG_SUBMIT_COUNT, value); //clog_submit_count_stat_.add(value); } void ObTransStatistic::add_clog_sync_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_COMMIT_LOG_SYNC_TIME, value); //clog_sync_time_stat_.add(value); } void ObTransStatistic::add_clog_sync_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_COMMIT_LOG_SYNC_COUNT, value); //clog_sync_count_stat_.add(value); } void ObTransStatistic::add_trans_commit_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_COMMIT_TIME, value); //trans_commit_time_stat_.add(value); } void ObTransStatistic::add_trans_rollback_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_ROLLBACK_TIME, value); //trans_rollback_time_stat_.add(value); } void ObTransStatistic::add_readonly_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_READONLY_COUNT, value); } void ObTransStatistic::add_local_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_LOCAL_COUNT, value); } void ObTransStatistic::add_dist_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_DIST_COUNT, value); } void ObTransStatistic::add_redo_log_replay_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(REDO_LOG_REPLAY_COUNT, value); } void ObTransStatistic::add_redo_log_replay_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(REDO_LOG_REPLAY_TIME, value); } void ObTransStatistic::add_prepare_log_replay_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(PREPARE_LOG_REPLAY_COUNT, value); } void ObTransStatistic::add_prepare_log_replay_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(PREPARE_LOG_REPLAY_TIME, value); } void ObTransStatistic::add_commit_log_replay_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(COMMIT_LOG_REPLAY_COUNT, value); } void ObTransStatistic::add_commit_log_replay_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(COMMIT_LOG_REPLAY_TIME, value); } void ObTransStatistic::add_abort_log_replay_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(ABORT_LOG_REPLAY_COUNT, value); } void ObTransStatistic::add_abort_log_replay_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(ABORT_LOG_REPLAY_TIME, value); } void ObTransStatistic::add_clear_log_replay_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(CLEAR_LOG_REPLAY_COUNT, value); } void ObTransStatistic::add_clear_log_replay_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(CLEAR_LOG_REPLAY_TIME, value); } void ObTransStatistic::add_sp_redo_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(SP_REDO_LOG_CB_COUNT, value); } void ObTransStatistic::add_sp_redo_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(SP_REDO_LOG_CB_TIME, value); } void ObTransStatistic::add_sp_commit_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(SP_COMMIT_LOG_CB_COUNT, value); } void ObTransStatistic::add_sp_commit_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(SP_COMMIT_LOG_CB_TIME, value); } void ObTransStatistic::add_redo_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(REDO_LOG_CB_COUNT, value); } void ObTransStatistic::add_redo_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(REDO_LOG_CB_TIME, value); } void ObTransStatistic::add_prepare_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(PREPARE_LOG_CB_COUNT, value); } void ObTransStatistic::add_prepare_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(PREPARE_LOG_CB_TIME, value); } void ObTransStatistic::add_commit_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(COMMIT_LOG_CB_COUNT, value); } void ObTransStatistic::add_commit_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(COMMIT_LOG_CB_TIME, value); } void ObTransStatistic::add_abort_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(ABORT_LOG_CB_COUNT, value); } void ObTransStatistic::add_abort_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(ABORT_LOG_CB_TIME, value); } void ObTransStatistic::add_clear_log_cb_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(CLEAR_LOG_CB_COUNT, value); } void ObTransStatistic::add_clear_log_cb_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(CLEAR_LOG_CB_TIME, value); } void ObTransStatistic::add_trans_callback_sql_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_CALLBACK_SQL_COUNT, value); } void ObTransStatistic::add_trans_callback_sql_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_CALLBACK_SQL_TIME, value); } void ObTransStatistic::add_trans_mt_end_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_MT_END_COUNT, value); } void ObTransStatistic::add_trans_mt_end_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_MT_END_TIME, value); } void ObTransStatistic::add_memstore_mutator_size(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(CLOG_MEMSTORE_MUTATOR_TOTAL_SIZE, value); } void ObTransStatistic::add_stmt_timeout_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_STRONG_CONSISTENCY_STMT_TIMEOUT_COUNT, value); } void ObTransStatistic::add_slave_read_stmt_timeout_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_SLAVE_READ_STMT_TIMEOUT_COUNT, value); } void ObTransStatistic::add_slave_read_stmt_retry_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_SLAVE_READ_STMT_RETRY_COUNT, value); } void ObTransStatistic::add_fill_redo_log_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_FILL_REDO_LOG_COUNT, value); } void ObTransStatistic::add_fill_redo_log_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_FILL_REDO_LOG_TIME, value); } void ObTransStatistic::add_submit_trans_log_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_SUBMIT_LOG_COUNT, value); } void ObTransStatistic::add_submit_trans_log_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_SUBMIT_LOG_TIME, value); } void ObTransStatistic::add_gts_request_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_REQUEST_TOTAL_COUNT, value); } void ObTransStatistic::add_gts_acquire_total_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_ACQUIRE_TOTAL_TIME, value); } void ObTransStatistic::add_gts_acquire_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(GTS_ACQUIRE_TOTAL_COUNT, value); } void ObTransStatistic::add_gts_acquire_total_wait_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(GTS_ACQUIRE_TOTAL_WAIT_COUNT, value); } void ObTransStatistic::add_gts_wait_elapse_total_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_WAIT_ELAPSE_TOTAL_TIME, value); } void ObTransStatistic::add_gts_wait_elapse_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_WAIT_ELAPSE_TOTAL_COUNT, value); } void ObTransStatistic::add_gts_wait_elapse_total_wait_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_WAIT_ELAPSE_TOTAL_WAIT_COUNT, value); } void ObTransStatistic::add_gts_rpc_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_RPC_COUNT, value); } void ObTransStatistic::add_gts_try_acquire_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_TRY_ACQUIRE_TOTAL_COUNT, value); } void ObTransStatistic::add_gts_try_wait_elapse_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(GTS_TRY_WAIT_ELAPSE_TOTAL_COUNT, value); } void ObTransStatistic::add_stmt_total_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_STMT_TOTAL_COUNT, value); } void ObTransStatistic::add_stmt_interval_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_STMT_INTERVAL_TIME, value); } void ObTransStatistic::add_trans_multi_partition_update_stmt_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_MULTI_PARTITION_UPDATE_STMT_COUNT, value); } void ObTransStatistic::add_batch_commit_trans_count(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); //EVENT_ADD(TRANS_BATCH_COMMIT_COUNT, value); } void ObTransStatistic::add_trans_log_total_size(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(CLOG_TRANS_LOG_TOTAL_SIZE, value); } void ObTransStatistic::add_local_trans_total_used_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_LOCAL_TOTAL_USED_TIME, value); } void ObTransStatistic::add_dist_trans_total_used_time(const uint64_t tenant_id, const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id); + ObTenantDiagnosticInfoSummaryGuard g(tenant_id, 0); EVENT_ADD(TRANS_DIST_TOTAL_USED_TIME, value); } diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index 9dc300897f..3fb78382a9 100644 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -3990,7 +3990,7 @@ int ObTransService::ask_tx_state_for_4377(const ObLSID ls_id, } if (OB_FAIL(ret)) { - usleep(SLEEP_DURATION_FOR_ASK_STATE_FOR_4377); + ob_usleep(SLEEP_DURATION_FOR_ASK_STATE_FOR_4377); } if (OB_FAIL(ret) && ObTimeUtility::current_time() - start_ts >= MAX_ALLOWED_ASK_STATE_FOR_4377_TIMES) { diff --git a/src/storage/tx/ob_ts_mgr.cpp b/src/storage/tx/ob_ts_mgr.cpp index 4f2e81719c..fdce418ca6 100644 --- a/src/storage/tx/ob_ts_mgr.cpp +++ b/src/storage/tx/ob_ts_mgr.cpp @@ -494,7 +494,7 @@ void ObTsMgr::run1() lib::set_thread_name("TsMgr"); while (!has_set_stop()) { // sleep 100 * 1000 us - ob_usleep(REFRESH_GTS_INTERVEL_US); + ob_usleep(REFRESH_GTS_INTERVEL_US, true/*is_idle_sleep*/); ts_source_info_map_.for_each(gts_refresh_funtor); ts_source_info_map_.for_each(get_obsolete_tenant_functor); for (int64_t i = 0; i < ids.count(); i++) { diff --git a/src/storage/tx/ob_tx_loop_worker.cpp b/src/storage/tx/ob_tx_loop_worker.cpp index 026b59b15f..ea9e61c589 100644 --- a/src/storage/tx/ob_tx_loop_worker.cpp +++ b/src/storage/tx/ob_tx_loop_worker.cpp @@ -133,7 +133,7 @@ void ObTxLoopWorker::run1() time_used = ObTimeUtility::current_time() - start_time_us; if (time_used < LOOP_INTERVAL) { - ob_usleep(LOOP_INTERVAL- time_used); + ob_usleep(LOOP_INTERVAL- time_used, true/*is_idle_sleep*/); } can_gc_tx = false; can_gc_retain_ctx = false; @@ -287,7 +287,7 @@ void ObTxLoopWorker::update_max_commit_ts_() ret = OB_TIMEOUT; } else if (OB_FAIL(OB_TS_MGR.get_gts(MTL_ID(), NULL, snapshot))) { if (OB_EAGAIN == ret) { - ob_usleep(500); + ob_usleep(500, true/*is_idle_sleep*/); } else { TRANS_LOG(WARN, "get gts fail", "tenant_id", MTL_ID()); } diff --git a/src/storage/tx/ob_xa_inner_table_gc_worker.cpp b/src/storage/tx/ob_xa_inner_table_gc_worker.cpp index 32ed9664df..53f4cba0a3 100644 --- a/src/storage/tx/ob_xa_inner_table_gc_worker.cpp +++ b/src/storage/tx/ob_xa_inner_table_gc_worker.cpp @@ -15,6 +15,7 @@ #include "observer/omt/ob_multi_tenant.h" #include "observer/ob_server.h" #include "share/rc/ob_tenant_base.h" +#include "lib/ash/ob_active_session_guard.h" namespace oceanbase { @@ -72,8 +73,11 @@ void ObXAInnerTableGCWorker::run1() int64_t start_delay = ObRandom::rand(1, 100); // use start delay avoid diffient thread do gc on the same time lib::set_thread_name("ObXAGCWorker"); - for (int64_t i = 0; i < start_delay && !has_set_stop(); ++i) { - sleep(1); + { + ObBKGDSessInActiveGuard inactive_guard; + for (int64_t i = 0; i < start_delay && !has_set_stop(); ++i) { + sleep(1); + } } constexpr int64_t gc_interval_upper_bound = 24L * (3600L * 1000L * 1000L); //upper bound is 24h @@ -132,7 +136,10 @@ void ObXAInnerTableGCWorker::run1() } } //sleep 20 secnd whether gc succ or not - SLEEP(20); + { + ObBKGDSessInActiveGuard inactive_guard; + SLEEP(20); + } // try refresh gc_interval, // if gc falied, and not update last_scan_ts, update gc_interval can be effective // gc_interval ~ [20s, 24h] diff --git a/src/storage/tx/ob_xa_trans_event.cpp b/src/storage/tx/ob_xa_trans_event.cpp index 8fd8082b12..3ee159f4a0 100644 --- a/src/storage/tx/ob_xa_trans_event.cpp +++ b/src/storage/tx/ob_xa_trans_event.cpp @@ -53,217 +53,186 @@ void ObXATransStatistics::reset() void ObXATransStatistics::inc_xa_start_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_START_TOTAL_COUNT, 1); ATOMIC_INC(&xa_start_count_); } void ObXATransStatistics::add_xa_start_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_START_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_start_used_time_us_, value); } void ObXATransStatistics::inc_xa_start_remote_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_START_REMOTE_COUNT, 1); ATOMIC_INC(&xa_start_remote_count_); } void ObXATransStatistics::inc_xa_start_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_START_FAIL_COUNT, 1); ATOMIC_INC(&xa_start_fail_count_); } void ObXATransStatistics::inc_xa_end_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_END_TOTAL_COUNT, 1); ATOMIC_INC(&xa_end_count_); } void ObXATransStatistics::add_xa_end_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_END_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_end_used_time_us_, value); } void ObXATransStatistics::inc_xa_end_remote_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_END_REMOTE_COUNT, 1); ATOMIC_INC(&xa_end_remote_count_); } void ObXATransStatistics::inc_xa_end_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_END_FAIL_COUNT, 1); ATOMIC_INC(&xa_end_fail_count_); } void ObXATransStatistics::inc_xa_prepare_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_PREPARE_TOTAL_COUNT, 1); ATOMIC_INC(&xa_prepare_count_); } void ObXATransStatistics::add_xa_prepare_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_PREPARE_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_prepare_used_time_us_, value); } void ObXATransStatistics::inc_xa_prepare_remote_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_PREPARE_REMOTE_COUNT, 1); ATOMIC_INC(&xa_prepare_remote_count_); } void ObXATransStatistics::inc_xa_prepare_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_PREPARE_FAIL_COUNT, 1); ATOMIC_INC(&xa_prepare_fail_count_); } void ObXATransStatistics::inc_xa_commit_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_COMMIT_TOTAL_COUNT, 1); ATOMIC_INC(&xa_commit_count_); } void ObXATransStatistics::add_xa_commit_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_COMMIT_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_commit_used_time_us_, value); } void ObXATransStatistics::inc_xa_commit_remote_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_COMMIT_REMOTE_COUNT, 1); ATOMIC_INC(&xa_commit_remote_count_); } void ObXATransStatistics::inc_xa_commit_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_COMMIT_FAIL_COUNT, 1); ATOMIC_INC(&xa_commit_fail_count_); } void ObXATransStatistics::inc_xa_rollback_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_ROLLBACK_TOTAL_COUNT, 1); ATOMIC_INC(&xa_rollback_count_); } void ObXATransStatistics::add_xa_rollback_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_ROLLBACK_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_rollback_used_time_us_, value); } void ObXATransStatistics::inc_xa_rollback_remote_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_ROLLBACK_REMOTE_COUNT, 1); ATOMIC_INC(&xa_rollback_remote_count_); } void ObXATransStatistics::inc_xa_rollback_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_ROLLBACK_FAIL_COUNT, 1); ATOMIC_INC(&xa_rollback_fail_count_); } void ObXATransStatistics::inc_xa_trans_start_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_TRANS_START_COUNT, 1); ATOMIC_INC(&xa_trans_start_count_); } void ObXATransStatistics::inc_xa_read_only_trans_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_READ_ONLY_TRANS_TOTAL_COUNT, 1); ATOMIC_INC(&xa_read_only_trans_count_); } void ObXATransStatistics::inc_xa_one_phase_commit_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_ONE_PHASE_COMMIT_TOTAL_COUNT, 1); ATOMIC_INC(&xa_one_phase_commit_count_); } void ObXATransStatistics::inc_xa_inner_sql_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_SQL_TOTAL_COUNT, 1); ATOMIC_INC(&xa_inner_sql_count_); } void ObXATransStatistics::add_xa_inner_sql_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_SQL_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_inner_sql_used_time_us_, value); } void ObXATransStatistics::inc_xa_inner_rpc_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_RPC_TOTAL_COUNT, 1); ATOMIC_INC(&xa_inner_rpc_count_); } void ObXATransStatistics::add_xa_inner_rpc_total_used_time(const int64_t value) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_RPC_TOTAL_USED_TIME, value); ATOMIC_FAA(&xa_inner_rpc_used_time_us_, value); } void ObXATransStatistics::inc_xa_inner_sql_ten_ms_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_SQL_TEN_MS_COUNT, 1); ATOMIC_INC(&xa_inner_sql_ten_ms_count_); } void ObXATransStatistics::inc_xa_inner_sql_twenty_ms_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_SQL_TWENTY_MS_COUNT, 1); ATOMIC_INC(&xa_inner_sql_twenty_ms_count_); } void ObXATransStatistics::inc_xa_inner_rpc_ten_ms_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_RPC_TEN_MS_COUNT, 1); ATOMIC_INC(&xa_inner_rpc_ten_ms_count_); } void ObXATransStatistics::inc_xa_inner_rpc_twenty_ms_total_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(XA_INNER_RPC_TWENTY_MS_COUNT, 1); ATOMIC_INC(&xa_inner_rpc_twenty_ms_count_); } @@ -451,175 +420,150 @@ void ObDBLinkTransStatistics::reset() void ObDBLinkTransStatistics::inc_dblink_trans_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_COUNT, 1); ATOMIC_INC(&dblink_trans_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_callback_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_CALLBACK_COUNT, 1); ATOMIC_INC(&dblink_trans_callback_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_promotion_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_PROMOTION_COUNT, 1); ATOMIC_INC(&dblink_trans_promotion_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_commit_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_COMMIT_COUNT, 1); ATOMIC_INC(&dblink_trans_commit_count_); } void ObDBLinkTransStatistics::add_dblink_trans_commit_used_time(const int64_t used_time) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_COMMIT_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_commit_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_commit_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_COMMIT_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_commit_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_rollback_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_ROLLBACK_COUNT, 1); ATOMIC_INC(&dblink_trans_rollback_count_); } void ObDBLinkTransStatistics::add_dblink_trans_rollback_used_time(const int64_t used_time) { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_ROLLBACK_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_rollback_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_rollback_fail_count() { - common::ObTenantStatEstGuard guard(tenant_id_); EVENT_ADD(DBLINK_TRANS_ROLLBACK_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_rollback_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_start_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_START_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_start_count_); } void ObDBLinkTransStatistics::add_dblink_trans_xa_start_used_time(const int64_t used_time) { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_START_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_xa_start_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_start_fail_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_START_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_start_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_end_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_END_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_end_count_); } void ObDBLinkTransStatistics::add_dblink_trans_xa_end_used_time(const int64_t used_time) { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_END_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_xa_end_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_end_fail_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_END_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_end_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_prepare_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_PREPARE_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_prepare_count_); } void ObDBLinkTransStatistics::add_dblink_trans_xa_prepare_used_time(const int64_t used_time) { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_PREPARE_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_xa_prepare_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_prepare_fail_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_PREPARE_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_prepare_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_commit_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_COMMIT_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_commit_count_); } void ObDBLinkTransStatistics::add_dblink_trans_xa_commit_used_time(const int64_t used_time) { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_COMMIT_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_xa_commit_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_commit_fail_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_COMMIT_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_commit_fail_count_); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_rollback_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_ROLLBACK_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_rollback_count_); } void ObDBLinkTransStatistics::add_dblink_trans_xa_rollback_used_time(const int64_t used_time) { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_ROLLBACK_USED_TIME, used_time); ATOMIC_FAA(&dblink_trans_xa_rollback_used_time_, used_time); } void ObDBLinkTransStatistics::inc_dblink_trans_xa_rollback_fail_count() { - // common::ObTenantStatEstGuard guard(tenant_id_); // EVENT_ADD(DBLINK_TRANS_XA_ROLLBACK_FAIL_COUNT, 1); ATOMIC_INC(&dblink_trans_xa_rollback_fail_count_); } diff --git a/src/storage/tx/ob_xa_trans_heartbeat_worker.cpp b/src/storage/tx/ob_xa_trans_heartbeat_worker.cpp index 296e34d898..058ddffa89 100644 --- a/src/storage/tx/ob_xa_trans_heartbeat_worker.cpp +++ b/src/storage/tx/ob_xa_trans_heartbeat_worker.cpp @@ -92,7 +92,7 @@ void ObXATransHeartbeatWorker::run1() } if (time_used < INTERVAL_US) { - ob_usleep((uint32_t)(INTERVAL_US - time_used)); + ob_usleep((uint32_t)(INTERVAL_US - time_used), true/*is_idle_sleep*/); } } } diff --git a/src/storage/tx/wrs/ob_black_list.cpp b/src/storage/tx/wrs/ob_black_list.cpp index 791ee6c570..dfd53ef84d 100644 --- a/src/storage/tx/wrs/ob_black_list.cpp +++ b/src/storage/tx/wrs/ob_black_list.cpp @@ -16,6 +16,7 @@ #include "deps/oblib/src/common/ob_role.h" // role #include "storage/tx/wrs/ob_weak_read_util.h" // ObWeakReadUtil #include "storage/tx/ob_ts_mgr.h" +#include "lib/ash/ob_active_session_guard.h" // ObASHSetInnerSqlWaitGuard namespace oceanbase { @@ -192,6 +193,7 @@ void ObBLService::run1() int64_t wait_interval = BLACK_LIST_REFRESH_INTERVAL - cost_time; TRANS_LOG(INFO, "ls blacklist refresh finish", K(cost_time)); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; thread_cond_.timedwait(wait_interval); } } @@ -210,6 +212,7 @@ void ObBLService::do_thread_task_(const int64_t begin_tstamp, // 查询ls内部表,根据时间戳信息决定是否将ls其加入黑名单 SMART_VAR(ObISQLClient::ReadResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::LOG_GET_BLACK_LIST_LS_INFO); if (OB_ISNULL((sql_proxy = GCTX.sql_proxy_))) { ret = OB_ERR_UNEXPECTED; TRANS_LOG(WARN, "sql_proxy is null", KR(ret)); diff --git a/src/storage/tx/wrs/ob_tenant_weak_read_cluster_service.cpp b/src/storage/tx/wrs/ob_tenant_weak_read_cluster_service.cpp index 573523bbd0..fc7bbf7ea5 100644 --- a/src/storage/tx/wrs/ob_tenant_weak_read_cluster_service.cpp +++ b/src/storage/tx/wrs/ob_tenant_weak_read_cluster_service.cpp @@ -194,6 +194,7 @@ int ObTenantWeakReadClusterService::query_cluster_version_range_(SCN &cur_min_ve int ret = OB_SUCCESS; ObSqlString sql; SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::TX_GET_WEAK_READ_VERSION_RANGE); ObMySQLResult *result = NULL; uint64_t tenant_id = MTL_ID(); const uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id); @@ -297,6 +298,7 @@ int ObTenantWeakReadClusterService::persist_version_if_need_(const SCN last_min_ // check if need update // NOTE:min_version <= max_version if (new_min_version > last_min_version && new_min_version >= last_max_version) { + ObASHSetInnerSqlWaitGuard ash_inner_sql_guard(ObInnerSqlWaitTypeId::TX_UPDATE_WEAK_READ_VERSION); if (OB_ISNULL(mysql_proxy_)) { ret = OB_NOT_INIT; } else if (OB_FAIL(build_update_version_sql_(last_min_version, last_max_version, diff --git a/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp b/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp index fb970722dd..9116c81a39 100644 --- a/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp +++ b/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp @@ -25,6 +25,7 @@ #include "rpc/obrpc/ob_rpc_net_handler.h" #include "share/location_cache/ob_location_service.h" #include "storage/tx_storage/ob_ls_service.h" +#include "lib/ash/ob_active_session_guard.h" #define MOD_STR "[WRS] [TENANT_WEAK_READ_SERVICE] " @@ -708,6 +709,7 @@ void ObTenantWeakReadService::run1() int64_t wait_interval = std::min(ObWeakReadUtil::replica_keepalive_interval(), weak_read_refresh_interval - (end_tstamp - begin_tstamp)); if (wait_interval > 0) { + common::ObBKGDSessInActiveGuard inactive_guard; thread_cond_.timedwait(wait_interval); } } diff --git a/src/storage/tx_storage/ob_access_service.cpp b/src/storage/tx_storage/ob_access_service.cpp index c292e96d44..4b10005534 100644 --- a/src/storage/tx_storage/ob_access_service.cpp +++ b/src/storage/tx_storage/ob_access_service.cpp @@ -319,6 +319,8 @@ int ObAccessService::table_scan( DISABLE_SQL_MEMLEAK_GUARD; const share::ObLSID &ls_id = vparam.ls_id_; const common::ObTabletID &data_tablet_id = vparam.tablet_id_; + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = data_tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); ObTableScanIterator *iter = nullptr; ObTabletHandle tablet_handle; ObLS *ls = nullptr; @@ -399,6 +401,8 @@ int ObAccessService::table_rescan( ObTableScanIterator *iter = static_cast(result); const share::ObLSID &ls_id = vparam.ls_id_; const common::ObTabletID &data_tablet_id = vparam.tablet_id_; + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = data_tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); ObLS *ls = nullptr; ObLSTabletService *tablet_service = nullptr; ObStoreAccessType access_type = param.scan_flag_.is_read_latest() ? @@ -819,6 +823,8 @@ int ObAccessService::delete_rows( int64_t &affected_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; ObLS *ls = nullptr; @@ -873,6 +879,8 @@ int ObAccessService::put_rows( int64_t &affected_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; ObLS *ls = nullptr; ObLSTabletService *tablet_service = nullptr; @@ -926,6 +934,8 @@ int ObAccessService::insert_rows( int64_t &affected_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; ObLS *ls = nullptr; @@ -983,6 +993,8 @@ int ObAccessService::insert_row( blocksstable::ObDatumRowIterator *&duplicated_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; ObLS *ls = nullptr; @@ -1034,6 +1046,8 @@ int ObAccessService::insert_row( int ObAccessService::revert_insert_iter(blocksstable::ObDatumRowIterator *iter) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = 0; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, 0); int ret = OB_SUCCESS; if (OB_LIKELY(nullptr != iter)) { ObQueryIteratorFactory::free_insert_dup_iter(iter); @@ -1052,6 +1066,8 @@ int ObAccessService::update_rows( int64_t &affected_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; ObLS *ls = nullptr; @@ -1108,6 +1124,8 @@ int ObAccessService::lock_rows( int64_t &affected_rows) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; DISABLE_SQL_MEMLEAK_GUARD; ObLS *ls = nullptr; @@ -1163,6 +1181,8 @@ int ObAccessService::lock_row( const ObLockFlag lock_flag) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = tablet_id.id(); + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, ls_id.id()); int ret = OB_SUCCESS; ObLS *ls = nullptr; ObLSTabletService *tablet_service = nullptr; @@ -1309,6 +1329,8 @@ int ObAccessService::get_multi_ranges_cost( int ObAccessService::reuse_scan_iter(const bool switch_param, ObNewRowIterator *iter) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = 0; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, 0); int ret = OB_SUCCESS; if (IS_NOT_INIT) { ret = OB_NOT_INIT; @@ -1332,6 +1354,8 @@ int ObAccessService::reuse_scan_iter(const bool switch_param, ObNewRowIterator * int ObAccessService::revert_scan_iter(ObNewRowIterator *iter) { ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_read); + GET_DIAGNOSTIC_INFO->get_ash_stat().tablet_id_ = 0; + ACTIVE_SESSION_RETRY_DIAG_INFO_SETTER(ls_id_, 0); int ret = OB_SUCCESS; NG_TRACE(S_revert_iter_begin); if (IS_NOT_INIT) { diff --git a/src/storage/tx_storage/ob_ls_service.cpp b/src/storage/tx_storage/ob_ls_service.cpp index 5b31ef115a..f8c139492d 100644 --- a/src/storage/tx_storage/ob_ls_service.cpp +++ b/src/storage/tx_storage/ob_ls_service.cpp @@ -309,7 +309,7 @@ int ObLSService::wait() if (retry_times % 100 == 0) { LOG_WARN("ls service wait empty for too much time", K(retry_times), K(begin_time)); } - usleep(100 * 1000); // 100 ms + ob_usleep(100 * 1000); // 100 ms } retry_times = 0; while(ATOMIC_LOAD(&iter_cnt_) != 0) { @@ -317,7 +317,7 @@ int ObLSService::wait() if (retry_times % 100 == 0) { LOG_WARN("ls service wait ls iter for too much time", K(retry_times), K_(iter_cnt), K(begin_time)); } - usleep(100 * 1000); // 100 ms + ob_usleep(100 * 1000); // 100 ms } return ret; } @@ -783,7 +783,7 @@ int ObLSService::gc_ls_after_replay_slog() ls->wait(); } if (OB_SUCCESS != tmp_ret) { - usleep(SLEEP_TS); + ob_usleep(SLEEP_TS); } } while(tmp_ret != OB_SUCCESS); } @@ -794,7 +794,7 @@ int ObLSService::gc_ls_after_replay_slog() LOG_ERROR("fail to write create ls abort slog", K(tmp_ret), KPC(ls)); } if (OB_TMP_FAIL(tmp_ret)) { - usleep(SLEEP_TS); + ob_usleep(SLEEP_TS); } } while (tmp_ret != OB_SUCCESS); remove_ls_(ls, true/*remove_from_disk*/, false/*write_slog*/); diff --git a/src/storage/tx_storage/ob_tablet_gc_service.cpp b/src/storage/tx_storage/ob_tablet_gc_service.cpp index 12d217597a..2b007153ec 100755 --- a/src/storage/tx_storage/ob_tablet_gc_service.cpp +++ b/src/storage/tx_storage/ob_tablet_gc_service.cpp @@ -249,7 +249,7 @@ void ObTabletGCService::ObTabletChangeTask::runTimerTask() // 5. wait unpersit_tablet_ids else if (no_need_wait_persist) { // temporariily skip for not support persist uncommited mds data. - ob_usleep(ObTabletGCHandler::FLUSH_CHECK_INTERVAL); + ob_usleep(ObTabletGCHandler::FLUSH_CHECK_INTERVAL, true); } else if(OB_FAIL(tablet_gc_handler->wait_unpersist_tablet_ids_flushed(unpersist_tablet_ids, decided_scn))) { need_retry = true; STORAGE_LOG(WARN, "fail to wait unpersist tablet ids flushed", KR(ret), KPC(tablet_gc_handler->ls_), K(unpersist_tablet_ids)); @@ -671,7 +671,7 @@ int ObTabletGCHandler::wait_unpersist_tablet_ids_flushed(const common::ObTabletI } // wait all tablet flushed while (unpersist_tablet_ids.count() > i && retry_times > 0 && OB_SUCC(ret)) { - ob_usleep(FLUSH_CHECK_INTERVAL); + ob_usleep(FLUSH_CHECK_INTERVAL, true); while (unpersist_tablet_ids.count() > i && OB_SUCC(ret)) { ObTabletHandle handle; ObTablet *tablet = nullptr; diff --git a/src/storage/tx_storage/ob_tx_leak_checker.h b/src/storage/tx_storage/ob_tx_leak_checker.h index c783596723..4510f8eac4 100644 --- a/src/storage/tx_storage/ob_tx_leak_checker.h +++ b/src/storage/tx_storage/ob_tx_leak_checker.h @@ -250,12 +250,15 @@ typedef share::ObBaseLeakChecker= 4)) { \ void* buf = ob_malloc(sizeof(ObReadExInfoBT), ObMemAttr(MTL_ID(), "readleakchecker")); \ if (OB_NOT_NULL(buf)) { \ ObReadExInfoBT *extra_info = new(buf) ObReadExInfoBT(); \ extra_info->trace_id_ = *(ObCurTraceId::get_trace_id()); \ - extra_info->plan_id_ = ObActiveSessionGuard::get_stat().plan_id_; \ + if (OB_NOT_NULL(di)) { \ + extra_info->plan_id_ = di->get_ash_stat().plan_id_; \ + } \ lbt(extra_info->bt_, sizeof(extra_info->bt_)); \ value.extra_ = extra_info; \ } \ @@ -264,14 +267,18 @@ typedef share::ObBaseLeakCheckertrace_id_ = *(ObCurTraceId::get_trace_id()); \ - extra_info->plan_id_ = ObActiveSessionGuard::get_stat().plan_id_; \ + if (OB_NOT_NULL(di)) { \ + extra_info->plan_id_ = di->get_ash_stat().plan_id_; \ + } \ value.extra_ = extra_info; \ } \ } else if (OB_UNLIKELY(tx_debug_level >= 2)) { \ void* buf = ob_malloc(sizeof(ObReadExInfoPlan), ObMemAttr(MTL_ID(), "readleakchecker")); \ if (OB_NOT_NULL(buf)) { \ ObReadExInfoPlan *extra_info = new(buf) ObReadExInfoPlan(); \ - extra_info->plan_id_ = ObActiveSessionGuard::get_stat().plan_id_; \ + if (OB_NOT_NULL(di)) { \ + extra_info->plan_id_ = di->get_ash_stat().plan_id_; \ + } \ value.extra_ = extra_info; \ } \ } else if (OB_LIKELY(tx_debug_level >= 1)) { \ diff --git a/tools/deploy/mysql_test/r/mysql/information_schema.result b/tools/deploy/mysql_test/r/mysql/information_schema.result index aceeea92f3..9b28afd030 100644 --- a/tools/deploy/mysql_test/r/mysql/information_schema.result +++ b/tools/deploy/mysql_test/r/mysql/information_schema.result @@ -402,12 +402,19 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | DBA_TAB_SUBPARTITIONS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_CONTROL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_EVENT_NAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_SNAPSHOT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQLTEXT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_STATNAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SYSTEM_EVENT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$DML_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$LATCH | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_ARBITRATION_MEMBER_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_ARBITRATION_SERVICE_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_CGROUP_CONFIG | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -444,17 +451,22 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_PX_P2P_DATAHUB | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_PX_TARGET_MONITOR | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_PX_WORKER_STAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_RES_MGR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SESSION_PS_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SESS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SHARED_STORAGE_QUOTA | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SSTABLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SS_LOCAL_CACHE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_COMPACTION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_COMPACTION_PROGRESS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -483,6 +495,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$ENCRYPTED_TABLESPACES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$EVENT_NAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$LATCH | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARBITRATION_MEMBER_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARBITRATION_SERVICE_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARCHIVE_DEST_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -523,17 +536,22 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_PX_P2P_DATAHUB | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_PX_TARGET_MONITOR | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_PX_WORKER_STAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_QUERY_RESPONSE_TIME_HISTOGRAM | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_RES_MGR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SESSION_PS_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SESS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SHARED_STORAGE_QUOTA | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SSTABLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SS_LOCAL_CACHE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_COMPACTION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_COMPACTION_PROGRESS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -890,6 +908,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_recover_table_job_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_replay_stat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_res_mgr_directive | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_res_mgr_sysstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_resource_pool_mysql_sys_agent | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_restore_job | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_restore_job_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -915,6 +934,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_sql_workarea_histogram | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sql_workarea_history_stat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sql_workarea_memory_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_sqlstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_ss_local_cache_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_storage_io_usage | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sys_variable_default_value | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -964,9 +984,14 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_virtual_long_ops_status_mysql_sys_agent | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_active_session_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_control | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_event_name | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_snapshot | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sql_plan | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sqlstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sqltext | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_statname | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_sysstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_system_event | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_zone_merge_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_zone_storage_mysql_sys_agent | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __tenant_virtual_all_table | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2014,12 +2039,19 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | DBA_TAB_SUBPARTITIONS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_CONTROL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_EVENT_NAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_SNAPSHOT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQLTEXT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_STATNAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | DBA_WR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SYSTEM_EVENT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | DBA_WR_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$DML_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$LATCH | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_ARBITRATION_MEMBER_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_ARBITRATION_SERVICE_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_CGROUP_CONFIG | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2056,17 +2088,22 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_PX_P2P_DATAHUB | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_PX_TARGET_MONITOR | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_PX_WORKER_STAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_RES_MGR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SESSION_PS_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SESS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SHARED_STORAGE_QUOTA | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SSTABLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_SS_LOCAL_CACHE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | GV$OB_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_COMPACTION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_COMPACTION_PROGRESS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | GV$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2095,6 +2132,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$ENCRYPTED_TABLESPACES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$EVENT_NAME | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$LATCH | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_ACTIVE_SESSION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARBITRATION_MEMBER_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARBITRATION_SERVICE_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_ARCHIVE_DEST_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2135,17 +2173,22 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_PX_P2P_DATAHUB | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_PX_TARGET_MONITOR | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_PX_WORKER_STAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_QUERY_RESPONSE_TIME_HISTOGRAM | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_RES_MGR_SYSSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SESSION_PS_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SESS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SHARED_STORAGE_QUOTA | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SQLSTAT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SSTABLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_SS_LOCAL_CACHE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | V$OB_SYS_TIME_MODEL | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_COMPACTION_HISTORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_COMPACTION_PROGRESS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | V$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2506,6 +2549,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_restore_job_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_restore_progress | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_res_mgr_directive | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_res_mgr_sysstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_server_compaction_event_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_server_compaction_progress | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_server_schema_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2519,6 +2563,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_shared_storage_quota | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_show_trace | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_spm_evo_result | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_sqlstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sql_audit | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sql_monitor_statname | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_sql_plan | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -2576,9 +2621,14 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_virtual_long_ops_status_mysql_sys_agent | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_active_session_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_control | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_event_name | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_snapshot | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sqlstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sqltext | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_sql_plan | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_statname | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_wr_sysstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | +| def | oceanbase | __all_virtual_wr_system_event | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_zone_merge_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __all_virtual_zone_storage_mysql_sys_agent | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | | def | oceanbase | __tenant_virtual_all_table | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | FALSE | 0 | @@ -3729,11 +3779,36 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __wr_active_session_history | 0 | oceanbase | PRIMARY | 6 | sample_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_active_session_history | 0 | oceanbase | PRIMARY | 7 | session_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_control | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_event_name | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_event_name | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_event_name | 0 | oceanbase | PRIMARY | 3 | event_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_snapshot | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_snapshot | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_snapshot | 0 | oceanbase | PRIMARY | 3 | snap_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_snapshot | 0 | oceanbase | PRIMARY | 4 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_snapshot | 0 | oceanbase | PRIMARY | 5 | svr_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 3 | snap_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 4 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 5 | svr_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 6 | sql_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 7 | plan_hash | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 8 | plan_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sql_plan | 0 | oceanbase | PRIMARY | 9 | id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 3 | snap_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 4 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 5 | svr_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 6 | sql_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 7 | plan_hash | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 8 | source_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqlstat | 0 | oceanbase | PRIMARY | 9 | source_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqltext | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqltext | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqltext | 0 | oceanbase | PRIMARY | 3 | snap_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_sqltext | 0 | oceanbase | PRIMARY | 4 | sql_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_statname | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_statname | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_statname | 0 | oceanbase | PRIMARY | 3 | stat_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -3743,6 +3818,12 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __wr_sysstat | 0 | oceanbase | PRIMARY | 4 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_sysstat | 0 | oceanbase | PRIMARY | 5 | svr_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __wr_sysstat | 0 | oceanbase | PRIMARY | 6 | stat_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 2 | cluster_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 3 | snap_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 4 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 5 | svr_port | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __wr_system_event | 0 | oceanbase | PRIMARY | 6 | event_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +---------------+--------------+-------------------------------------------+------------+--------------+-----------------------------------------------------+--------------+-------------------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+------------+ select * from information_schema.views where table_schema in ('oceanbase', 'mysql', 'information_schema', 'SYS', 'LBACSYS', 'ORAAUDITOR') order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME; +---------------+--------------+---------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result index 75cf6d856d..86561c0e57 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result @@ -347,6 +347,7 @@ _enable_hash_join_hasher _enable_hash_join_processor _enable_hgby_llc_ndv_adaptive _enable_hgby_skew_detection +_enable_inner_session_mgr _enable_in_range_optimization _enable_kv_feature _enable_log_cache @@ -436,6 +437,9 @@ _nested_loop_join_enabled _no_logging _object_storage_io_timeout _obkv_feature_mode +_ob_ash_disk_write_enable +_ob_ash_enable +_ob_ash_size _ob_ddl_temp_file_compress_func _ob_ddl_timeout _ob_elr_fast_freeze_threshold @@ -452,6 +456,7 @@ _ob_plan_cache_auto_flush_interval _ob_plan_cache_gc_strategy _ob_pl_compile_max_concurrency _ob_query_rate_limit +_ob_sqlstat_enable _ob_ssl_invited_nodes _ob_trans_rpc_timeout _optimizer_ads_time_limit diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result index 531ac393e0..9395f0ad2a 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result @@ -711,6 +711,8 @@ STMT_TYPE varchar(128) YES NULL TOTAL_MEMSTORE_READ_ROW_COUNT bigint(20) NO NULL TOTAL_SSSTORE_READ_ROW_COUNT bigint(20) NO NULL PROXY_USER varchar(128) YES NULL +SEQ_NUM bigint(20) NO NULL +NETWORK_WAIT_TIME bigint(20) unsigned YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SQL_AUDIT limit 1); cnt 1 @@ -1031,6 +1033,8 @@ STMT_TYPE varchar(128) NO TOTAL_MEMSTORE_READ_ROW_COUNT bigint(20) NO TOTAL_SSSTORE_READ_ROW_COUNT bigint(20) NO PROXY_USER varchar(128) NO +SEQ_NUM bigint(20) NO +NETWORK_WAIT_TIME bigint(20) unsigned NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SQL_AUDIT limit 1); cnt 1 @@ -3500,72 +3504,10 @@ cnt 1 desc oceanbase.GV$ACTIVE_SESSION_HISTORY; Field Type Null Key Default Extra -SVR_IP varchar(46) NO NULL -SVR_PORT bigint(20) NO NULL -SAMPLE_ID bigint(20) NO NULL -SAMPLE_TIME datetime NO NULL -CON_ID bigint(20) NO NULL -USER_ID bigint(20) NO NULL -SESSION_ID bigint(20) NO NULL -SESSION_TYPE varchar(10) NO -SESSION_STATE varchar(7) NO -SQL_ID varchar(32) NO -PLAN_ID bigint(20) NO NULL -TRACE_ID varchar(64) NO -EVENT varchar(64) NO -EVENT_NO bigint(20) NO NULL -EVENT_ID bigint(20) YES NULL -P1TEXT varchar(64) NO -P1 bigint(20) NO NULL -P2TEXT varchar(64) NO -P2 bigint(20) NO NULL -P3TEXT varchar(64) NO -P3 bigint(20) NO NULL -WAIT_CLASS varchar(64) NO -WAIT_CLASS_ID bigint(20) NO -TIME_WAITED bigint(20) NO NULL -SQL_PLAN_LINE_ID bigint(20) YES NULL -GROUP_ID bigint(20) YES NULL -TX_ID bigint(20) YES NULL -BLOCKING_SESSION_ID bigint(20) YES NULL -IN_PARSE varchar(1) NO -IN_PL_PARSE varchar(1) NO -IN_PLAN_CACHE varchar(1) NO -IN_SQL_OPTIMIZE varchar(1) NO -IN_SQL_EXECUTION varchar(1) NO -IN_PX_EXECUTION varchar(1) NO -IN_SEQUENCE_LOAD varchar(1) NO -IN_COMMITTING varchar(1) NO -IN_STORAGE_READ varchar(1) NO -IN_STORAGE_WRITE varchar(1) NO -IN_REMOTE_DAS_EXECUTION varchar(1) NO -IN_FILTER_ROWS varchar(1) NO -PROGRAM varchar(64) YES NULL -MODULE varchar(64) YES NULL -ACTION varchar(64) YES NULL -CLIENT_ID varchar(64) YES NULL -BACKTRACE varchar(512) YES NULL -TM_DELTA_TIME bigint(20) YES NULL -TM_DELTA_CPU_TIME bigint(20) YES NULL -TM_DELTA_DB_TIME bigint(20) YES NULL -TOP_LEVEL_SQL_ID varchar(32) YES NULL -IN_PLSQL_COMPILATION varchar(1) NO -IN_PLSQL_EXECUTION varchar(1) NO -PLSQL_ENTRY_OBJECT_ID bigint(20) YES NULL -PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) YES NULL -PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) YES NULL -PLSQL_OBJECT_ID bigint(20) YES NULL -PLSQL_SUBPROGRAM_ID bigint(20) YES NULL -PLSQL_SUBPROGRAM_NAME varchar(32) YES NULL -select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$ACTIVE_SESSION_HISTORY limit 1); -cnt -1 -desc oceanbase.V$ACTIVE_SESSION_HISTORY; -Field Type Null Key Default Extra SVR_IP varchar(46) NO SVR_PORT bigint(20) NO SAMPLE_ID bigint(20) NO -SAMPLE_TIME datetime NO +SAMPLE_TIME timestamp(6) NO CON_ID bigint(20) NO USER_ID bigint(20) NO SESSION_ID bigint(20) NO @@ -3588,8 +3530,10 @@ WAIT_CLASS_ID bigint(20) NO TIME_WAITED bigint(20) NO SQL_PLAN_LINE_ID bigint(20) NO GROUP_ID bigint(20) NO -TX_ID bigint(20) NO -BLOCKING_SESSION_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO IN_PARSE varchar(1) NO IN_PL_PARSE varchar(1) NO IN_PLAN_CACHE varchar(1) NO @@ -3602,6 +3546,9 @@ IN_STORAGE_READ varchar(1) NO IN_STORAGE_WRITE varchar(1) NO IN_REMOTE_DAS_EXECUTION varchar(1) NO IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO PROGRAM varchar(64) NO MODULE varchar(64) NO ACTION varchar(64) NO @@ -3619,6 +3566,81 @@ PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO PLSQL_OBJECT_ID bigint(20) NO PLSQL_SUBPROGRAM_ID bigint(20) NO PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$ACTIVE_SESSION_HISTORY limit 1); +cnt +1 +desc oceanbase.V$ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SAMPLE_ID bigint(20) NO +SAMPLE_TIME timestamp(6) NO +CON_ID bigint(20) NO +USER_ID bigint(20) NO +SESSION_ID bigint(20) NO +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO +EVENT_ID bigint(20) NO +P1TEXT varchar(64) NO +P1 bigint(20) NO +P2TEXT varchar(64) NO +P2 bigint(20) NO +P3TEXT varchar(64) NO +P3 bigint(20) NO +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO +SQL_PLAN_LINE_ID bigint(20) NO +GROUP_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +CLIENT_ID varchar(64) NO +BACKTRACE varchar(512) NO +TM_DELTA_TIME bigint(20) NO +TM_DELTA_CPU_TIME bigint(20) NO +TM_DELTA_DB_TIME bigint(20) NO +TOP_LEVEL_SQL_ID varchar(32) NO +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO +PLSQL_OBJECT_ID bigint(20) NO +PLSQL_SUBPROGRAM_ID bigint(20) NO +PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$ACTIVE_SESSION_HISTORY limit 1); cnt 1 @@ -4216,9 +4238,11 @@ cnt 1 desc information_schema.QUERY_RESPONSE_TIME; Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL RESPONSE_TIME bigint(20) NO -COUNT bigint(20) NO -TOTAL bigint(20) NO +COUNT decimal(42,0) NO +TOTAL decimal(42,0) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.QUERY_RESPONSE_TIME limit 1); cnt 1 @@ -5147,6 +5171,9 @@ P2 bigint(20) YES NULL P3 bigint(20) YES NULL SQL_PLAN_LINE_ID bigint(20) YES NULL GROUP_ID bigint(20) YES NULL +PLAN_HASH bigint(20) unsigned YES NULL +THREAD_ID bigint(20) YES NULL +STMT_TYPE bigint(20) YES NULL TX_ID bigint(20) YES NULL BLOCKING_SESSION_ID bigint(20) YES NULL TIME_MODEL bigint(20) unsigned YES NULL @@ -5164,6 +5191,9 @@ IN_REMOTE_DAS_EXECUTION varchar(1) NO IN_PLSQL_COMPILATION varchar(1) NO IN_PLSQL_EXECUTION varchar(1) NO IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO PROGRAM varchar(64) YES NULL MODULE varchar(64) YES NULL ACTION varchar(64) YES NULL @@ -5184,6 +5214,8 @@ DELTA_READ_IO_REQUESTS bigint(20) YES DELTA_READ_IO_BYTES bigint(20) YES DELTA_WRITE_IO_REQUESTS bigint(20) YES DELTA_WRITE_IO_BYTES bigint(20) YES +TABLET_ID bigint(20) YES NULL +PROXY_SID bigint(20) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_ACTIVE_SESSION_HISTORY limit 1); cnt 1 @@ -5938,6 +5970,33 @@ CGROUP_PATH varchar(256) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_CGROUP_CONFIG limit 1); cnt 1 +desc oceanbase.DBA_WR_SYSTEM_EVENT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +TOTAL_WAITS bigint(20) YES NULL +TOTAL_TIMEOUTS bigint(20) YES NULL +TIME_WAITED_MICRO bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SYSTEM_EVENT limit 1); +cnt +1 +desc oceanbase.DBA_WR_EVENT_NAME; +Field Type Null Key Default Extra +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +PARAMETER1 varchar(64) YES NULL +PARAMETER2 varchar(64) YES NULL +PARAMETER3 varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_EVENT_NAME limit 1); +cnt +1 desc oceanbase.DBA_OB_FORMAT_OUTLINES; Field Type Null Key Default Extra CREATE_TIME timestamp(6) YES @@ -5969,6 +6028,258 @@ Timestamp date YES select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.procs_priv limit 1); cnt 1 +desc oceanbase.GV$OB_SQLSTAT; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_ID bigint(20) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SQLSTAT limit 1); +cnt +1 +desc oceanbase.V$OB_SQLSTAT; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TENANT_ID bigint(20) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +PLAN_TYPE bigint(20) NO +QUERY_SQL longtext NO +SQL_TYPE bigint(20) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +PARSING_DB_ID bigint(20) NO +PARSING_DB_NAME varchar(128) NO +PARSING_USER_ID bigint(20) NO +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO +SOURCE_PORT bigint(20) NO +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) NO +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SQLSTAT limit 1); +cnt +1 +desc oceanbase.DBA_WR_SQLSTAT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQLSTAT limit 1); +cnt +1 +desc oceanbase.GV$OB_SESS_TIME_MODEL; +Field Type Null Key Default Extra +SID bigint(20) NO +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SESS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.V$OB_SESS_TIME_MODEL; +Field Type Null Key Default Extra +SID bigint(20) NO +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SESS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.GV$OB_SYS_TIME_MODEL; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SYS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.V$OB_SYS_TIME_MODEL; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SYS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.DBA_WR_SYS_TIME_MODEL; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SYS_TIME_MODEL limit 1); +cnt +1 desc oceanbase.DBA_OB_AUX_STATISTICS; Field Type Null Key Default Extra LAST_ANALYZED timestamp(6) NO NULL @@ -6046,6 +6357,157 @@ COMMENT longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY limit 1); cnt 1 +desc oceanbase.DBA_WR_SQLTEXT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQLTEXT limit 1); +cnt +1 +desc oceanbase.GV$OB_ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SAMPLE_ID bigint(20) NO NULL +SAMPLE_TIME timestamp(6) NO NULL +CON_ID bigint(20) NO NULL +USER_ID bigint(20) NO NULL +SESSION_ID bigint(20) NO NULL +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO NULL +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO NULL +EVENT_ID bigint(20) YES NULL +P1TEXT varchar(64) NO +P1 bigint(20) NO NULL +P2TEXT varchar(64) NO +P2 bigint(20) NO NULL +P3TEXT varchar(64) NO +P3 bigint(20) NO NULL +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO NULL +SQL_PLAN_LINE_ID bigint(20) YES NULL +GROUP_ID bigint(20) YES NULL +PLAN_HASH bigint(20) unsigned YES NULL +THREAD_ID bigint(20) YES NULL +STMT_TYPE bigint(20) YES NULL +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) YES NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +CLIENT_ID varchar(64) YES NULL +BACKTRACE varchar(512) YES NULL +TM_DELTA_TIME bigint(20) YES NULL +TM_DELTA_CPU_TIME bigint(20) YES NULL +TM_DELTA_DB_TIME bigint(20) YES NULL +TOP_LEVEL_SQL_ID varchar(32) YES NULL +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) YES NULL +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) YES NULL +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) YES NULL +PLSQL_OBJECT_ID bigint(20) YES NULL +PLSQL_SUBPROGRAM_ID bigint(20) YES NULL +PLSQL_SUBPROGRAM_NAME varchar(32) YES NULL +TX_ID bigint(20) YES NULL +BLOCKING_SESSION_ID bigint(20) YES NULL +TABLET_ID bigint(20) YES NULL +PROXY_SID bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_ACTIVE_SESSION_HISTORY limit 1); +cnt +1 +desc oceanbase.V$OB_ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SAMPLE_ID bigint(20) NO +SAMPLE_TIME timestamp(6) NO +CON_ID bigint(20) NO +USER_ID bigint(20) NO +SESSION_ID bigint(20) NO +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO +EVENT_ID bigint(20) NO +P1TEXT varchar(64) NO +P1 bigint(20) NO +P2TEXT varchar(64) NO +P2 bigint(20) NO +P3TEXT varchar(64) NO +P3 bigint(20) NO +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO +SQL_PLAN_LINE_ID bigint(20) NO +GROUP_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +CLIENT_ID varchar(64) NO +BACKTRACE varchar(512) NO +TM_DELTA_TIME bigint(20) NO +TM_DELTA_CPU_TIME bigint(20) NO +TM_DELTA_DB_TIME bigint(20) NO +TOP_LEVEL_SQL_ID varchar(32) NO +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO +PLSQL_OBJECT_ID bigint(20) NO +PLSQL_SUBPROGRAM_ID bigint(20) NO +PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_ACTIVE_SESSION_HISTORY limit 1); +cnt +1 desc mysql.role_edges; Field Type Null Key Default Extra FROM_HOST varchar(255) NO @@ -6980,6 +7442,30 @@ SPEED_MBPS bigint(20) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_NIC_INFO limit 1); cnt 1 +desc oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_TYPE varchar(128) NO +RESPONSE_TIME decimal(24,6) NO +COUNT bigint(20) NO +TOTAL decimal(24,6) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM limit 1); +cnt +1 +desc oceanbase.V$OB_QUERY_RESPONSE_TIME_HISTOGRAM; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TENANT_ID bigint(20) NO +SQL_TYPE varchar(128) NO +RESPONSE_TIME decimal(24,6) NO +COUNT bigint(20) NO +TOTAL decimal(24,6) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_QUERY_RESPONSE_TIME_HISTOGRAM limit 1); +cnt +1 desc oceanbase.DBA_SCHEDULER_JOB_RUN_DETAILS; Field Type Null Key Default Extra LOG_ID decimal(20,0) NO @@ -7192,6 +7678,84 @@ CLIENT_INFO varchar(2048) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_KV_CLIENT_INFO limit 1); cnt 1 +desc oceanbase.GV$OB_RES_MGR_SYSSTAT; +Field Type Null Key Default Extra +CON_ID bigint(20) NO NULL +GROUP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +STATISTIC# bigint(20) NO NULL +NAME varchar(64) NO NULL +CLASS bigint(20) NO NULL +VALUE bigint(20) NO NULL +VALUE_TYPE varchar(16) NO NULL +STAT_ID bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_RES_MGR_SYSSTAT limit 1); +cnt +1 +desc oceanbase.V$OB_RES_MGR_SYSSTAT; +Field Type Null Key Default Extra +CON_ID bigint(20) NO +GROUP_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STATISTIC# bigint(20) NO +NAME varchar(64) NO +CLASS bigint(20) NO +VALUE bigint(20) NO +VALUE_TYPE varchar(16) NO +STAT_ID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_RES_MGR_SYSSTAT limit 1); +cnt +1 +desc oceanbase.DBA_WR_SQL_PLAN; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +CLUSTER_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_ID bigint(20) NO NULL +ID bigint(20) unsigned NO +DB_ID bigint(20) NO NULL +GMT_CREATE timestamp(6) NO NULL +OPERATOR varchar(255) NO NULL +OPTIONS varchar(255) NO NULL +OBJECT_NODE varchar(40) NO NULL +OBJECT_ID bigint(20) NO NULL +OBJECT_OWNER varchar(128) NO NULL +OBJECT_NAME varchar(128) NO NULL +OBJECT_ALIAS varchar(261) NO NULL +OBJECT_TYPE varchar(20) NO NULL +OPTIMIZER varchar(4000) NO NULL +PARENT_ID bigint(20) NO NULL +DEPTH bigint(20) NO NULL +POSITION bigint(20) NO NULL +IS_LAST_CHILD bigint(20) NO NULL +COST bigint(20) NO NULL +REAL_COST bigint(20) NO NULL +CARDINALITY bigint(20) NO NULL +REAL_CARDINALITY bigint(20) NO NULL +BYTES bigint(20) NO NULL +ROWSET bigint(20) NO NULL +OTHER_TAG varchar(4000) NO NULL +PARTITION_START varchar(4000) NO NULL +OTHER varchar(4000) NO NULL +CPU_COST bigint(20) NO NULL +IO_COST bigint(20) NO NULL +ACCESS_PREDICATES varchar(4000) NO NULL +FILTER_PREDICATES varchar(4000) NO NULL +STARTUP_PREDICATES varchar(4000) NO NULL +PROJECTION varchar(4000) NO NULL +SPECIAL_PREDICATES varchar(4000) NO NULL +QBLOCK_NAME varchar(128) NO NULL +REMARKS varchar(4000) NO NULL +OTHER_XML varchar(4000) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQL_PLAN limit 1); +cnt +1 desc oceanbase.DBA_OB_SPM_EVO_RESULT; Field Type Null Key Default Extra OWNER varchar(128) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result index eab238581d..1c9c4b8212 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result @@ -709,6 +709,8 @@ STMT_TYPE varchar(128) YES NULL TOTAL_MEMSTORE_READ_ROW_COUNT bigint(20) NO NULL TOTAL_SSSTORE_READ_ROW_COUNT bigint(20) NO NULL PROXY_USER varchar(128) YES NULL +SEQ_NUM bigint(20) NO NULL +NETWORK_WAIT_TIME bigint(20) unsigned YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SQL_AUDIT limit 1); cnt 1 @@ -1029,6 +1031,8 @@ STMT_TYPE varchar(128) NO TOTAL_MEMSTORE_READ_ROW_COUNT bigint(20) NO TOTAL_SSSTORE_READ_ROW_COUNT bigint(20) NO PROXY_USER varchar(128) NO +SEQ_NUM bigint(20) NO +NETWORK_WAIT_TIME bigint(20) unsigned NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SQL_AUDIT limit 1); cnt 1 @@ -4942,72 +4946,10 @@ cnt 1 desc oceanbase.GV$ACTIVE_SESSION_HISTORY; Field Type Null Key Default Extra -SVR_IP varchar(46) NO NULL -SVR_PORT bigint(20) NO NULL -SAMPLE_ID bigint(20) NO NULL -SAMPLE_TIME datetime NO NULL -CON_ID bigint(20) NO NULL -USER_ID bigint(20) NO NULL -SESSION_ID bigint(20) NO NULL -SESSION_TYPE varchar(10) NO -SESSION_STATE varchar(7) NO -SQL_ID varchar(32) NO -PLAN_ID bigint(20) NO NULL -TRACE_ID varchar(64) NO -EVENT varchar(64) NO -EVENT_NO bigint(20) NO NULL -EVENT_ID bigint(20) YES NULL -P1TEXT varchar(64) NO -P1 bigint(20) NO NULL -P2TEXT varchar(64) NO -P2 bigint(20) NO NULL -P3TEXT varchar(64) NO -P3 bigint(20) NO NULL -WAIT_CLASS varchar(64) NO -WAIT_CLASS_ID bigint(20) NO -TIME_WAITED bigint(20) NO NULL -SQL_PLAN_LINE_ID bigint(20) YES NULL -GROUP_ID bigint(20) YES NULL -TX_ID bigint(20) YES NULL -BLOCKING_SESSION_ID bigint(20) YES NULL -IN_PARSE varchar(1) NO -IN_PL_PARSE varchar(1) NO -IN_PLAN_CACHE varchar(1) NO -IN_SQL_OPTIMIZE varchar(1) NO -IN_SQL_EXECUTION varchar(1) NO -IN_PX_EXECUTION varchar(1) NO -IN_SEQUENCE_LOAD varchar(1) NO -IN_COMMITTING varchar(1) NO -IN_STORAGE_READ varchar(1) NO -IN_STORAGE_WRITE varchar(1) NO -IN_REMOTE_DAS_EXECUTION varchar(1) NO -IN_FILTER_ROWS varchar(1) NO -PROGRAM varchar(64) YES NULL -MODULE varchar(64) YES NULL -ACTION varchar(64) YES NULL -CLIENT_ID varchar(64) YES NULL -BACKTRACE varchar(512) YES NULL -TM_DELTA_TIME bigint(20) YES NULL -TM_DELTA_CPU_TIME bigint(20) YES NULL -TM_DELTA_DB_TIME bigint(20) YES NULL -TOP_LEVEL_SQL_ID varchar(32) YES NULL -IN_PLSQL_COMPILATION varchar(1) NO -IN_PLSQL_EXECUTION varchar(1) NO -PLSQL_ENTRY_OBJECT_ID bigint(20) YES NULL -PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) YES NULL -PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) YES NULL -PLSQL_OBJECT_ID bigint(20) YES NULL -PLSQL_SUBPROGRAM_ID bigint(20) YES NULL -PLSQL_SUBPROGRAM_NAME varchar(32) YES NULL -select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$ACTIVE_SESSION_HISTORY limit 1); -cnt -1 -desc oceanbase.V$ACTIVE_SESSION_HISTORY; -Field Type Null Key Default Extra SVR_IP varchar(46) NO SVR_PORT bigint(20) NO SAMPLE_ID bigint(20) NO -SAMPLE_TIME datetime NO +SAMPLE_TIME timestamp(6) NO CON_ID bigint(20) NO USER_ID bigint(20) NO SESSION_ID bigint(20) NO @@ -5030,8 +4972,10 @@ WAIT_CLASS_ID bigint(20) NO TIME_WAITED bigint(20) NO SQL_PLAN_LINE_ID bigint(20) NO GROUP_ID bigint(20) NO -TX_ID bigint(20) NO -BLOCKING_SESSION_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO IN_PARSE varchar(1) NO IN_PL_PARSE varchar(1) NO IN_PLAN_CACHE varchar(1) NO @@ -5044,6 +4988,9 @@ IN_STORAGE_READ varchar(1) NO IN_STORAGE_WRITE varchar(1) NO IN_REMOTE_DAS_EXECUTION varchar(1) NO IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO PROGRAM varchar(64) NO MODULE varchar(64) NO ACTION varchar(64) NO @@ -5061,6 +5008,81 @@ PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO PLSQL_OBJECT_ID bigint(20) NO PLSQL_SUBPROGRAM_ID bigint(20) NO PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$ACTIVE_SESSION_HISTORY limit 1); +cnt +1 +desc oceanbase.V$ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SAMPLE_ID bigint(20) NO +SAMPLE_TIME timestamp(6) NO +CON_ID bigint(20) NO +USER_ID bigint(20) NO +SESSION_ID bigint(20) NO +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO +EVENT_ID bigint(20) NO +P1TEXT varchar(64) NO +P1 bigint(20) NO +P2TEXT varchar(64) NO +P2 bigint(20) NO +P3TEXT varchar(64) NO +P3 bigint(20) NO +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO +SQL_PLAN_LINE_ID bigint(20) NO +GROUP_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +CLIENT_ID varchar(64) NO +BACKTRACE varchar(512) NO +TM_DELTA_TIME bigint(20) NO +TM_DELTA_CPU_TIME bigint(20) NO +TM_DELTA_DB_TIME bigint(20) NO +TOP_LEVEL_SQL_ID varchar(32) NO +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO +PLSQL_OBJECT_ID bigint(20) NO +PLSQL_SUBPROGRAM_ID bigint(20) NO +PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$ACTIVE_SESSION_HISTORY limit 1); cnt 1 @@ -5799,9 +5821,11 @@ cnt 1 desc information_schema.QUERY_RESPONSE_TIME; Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL RESPONSE_TIME bigint(20) NO -COUNT bigint(20) NO -TOTAL bigint(20) NO +COUNT decimal(42,0) NO +TOTAL decimal(42,0) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.QUERY_RESPONSE_TIME limit 1); cnt 1 @@ -7148,6 +7172,9 @@ P2 bigint(20) YES NULL P3 bigint(20) YES NULL SQL_PLAN_LINE_ID bigint(20) YES NULL GROUP_ID bigint(20) YES NULL +PLAN_HASH bigint(20) unsigned YES NULL +THREAD_ID bigint(20) YES NULL +STMT_TYPE bigint(20) YES NULL TX_ID bigint(20) YES NULL BLOCKING_SESSION_ID bigint(20) YES NULL TIME_MODEL bigint(20) unsigned YES NULL @@ -7165,6 +7192,9 @@ IN_REMOTE_DAS_EXECUTION varchar(1) NO IN_PLSQL_COMPILATION varchar(1) NO IN_PLSQL_EXECUTION varchar(1) NO IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO PROGRAM varchar(64) YES NULL MODULE varchar(64) YES NULL ACTION varchar(64) YES NULL @@ -7185,6 +7215,8 @@ DELTA_READ_IO_REQUESTS bigint(20) YES DELTA_READ_IO_BYTES bigint(20) YES DELTA_WRITE_IO_REQUESTS bigint(20) YES DELTA_WRITE_IO_BYTES bigint(20) YES +TABLET_ID bigint(20) YES NULL +PROXY_SID bigint(20) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_ACTIVE_SESSION_HISTORY limit 1); cnt 1 @@ -7211,6 +7243,9 @@ P2 bigint(20) YES NULL P3 bigint(20) YES NULL SQL_PLAN_LINE_ID bigint(20) YES NULL GROUP_ID bigint(20) YES NULL +PLAN_HASH bigint(20) unsigned YES NULL +THREAD_ID bigint(20) YES NULL +STMT_TYPE bigint(20) YES NULL TX_ID bigint(20) YES NULL BLOCKING_SESSION_ID bigint(20) YES NULL TIME_MODEL bigint(20) unsigned YES NULL @@ -7228,6 +7263,9 @@ IN_REMOTE_DAS_EXECUTION varchar(1) NO IN_PLSQL_COMPILATION varchar(1) NO IN_PLSQL_EXECUTION varchar(1) NO IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO PROGRAM varchar(64) YES NULL MODULE varchar(64) YES NULL ACTION varchar(64) YES NULL @@ -7248,6 +7286,8 @@ DELTA_READ_IO_REQUESTS bigint(20) YES DELTA_READ_IO_BYTES bigint(20) YES DELTA_WRITE_IO_REQUESTS bigint(20) YES DELTA_WRITE_IO_BYTES bigint(20) YES +TABLET_ID bigint(20) YES NULL +PROXY_SID bigint(20) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_ACTIVE_SESSION_HISTORY limit 1); cnt 1 @@ -8498,6 +8538,64 @@ CGROUP_PATH varchar(256) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_CGROUP_CONFIG limit 1); cnt 1 +desc oceanbase.DBA_WR_SYSTEM_EVENT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +TOTAL_WAITS bigint(20) YES NULL +TOTAL_TIMEOUTS bigint(20) YES NULL +TIME_WAITED_MICRO bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SYSTEM_EVENT limit 1); +cnt +1 +desc oceanbase.CDB_WR_SYSTEM_EVENT; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +CLUSTER_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +TOTAL_WAITS bigint(20) YES NULL +TOTAL_TIMEOUTS bigint(20) YES NULL +TIME_WAITED_MICRO bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_SYSTEM_EVENT limit 1); +cnt +1 +desc oceanbase.DBA_WR_EVENT_NAME; +Field Type Null Key Default Extra +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +PARAMETER1 varchar(64) YES NULL +PARAMETER2 varchar(64) YES NULL +PARAMETER3 varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_EVENT_NAME limit 1); +cnt +1 +desc oceanbase.CDB_WR_EVENT_NAME; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +CLUSTER_ID bigint(20) NO NULL +EVENT_ID bigint(20) NO NULL +EVENT_NAME varchar(64) YES NULL +PARAMETER1 varchar(64) YES NULL +PARAMETER2 varchar(64) YES NULL +PARAMETER3 varchar(64) YES NULL +WAIT_CLASS_ID bigint(20) YES NULL +WAIT_CLASS varchar(64) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_EVENT_NAME limit 1); +cnt +1 desc oceanbase.DBA_OB_FORMAT_OUTLINES; Field Type Null Key Default Extra CREATE_TIME timestamp(6) YES @@ -8529,6 +8627,335 @@ Timestamp date YES select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.procs_priv limit 1); cnt 1 +desc oceanbase.GV$OB_SQLSTAT; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_ID bigint(20) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SQLSTAT limit 1); +cnt +1 +desc oceanbase.V$OB_SQLSTAT; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TENANT_ID bigint(20) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +PLAN_TYPE bigint(20) NO +QUERY_SQL longtext NO +SQL_TYPE bigint(20) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +PARSING_DB_ID bigint(20) NO +PARSING_DB_NAME varchar(128) NO +PARSING_USER_ID bigint(20) NO +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO +SOURCE_PORT bigint(20) NO +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) NO +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SQLSTAT limit 1); +cnt +1 +desc oceanbase.DBA_WR_SQLSTAT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQLSTAT limit 1); +cnt +1 +desc oceanbase.CDB_WR_SQLSTAT; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO +EXECUTIONS_DELTA bigint(20) NO +DISK_READS_TOTAL bigint(20) NO +DISK_READS_DELTA bigint(20) NO +BUFFER_GETS_TOTAL bigint(20) NO +BUFFER_GETS_DELTA bigint(20) NO +ELAPSED_TIME_TOTAL bigint(20) NO +ELAPSED_TIME_DELTA bigint(20) NO +CPU_TIME_TOTAL bigint(20) NO +CPU_TIME_DELTA bigint(20) NO +CCWAIT_TOTAL bigint(20) NO +CCWAIT_DELTA bigint(20) NO +USERIO_WAIT_TOTAL bigint(20) NO +USERIO_WAIT_DELTA bigint(20) NO +APWAIT_TOTAL bigint(20) NO +APWAIT_DELTA bigint(20) NO +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO +PHYSICAL_READ_BYTES_DELTA bigint(20) NO +WRITE_THROTTLE_TOTAL bigint(20) NO +WRITE_THROTTLE_DELTA bigint(20) NO +ROWS_PROCESSED_TOTAL bigint(20) NO +ROWS_PROCESSED_DELTA bigint(20) NO +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO +MEMSTORE_READ_ROWS_DELTA bigint(20) NO +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO +RPC_TOTAL bigint(20) NO +RPC_DELTA bigint(20) NO +FETCHES_TOTAL bigint(20) NO +FETCHES_DELTA bigint(20) NO +RETRY_TOTAL bigint(20) NO +RETRY_DELTA bigint(20) NO +PARTITION_TOTAL bigint(20) NO +PARTITION_DELTA bigint(20) NO +NESTED_SQL_TOTAL bigint(20) NO +NESTED_SQL_DELTA bigint(20) NO +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO +ROUTE_MISS_DELTA bigint(20) NO +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO +PLAN_CACHE_HIT_DELTA bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_SQLSTAT limit 1); +cnt +1 +desc oceanbase.GV$OB_SESS_TIME_MODEL; +Field Type Null Key Default Extra +SID bigint(20) NO +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SESS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.V$OB_SESS_TIME_MODEL; +Field Type Null Key Default Extra +SID bigint(20) NO +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SESS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.GV$OB_SYS_TIME_MODEL; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SYS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.V$OB_SYS_TIME_MODEL; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SYS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.DBA_WR_SYS_TIME_MODEL; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SYS_TIME_MODEL limit 1); +cnt +1 +desc oceanbase.CDB_WR_SYS_TIME_MODEL; +Field Type Null Key Default Extra +CLUSTER_ID bigint(20) NO +TENANT_ID bigint(20) NO +SNAP_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STAT_ID bigint(20) NO +STAT_NAME varchar(64) NO +VALUE bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_SYS_TIME_MODEL limit 1); +cnt +1 desc oceanbase.DBA_OB_AUX_STATISTICS; Field Type Null Key Default Extra LAST_ANALYZED timestamp(6) NO NULL @@ -8649,6 +9076,167 @@ COMMENT longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_OB_TRANSFER_PARTITION_TASK_HISTORY limit 1); cnt 1 +desc oceanbase.DBA_WR_SQLTEXT; +Field Type Null Key Default Extra +SNAP_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQLTEXT limit 1); +cnt +1 +desc oceanbase.CDB_WR_SQLTEXT; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_SQLTEXT limit 1); +cnt +1 +desc oceanbase.GV$OB_ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SAMPLE_ID bigint(20) NO NULL +SAMPLE_TIME timestamp(6) NO NULL +CON_ID bigint(20) NO NULL +USER_ID bigint(20) NO NULL +SESSION_ID bigint(20) NO NULL +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO NULL +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO NULL +EVENT_ID bigint(20) YES NULL +P1TEXT varchar(64) NO +P1 bigint(20) NO NULL +P2TEXT varchar(64) NO +P2 bigint(20) NO NULL +P3TEXT varchar(64) NO +P3 bigint(20) NO NULL +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO NULL +SQL_PLAN_LINE_ID bigint(20) YES NULL +GROUP_ID bigint(20) YES NULL +PLAN_HASH bigint(20) unsigned YES NULL +THREAD_ID bigint(20) YES NULL +STMT_TYPE bigint(20) YES NULL +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) YES NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +CLIENT_ID varchar(64) YES NULL +BACKTRACE varchar(512) YES NULL +TM_DELTA_TIME bigint(20) YES NULL +TM_DELTA_CPU_TIME bigint(20) YES NULL +TM_DELTA_DB_TIME bigint(20) YES NULL +TOP_LEVEL_SQL_ID varchar(32) YES NULL +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) YES NULL +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) YES NULL +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) YES NULL +PLSQL_OBJECT_ID bigint(20) YES NULL +PLSQL_SUBPROGRAM_ID bigint(20) YES NULL +PLSQL_SUBPROGRAM_NAME varchar(32) YES NULL +TX_ID bigint(20) YES NULL +BLOCKING_SESSION_ID bigint(20) YES NULL +TABLET_ID bigint(20) YES NULL +PROXY_SID bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_ACTIVE_SESSION_HISTORY limit 1); +cnt +1 +desc oceanbase.V$OB_ACTIVE_SESSION_HISTORY; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SAMPLE_ID bigint(20) NO +SAMPLE_TIME timestamp(6) NO +CON_ID bigint(20) NO +USER_ID bigint(20) NO +SESSION_ID bigint(20) NO +SESSION_TYPE varchar(10) NO +SESSION_STATE varchar(7) NO +SQL_ID varchar(32) NO +PLAN_ID bigint(20) NO +TRACE_ID varchar(64) NO +EVENT varchar(64) NO +EVENT_NO bigint(20) NO +EVENT_ID bigint(20) NO +P1TEXT varchar(64) NO +P1 bigint(20) NO +P2TEXT varchar(64) NO +P2 bigint(20) NO +P3TEXT varchar(64) NO +P3 bigint(20) NO +WAIT_CLASS varchar(64) NO +WAIT_CLASS_ID bigint(20) NO +TIME_WAITED bigint(20) NO +SQL_PLAN_LINE_ID bigint(20) NO +GROUP_ID bigint(20) NO +PLAN_HASH bigint(20) unsigned NO +THREAD_ID bigint(20) NO +STMT_TYPE bigint(20) NO +TIME_MODEL bigint(20) NO +IN_PARSE varchar(1) NO +IN_PL_PARSE varchar(1) NO +IN_PLAN_CACHE varchar(1) NO +IN_SQL_OPTIMIZE varchar(1) NO +IN_SQL_EXECUTION varchar(1) NO +IN_PX_EXECUTION varchar(1) NO +IN_SEQUENCE_LOAD varchar(1) NO +IN_COMMITTING varchar(1) NO +IN_STORAGE_READ varchar(1) NO +IN_STORAGE_WRITE varchar(1) NO +IN_REMOTE_DAS_EXECUTION varchar(1) NO +IN_FILTER_ROWS varchar(1) NO +IN_RPC_ENCODE varchar(1) NO +IN_RPC_DECODE varchar(1) NO +IN_CONNECTION_MGR varchar(1) NO +PROGRAM varchar(64) NO +MODULE varchar(64) NO +ACTION varchar(64) NO +CLIENT_ID varchar(64) NO +BACKTRACE varchar(512) NO +TM_DELTA_TIME bigint(20) NO +TM_DELTA_CPU_TIME bigint(20) NO +TM_DELTA_DB_TIME bigint(20) NO +TOP_LEVEL_SQL_ID varchar(32) NO +IN_PLSQL_COMPILATION varchar(1) NO +IN_PLSQL_EXECUTION varchar(1) NO +PLSQL_ENTRY_OBJECT_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_ID bigint(20) NO +PLSQL_ENTRY_SUBPROGRAM_NAME varchar(32) NO +PLSQL_OBJECT_ID bigint(20) NO +PLSQL_SUBPROGRAM_ID bigint(20) NO +PLSQL_SUBPROGRAM_NAME varchar(32) NO +TX_ID bigint(20) NO +BLOCKING_SESSION_ID bigint(20) NO +TABLET_ID bigint(20) NO +PROXY_SID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_ACTIVE_SESSION_HISTORY limit 1); +cnt +1 desc oceanbase.DBA_OB_TRUSTED_ROOT_CERTIFICATE; Field Type Null Key Default Extra COMMON_NAME varchar(256) NO NULL @@ -9893,6 +10481,30 @@ SPEED_MBPS bigint(20) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_NIC_INFO limit 1); cnt 1 +desc oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_TYPE varchar(128) NO +RESPONSE_TIME decimal(24,6) NO +COUNT bigint(20) NO +TOTAL decimal(24,6) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM limit 1); +cnt +1 +desc oceanbase.V$OB_QUERY_RESPONSE_TIME_HISTOGRAM; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TENANT_ID bigint(20) NO +SQL_TYPE varchar(128) NO +RESPONSE_TIME decimal(24,6) NO +COUNT bigint(20) NO +TOTAL decimal(24,6) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_QUERY_RESPONSE_TIME_HISTOGRAM limit 1); +cnt +1 desc oceanbase.DBA_SCHEDULER_JOB_RUN_DETAILS; Field Type Null Key Default Extra LOG_ID decimal(20,0) NO @@ -10170,6 +10782,132 @@ CLIENT_INFO varchar(2048) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_KV_CLIENT_INFO limit 1); cnt 1 +desc oceanbase.GV$OB_RES_MGR_SYSSTAT; +Field Type Null Key Default Extra +CON_ID bigint(20) NO NULL +GROUP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +STATISTIC# bigint(20) NO NULL +NAME varchar(64) NO NULL +CLASS bigint(20) NO NULL +VALUE bigint(20) NO NULL +VALUE_TYPE varchar(16) NO NULL +STAT_ID bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_RES_MGR_SYSSTAT limit 1); +cnt +1 +desc oceanbase.V$OB_RES_MGR_SYSSTAT; +Field Type Null Key Default Extra +CON_ID bigint(20) NO +GROUP_ID bigint(20) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +STATISTIC# bigint(20) NO +NAME varchar(64) NO +CLASS bigint(20) NO +VALUE bigint(20) NO +VALUE_TYPE varchar(16) NO +STAT_ID bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_RES_MGR_SYSSTAT limit 1); +cnt +1 +desc oceanbase.DBA_WR_SQL_PLAN; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +CLUSTER_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_ID bigint(20) NO NULL +ID bigint(20) unsigned NO +DB_ID bigint(20) NO NULL +GMT_CREATE timestamp(6) NO NULL +OPERATOR varchar(255) NO NULL +OPTIONS varchar(255) NO NULL +OBJECT_NODE varchar(40) NO NULL +OBJECT_ID bigint(20) NO NULL +OBJECT_OWNER varchar(128) NO NULL +OBJECT_NAME varchar(128) NO NULL +OBJECT_ALIAS varchar(261) NO NULL +OBJECT_TYPE varchar(20) NO NULL +OPTIMIZER varchar(4000) NO NULL +PARENT_ID bigint(20) NO NULL +DEPTH bigint(20) NO NULL +POSITION bigint(20) NO NULL +IS_LAST_CHILD bigint(20) NO NULL +COST bigint(20) NO NULL +REAL_COST bigint(20) NO NULL +CARDINALITY bigint(20) NO NULL +REAL_CARDINALITY bigint(20) NO NULL +BYTES bigint(20) NO NULL +ROWSET bigint(20) NO NULL +OTHER_TAG varchar(4000) NO NULL +PARTITION_START varchar(4000) NO NULL +OTHER varchar(4000) NO NULL +CPU_COST bigint(20) NO NULL +IO_COST bigint(20) NO NULL +ACCESS_PREDICATES varchar(4000) NO NULL +FILTER_PREDICATES varchar(4000) NO NULL +STARTUP_PREDICATES varchar(4000) NO NULL +PROJECTION varchar(4000) NO NULL +SPECIAL_PREDICATES varchar(4000) NO NULL +QBLOCK_NAME varchar(128) NO NULL +REMARKS varchar(4000) NO NULL +OTHER_XML varchar(4000) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_WR_SQL_PLAN limit 1); +cnt +1 +desc oceanbase.CDB_WR_SQL_PLAN; +Field Type Null Key Default Extra +TENANT_ID bigint(20) NO NULL +CLUSTER_ID bigint(20) NO NULL +SNAP_ID bigint(20) NO NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_ID bigint(20) NO NULL +ID bigint(20) unsigned NO +DB_ID bigint(20) NO NULL +GMT_CREATE timestamp(6) NO NULL +OPERATOR varchar(255) NO NULL +OPTIONS varchar(255) NO NULL +OBJECT_NODE varchar(40) NO NULL +OBJECT_ID bigint(20) NO NULL +OBJECT_OWNER varchar(128) NO NULL +OBJECT_NAME varchar(128) NO NULL +OBJECT_ALIAS varchar(261) NO NULL +OBJECT_TYPE varchar(20) NO NULL +OPTIMIZER varchar(4000) NO NULL +PARENT_ID bigint(20) NO NULL +DEPTH bigint(20) NO NULL +POSITION bigint(20) NO NULL +IS_LAST_CHILD bigint(20) NO NULL +COST bigint(20) NO NULL +REAL_COST bigint(20) NO NULL +CARDINALITY bigint(20) NO NULL +REAL_CARDINALITY bigint(20) NO NULL +BYTES bigint(20) NO NULL +ROWSET bigint(20) NO NULL +OTHER_TAG varchar(4000) NO NULL +PARTITION_START varchar(4000) NO NULL +OTHER varchar(4000) NO NULL +CPU_COST bigint(20) NO NULL +IO_COST bigint(20) NO NULL +ACCESS_PREDICATES varchar(4000) NO NULL +FILTER_PREDICATES varchar(4000) NO NULL +STARTUP_PREDICATES varchar(4000) NO NULL +PROJECTION varchar(4000) NO NULL +SPECIAL_PREDICATES varchar(4000) NO NULL +QBLOCK_NAME varchar(128) NO NULL +REMARKS varchar(4000) NO NULL +OTHER_XML varchar(4000) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_WR_SQL_PLAN limit 1); +cnt +1 desc oceanbase.DBA_OB_SPM_EVO_RESULT; Field Type Null Key Default Extra OWNER varchar(128) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result index 1a8da5af07..21adb7ce23 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result @@ -1495,6 +1495,25 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_tablet_stat runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_res_mgr_sysstat; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +group_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +statistic# bigint(20) NO PRI NULL +value bigint(20) NO NULL +value_type varchar(16) NO NULL +stat_id bigint(20) NO NULL +name varchar(64) NO NULL +class bigint(20) NO NULL +can_visible tinyint(4) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_res_mgr_sysstat; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_res_mgr_sysstat runs in single server" +IF(count(*) >= 0, 1, 0) +1 desc information_schema.SESSION_VARIABLES; Field Type Null Key Default Extra VARIABLE_NAME varchar(128) NO @@ -4860,6 +4879,168 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_checkpoint_diagnose_info runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_system_event; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +event_id bigint(20) NO PRI NULL +total_waits bigint(20) YES NULL +total_timeouts bigint(20) YES NULL +time_waited_micro bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_system_event; +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_wr_event_name; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +event_id bigint(20) NO PRI NULL +event_name varchar(64) YES NULL +parameter1 varchar(64) YES NULL +parameter2 varchar(64) YES NULL +parameter3 varchar(64) YES NULL +wait_class_id bigint(20) YES NULL +wait_class varchar(64) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_event_name; +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_sqlstat; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_ID bigint(20) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO 0 +EXECUTIONS_DELTA bigint(20) NO 0 +DISK_READS_TOTAL bigint(20) NO 0 +DISK_READS_DELTA bigint(20) NO 0 +BUFFER_GETS_TOTAL bigint(20) NO 0 +BUFFER_GETS_DELTA bigint(20) NO 0 +ELAPSED_TIME_TOTAL bigint(20) NO 0 +ELAPSED_TIME_DELTA bigint(20) NO 0 +CPU_TIME_TOTAL bigint(20) NO 0 +CPU_TIME_DELTA bigint(20) NO 0 +CCWAIT_TOTAL bigint(20) NO 0 +CCWAIT_DELTA bigint(20) NO 0 +USERIO_WAIT_TOTAL bigint(20) NO 0 +USERIO_WAIT_DELTA bigint(20) NO 0 +APWAIT_TOTAL bigint(20) NO 0 +APWAIT_DELTA bigint(20) NO 0 +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO 0 +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO 0 +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO 0 +PHYSICAL_READ_BYTES_DELTA bigint(20) NO 0 +WRITE_THROTTLE_TOTAL bigint(20) NO 0 +WRITE_THROTTLE_DELTA bigint(20) NO 0 +ROWS_PROCESSED_TOTAL bigint(20) NO 0 +ROWS_PROCESSED_DELTA bigint(20) NO 0 +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MEMSTORE_READ_ROWS_DELTA bigint(20) NO 0 +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO 0 +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO 0 +RPC_TOTAL bigint(20) NO 0 +RPC_DELTA bigint(20) NO 0 +FETCHES_TOTAL bigint(20) NO 0 +FETCHES_DELTA bigint(20) NO 0 +RETRY_TOTAL bigint(20) NO 0 +RETRY_DELTA bigint(20) NO 0 +PARTITION_TOTAL bigint(20) NO 0 +PARTITION_DELTA bigint(20) NO 0 +NESTED_SQL_TOTAL bigint(20) NO 0 +NESTED_SQL_DELTA bigint(20) NO 0 +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO 0 +ROUTE_MISS_DELTA bigint(20) NO 0 +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO 0 +PLAN_CACHE_HIT_DELTA bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_sqlstat; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_sqlstat runs in single server" +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_wr_sqlstat; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +plan_hash bigint(20) unsigned NO PRI NULL +source_ip varchar(46) NO PRI NULL +source_port bigint(20) NO PRI NULL +plan_type bigint(20) NO NULL +module varchar(64) YES NULL +action varchar(64) YES NULL +parsing_db_id bigint(20) NO NULL +parsing_db_name varchar(128) NO NULL +parsing_user_id bigint(20) NO NULL +executions_total bigint(20) NO 0 +executions_delta bigint(20) NO 0 +disk_reads_total bigint(20) NO 0 +disk_reads_delta bigint(20) NO 0 +buffer_gets_total bigint(20) NO 0 +buffer_gets_delta bigint(20) NO 0 +elapsed_time_total bigint(20) NO 0 +elapsed_time_delta bigint(20) NO 0 +cpu_time_total bigint(20) NO 0 +cpu_time_delta bigint(20) NO 0 +ccwait_total bigint(20) NO 0 +ccwait_delta bigint(20) NO 0 +userio_wait_total bigint(20) NO 0 +userio_wait_delta bigint(20) NO 0 +apwait_total bigint(20) NO 0 +apwait_delta bigint(20) NO 0 +physical_read_requests_total bigint(20) NO 0 +physical_read_requests_delta bigint(20) NO 0 +physical_read_bytes_total bigint(20) NO 0 +physical_read_bytes_delta bigint(20) NO 0 +write_throttle_total bigint(20) NO 0 +write_throttle_delta bigint(20) NO 0 +rows_processed_total bigint(20) NO 0 +rows_processed_delta bigint(20) NO 0 +memstore_read_rows_total bigint(20) NO 0 +memstore_read_rows_delta bigint(20) NO 0 +minor_ssstore_read_rows_total bigint(20) NO 0 +minor_ssstore_read_rows_delta bigint(20) NO 0 +major_ssstore_read_rows_total bigint(20) NO 0 +major_ssstore_read_rows_delta bigint(20) NO 0 +rpc_total bigint(20) NO 0 +rpc_delta bigint(20) NO 0 +fetches_total bigint(20) NO 0 +fetches_delta bigint(20) NO 0 +retry_total bigint(20) NO 0 +retry_delta bigint(20) NO 0 +partition_total bigint(20) NO 0 +partition_delta bigint(20) NO 0 +nested_sql_total bigint(20) NO 0 +nested_sql_delta bigint(20) NO 0 +route_miss_total bigint(20) NO 0 +route_miss_delta bigint(20) NO 0 +first_load_time timestamp(6) YES NULL +plan_cache_hit_total bigint(20) NO 0 +plan_cache_hit_delta bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sqlstat; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_detect_lock_info; Field Type Null Key Default Extra tenant_id bigint(20) NO PRI NULL @@ -4909,6 +5090,17 @@ majority_succ_time timestamp(6) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tenant_snapshot_job; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_sqltext; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +query_sql longtext NO NULL +sql_type bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sqltext; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_ls_snapshot; Field Type Null Key Default Extra tenant_id bigint(20) NO NULL @@ -5326,6 +5518,54 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_kv_client_info runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_sql_plan; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +plan_hash bigint(20) unsigned NO PRI NULL +plan_id bigint(20) NO PRI NULL +id bigint(20) unsigned NO PRI 0 +db_id bigint(20) NO NULL +gmt_create timestamp(6) NO NULL +operator varchar(255) NO NULL +options varchar(255) NO NULL +object_node varchar(40) NO NULL +object_id bigint(20) NO NULL +object_owner varchar(128) NO NULL +object_name varchar(128) NO NULL +object_alias varchar(261) NO NULL +object_type varchar(20) NO NULL +optimizer varchar(4000) NO NULL +parent_id bigint(20) NO NULL +depth bigint(20) NO NULL +position bigint(20) NO NULL +is_last_child bigint(20) NO NULL +cost bigint(20) NO NULL +real_cost bigint(20) NO NULL +cardinality bigint(20) NO NULL +real_cardinality bigint(20) NO NULL +bytes bigint(20) NO NULL +rowset bigint(20) NO NULL +other_tag varchar(4000) NO NULL +partition_start varchar(4000) NO NULL +other varchar(4000) NO NULL +cpu_cost bigint(20) NO NULL +io_cost bigint(20) NO NULL +access_predicates varchar(4000) NO NULL +filter_predicates varchar(4000) NO NULL +startup_predicates varchar(4000) NO NULL +projection varchar(4000) NO NULL +special_predicates varchar(4000) NO NULL +qblock_name varchar(128) NO NULL +remarks varchar(4000) NO NULL +other_xml varchar(4000) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sql_plan; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_function_io_stat; Field Type Null Key Default Extra svr_ip varchar(46) NO PRI NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index 30657963ac..cf86603a02 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -1995,6 +1995,25 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_ddl_sim_point_stat runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_res_mgr_sysstat; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +group_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +statistic# bigint(20) NO PRI NULL +value bigint(20) NO NULL +value_type varchar(16) NO NULL +stat_id bigint(20) NO NULL +name varchar(64) NO NULL +class bigint(20) NO NULL +can_visible tinyint(4) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_res_mgr_sysstat; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_res_mgr_sysstat runs in single server" +IF(count(*) >= 0, 1, 0) +1 desc information_schema.SESSION_VARIABLES; Field Type Null Key Default Extra VARIABLE_NAME varchar(128) NO @@ -9279,6 +9298,34 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_checkpoint_diagnose_info runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_system_event; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +event_id bigint(20) NO PRI NULL +total_waits bigint(20) YES NULL +total_timeouts bigint(20) YES NULL +time_waited_micro bigint(20) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_system_event; +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_wr_event_name; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +event_id bigint(20) NO PRI NULL +event_name varchar(64) YES NULL +parameter1 varchar(64) YES NULL +parameter2 varchar(64) YES NULL +parameter3 varchar(64) YES NULL +wait_class_id bigint(20) YES NULL +wait_class varchar(64) YES NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_event_name; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_tenant_scheduler_running_job; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL @@ -9339,6 +9386,140 @@ grantor_host varchar(128) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_routine_privilege_history; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_sqlstat; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TENANT_ID bigint(20) NO NULL +SQL_ID varchar(32) NO NULL +PLAN_ID bigint(20) NO NULL +PLAN_HASH bigint(20) unsigned NO NULL +PLAN_TYPE bigint(20) NO NULL +QUERY_SQL longtext NO NULL +SQL_TYPE bigint(20) NO NULL +MODULE varchar(64) YES NULL +ACTION varchar(64) YES NULL +PARSING_DB_ID bigint(20) NO NULL +PARSING_DB_NAME varchar(128) NO NULL +PARSING_USER_ID bigint(20) NO NULL +EXECUTIONS_TOTAL bigint(20) NO 0 +EXECUTIONS_DELTA bigint(20) NO 0 +DISK_READS_TOTAL bigint(20) NO 0 +DISK_READS_DELTA bigint(20) NO 0 +BUFFER_GETS_TOTAL bigint(20) NO 0 +BUFFER_GETS_DELTA bigint(20) NO 0 +ELAPSED_TIME_TOTAL bigint(20) NO 0 +ELAPSED_TIME_DELTA bigint(20) NO 0 +CPU_TIME_TOTAL bigint(20) NO 0 +CPU_TIME_DELTA bigint(20) NO 0 +CCWAIT_TOTAL bigint(20) NO 0 +CCWAIT_DELTA bigint(20) NO 0 +USERIO_WAIT_TOTAL bigint(20) NO 0 +USERIO_WAIT_DELTA bigint(20) NO 0 +APWAIT_TOTAL bigint(20) NO 0 +APWAIT_DELTA bigint(20) NO 0 +PHYSICAL_READ_REQUESTS_TOTAL bigint(20) NO 0 +PHYSICAL_READ_REQUESTS_DELTA bigint(20) NO 0 +PHYSICAL_READ_BYTES_TOTAL bigint(20) NO 0 +PHYSICAL_READ_BYTES_DELTA bigint(20) NO 0 +WRITE_THROTTLE_TOTAL bigint(20) NO 0 +WRITE_THROTTLE_DELTA bigint(20) NO 0 +ROWS_PROCESSED_TOTAL bigint(20) NO 0 +ROWS_PROCESSED_DELTA bigint(20) NO 0 +MEMSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MEMSTORE_READ_ROWS_DELTA bigint(20) NO 0 +MINOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MINOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO 0 +MAJOR_SSSTORE_READ_ROWS_TOTAL bigint(20) NO 0 +MAJOR_SSSTORE_READ_ROWS_DELTA bigint(20) NO 0 +RPC_TOTAL bigint(20) NO 0 +RPC_DELTA bigint(20) NO 0 +FETCHES_TOTAL bigint(20) NO 0 +FETCHES_DELTA bigint(20) NO 0 +RETRY_TOTAL bigint(20) NO 0 +RETRY_DELTA bigint(20) NO 0 +PARTITION_TOTAL bigint(20) NO 0 +PARTITION_DELTA bigint(20) NO 0 +NESTED_SQL_TOTAL bigint(20) NO 0 +NESTED_SQL_DELTA bigint(20) NO 0 +SOURCE_IP varchar(46) NO NULL +SOURCE_PORT bigint(20) NO NULL +ROUTE_MISS_TOTAL bigint(20) NO 0 +ROUTE_MISS_DELTA bigint(20) NO 0 +FIRST_LOAD_TIME timestamp(6) YES NULL +PLAN_CACHE_HIT_TOTAL bigint(20) NO 0 +PLAN_CACHE_HIT_DELTA bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_sqlstat; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_sqlstat runs in single server" +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_wr_sqlstat; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +plan_hash bigint(20) unsigned NO PRI NULL +source_ip varchar(46) NO PRI NULL +source_port bigint(20) NO PRI NULL +plan_type bigint(20) NO NULL +module varchar(64) YES NULL +action varchar(64) YES NULL +parsing_db_id bigint(20) NO NULL +parsing_db_name varchar(128) NO NULL +parsing_user_id bigint(20) NO NULL +executions_total bigint(20) NO 0 +executions_delta bigint(20) NO 0 +disk_reads_total bigint(20) NO 0 +disk_reads_delta bigint(20) NO 0 +buffer_gets_total bigint(20) NO 0 +buffer_gets_delta bigint(20) NO 0 +elapsed_time_total bigint(20) NO 0 +elapsed_time_delta bigint(20) NO 0 +cpu_time_total bigint(20) NO 0 +cpu_time_delta bigint(20) NO 0 +ccwait_total bigint(20) NO 0 +ccwait_delta bigint(20) NO 0 +userio_wait_total bigint(20) NO 0 +userio_wait_delta bigint(20) NO 0 +apwait_total bigint(20) NO 0 +apwait_delta bigint(20) NO 0 +physical_read_requests_total bigint(20) NO 0 +physical_read_requests_delta bigint(20) NO 0 +physical_read_bytes_total bigint(20) NO 0 +physical_read_bytes_delta bigint(20) NO 0 +write_throttle_total bigint(20) NO 0 +write_throttle_delta bigint(20) NO 0 +rows_processed_total bigint(20) NO 0 +rows_processed_delta bigint(20) NO 0 +memstore_read_rows_total bigint(20) NO 0 +memstore_read_rows_delta bigint(20) NO 0 +minor_ssstore_read_rows_total bigint(20) NO 0 +minor_ssstore_read_rows_delta bigint(20) NO 0 +major_ssstore_read_rows_total bigint(20) NO 0 +major_ssstore_read_rows_delta bigint(20) NO 0 +rpc_total bigint(20) NO 0 +rpc_delta bigint(20) NO 0 +fetches_total bigint(20) NO 0 +fetches_delta bigint(20) NO 0 +retry_total bigint(20) NO 0 +retry_delta bigint(20) NO 0 +partition_total bigint(20) NO 0 +partition_delta bigint(20) NO 0 +nested_sql_total bigint(20) NO 0 +nested_sql_delta bigint(20) NO 0 +route_miss_total bigint(20) NO 0 +route_miss_delta bigint(20) NO 0 +first_load_time timestamp(6) YES NULL +plan_cache_hit_total bigint(20) NO 0 +plan_cache_hit_delta bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sqlstat; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_aux_stat; Field Type Null Key Default Extra tenant_id bigint(20) NO PRI NULL @@ -9435,6 +9616,17 @@ majority_succ_time timestamp(6) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tenant_snapshot_job; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_sqltext; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +query_sql longtext NO NULL +sql_type bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sqltext; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_dbms_lock_allocated; Field Type Null Key Default Extra tenant_id bigint(20) NO PRI NULL @@ -10152,6 +10344,54 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_kv_client_info runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_wr_sql_plan; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +cluster_id bigint(20) NO PRI NULL +snap_id bigint(20) NO PRI NULL +svr_ip varchar(46) NO PRI NULL +svr_port bigint(20) NO PRI NULL +sql_id varchar(32) NO PRI NULL +plan_hash bigint(20) unsigned NO PRI NULL +plan_id bigint(20) NO PRI NULL +id bigint(20) unsigned NO PRI 0 +db_id bigint(20) NO NULL +gmt_create timestamp(6) NO NULL +operator varchar(255) NO NULL +options varchar(255) NO NULL +object_node varchar(40) NO NULL +object_id bigint(20) NO NULL +object_owner varchar(128) NO NULL +object_name varchar(128) NO NULL +object_alias varchar(261) NO NULL +object_type varchar(20) NO NULL +optimizer varchar(4000) NO NULL +parent_id bigint(20) NO NULL +depth bigint(20) NO NULL +position bigint(20) NO NULL +is_last_child bigint(20) NO NULL +cost bigint(20) NO NULL +real_cost bigint(20) NO NULL +cardinality bigint(20) NO NULL +real_cardinality bigint(20) NO NULL +bytes bigint(20) NO NULL +rowset bigint(20) NO NULL +other_tag varchar(4000) NO NULL +partition_start varchar(4000) NO NULL +other varchar(4000) NO NULL +cpu_cost bigint(20) NO NULL +io_cost bigint(20) NO NULL +access_predicates varchar(4000) NO NULL +filter_predicates varchar(4000) NO NULL +startup_predicates varchar(4000) NO NULL +projection varchar(4000) NO NULL +special_predicates varchar(4000) NO NULL +qblock_name varchar(128) NO NULL +remarks varchar(4000) NO NULL +other_xml varchar(4000) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_wr_sql_plan; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_function_io_stat; Field Type Null Key Default Extra svr_ip varchar(46) NO PRI NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index d8050bf7fa..9aa5c45ad8 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result @@ -282,8 +282,11 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 484 __all_storage_ha_perf_diagnose_history 0 201001 1 485 __all_clone_job 0 201001 1 486 __all_clone_job_history 0 201001 1 +487 __wr_system_event 0 201001 1 +488 __wr_event_name 0 201001 1 490 __all_routine_privilege 0 201001 1 491 __all_routine_privilege_history 0 201001 1 +492 __wr_sqlstat 0 201001 1 493 __all_ncomp_dll 0 201001 1 494 __all_aux_stat 0 201001 1 495 __all_index_usage_info 0 201001 1 @@ -292,6 +295,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 498 __all_transfer_partition_task 0 201001 1 499 __all_transfer_partition_task_history 0 201001 1 500 __all_tenant_snapshot_job 0 201001 1 +501 __wr_sqltext 0 201001 1 502 __all_trusted_root_certificate 0 201001 1 503 __all_audit_log_filter 0 201001 1 504 __all_audit_log_user 0 201001 1 @@ -312,6 +316,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 522 __all_pkg_type 0 201001 1 523 __all_pkg_type_attr 0 201001 1 524 __all_pkg_coll_type 0 201001 1 +525 __wr_sql_plan 0 201001 1 528 __all_ncomp_dll_v2 0 201001 1 10001 __tenant_virtual_all_table 2 201001 1 10002 __tenant_virtual_table_column 2 201001 1 @@ -404,6 +409,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 11117 __all_virtual_tablet_stat 2 201001 1 11118 __all_virtual_ddl_sim_point 2 201001 1 11119 __all_virtual_ddl_sim_point_stat 2 201001 1 +11120 __all_virtual_res_mgr_sysstat 2 201001 1 12001 SESSION_VARIABLES 2 201002 1 12006 GLOBAL_STATUS 2 201002 1 12008 SESSION_STATUS 2 201002 1 @@ -740,9 +746,13 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12437 __all_virtual_checkpoint_diagnose_memtable_info 2 201001 1 12438 __all_virtual_checkpoint_diagnose_checkpoint_unit_info 2 201001 1 12439 __all_virtual_checkpoint_diagnose_info 2 201001 1 +12440 __all_virtual_wr_system_event 2 201001 1 +12441 __all_virtual_wr_event_name 2 201001 1 12442 __all_virtual_tenant_scheduler_running_job 2 201001 1 12443 __all_virtual_routine_privilege 2 201001 1 12444 __all_virtual_routine_privilege_history 2 201001 1 +12445 __all_virtual_sqlstat 2 201001 1 +12446 __all_virtual_wr_sqlstat 2 201001 1 12447 __all_virtual_aux_stat 2 201001 1 12448 __all_virtual_detect_lock_info 2 201001 1 12449 __all_virtual_client_to_server_session_info 2 201001 1 @@ -750,6 +760,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12451 __all_virtual_transfer_partition_task 2 201001 1 12452 __all_virtual_transfer_partition_task_history 2 201001 1 12453 __all_virtual_tenant_snapshot_job 2 201001 1 +12454 __all_virtual_wr_sqltext 2 201001 1 12456 __all_virtual_dbms_lock_allocated 2 201001 1 12457 __all_virtual_shared_storage_compaction_info 2 201001 1 12458 __all_virtual_ls_snapshot 2 201001 1 @@ -790,6 +801,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12498 __all_virtual_pkg_type_attr 2 201001 1 12499 __all_virtual_pkg_coll_type 2 201001 1 12500 __all_virtual_kv_client_info 2 201001 1 +12501 __all_virtual_wr_sql_plan 2 201001 1 12504 __all_virtual_function_io_stat 2 201001 1 12505 __all_virtual_temp_file 2 201001 1 12506 __all_virtual_ncomp_dll_v2 2 201001 1 @@ -1177,8 +1189,22 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21478 V$OB_TENANT_RUNTIME_INFO 1 201001 1 21479 GV$OB_CGROUP_CONFIG 1 201001 1 21480 V$OB_CGROUP_CONFIG 1 201001 1 +21481 DBA_WR_SYSTEM_EVENT 1 201001 1 +21482 CDB_WR_SYSTEM_EVENT 1 201001 1 +21483 DBA_WR_EVENT_NAME 1 201001 1 +21484 CDB_WR_EVENT_NAME 1 201001 1 21485 DBA_OB_FORMAT_OUTLINES 1 201001 1 21486 procs_priv 1 201003 1 +21487 GV$OB_SQLSTAT 1 201001 1 +21488 V$OB_SQLSTAT 1 201001 1 +21489 DBA_WR_SQLSTAT 1 201001 1 +21490 CDB_WR_SQLSTAT 1 201001 1 +21491 GV$OB_SESS_TIME_MODEL 1 201001 1 +21492 V$OB_SESS_TIME_MODEL 1 201001 1 +21493 GV$OB_SYS_TIME_MODEL 1 201001 1 +21494 V$OB_SYS_TIME_MODEL 1 201001 1 +21495 DBA_WR_SYS_TIME_MODEL 1 201001 1 +21496 CDB_WR_SYS_TIME_MODEL 1 201001 1 21497 DBA_OB_AUX_STATISTICS 1 201001 1 21498 CDB_OB_AUX_STATISTICS 1 201001 1 21499 DBA_INDEX_USAGE 1 201001 1 @@ -1187,6 +1213,10 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21502 CDB_OB_TRANSFER_PARTITION_TASKS 1 201001 1 21503 DBA_OB_TRANSFER_PARTITION_TASK_HISTORY 1 201001 1 21504 CDB_OB_TRANSFER_PARTITION_TASK_HISTORY 1 201001 1 +21505 DBA_WR_SQLTEXT 1 201001 1 +21506 CDB_WR_SQLTEXT 1 201001 1 +21507 GV$OB_ACTIVE_SESSION_HISTORY 1 201001 1 +21508 V$OB_ACTIVE_SESSION_HISTORY 1 201001 1 21509 DBA_OB_TRUSTED_ROOT_CERTIFICATE 1 201001 1 21510 DBA_OB_CLONE_PROGRESS 1 201001 1 21511 role_edges 1 201003 1 @@ -1264,6 +1294,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21584 ROLE_ROUTINE_GRANTS 1 201002 1 21585 func 1 201003 1 21586 GV$OB_NIC_INFO 1 201001 1 +21587 GV$OB_QUERY_RESPONSE_TIME_HISTOGRAM 1 201001 1 +21588 V$OB_QUERY_RESPONSE_TIME_HISTOGRAM 1 201001 1 21589 DBA_SCHEDULER_JOB_RUN_DETAILS 1 201001 1 21590 CDB_SCHEDULER_JOB_RUN_DETAILS 1 201001 1 21592 CDB_OB_SERVER_SPACE_USAGE 1 201001 1 @@ -1281,6 +1313,10 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21605 INNODB_SYS_FOREIGN_COLS 1 201002 1 21607 GV$OB_KV_CLIENT_INFO 1 201001 1 21608 V$OB_KV_CLIENT_INFO 1 201001 1 +21610 GV$OB_RES_MGR_SYSSTAT 1 201001 1 +21611 V$OB_RES_MGR_SYSSTAT 1 201001 1 +21612 DBA_WR_SQL_PLAN 1 201001 1 +21613 CDB_WR_SQL_PLAN 1 201001 1 21616 DBA_OB_SPM_EVO_RESULT 1 201001 1 21617 CDB_OB_SPM_EVO_RESULT 1 201001 1 21620 GV$OB_FUNCTION_IO_STAT 1 201001 1 diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 483e8d4ad0..f7591e59a5 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -8,7 +8,7 @@ function(ob_unittest case) add_test(${case} ${case}) set_tests_properties(${case} PROPERTIES TIMEOUT 300) endif() - target_link_libraries(${case} PRIVATE oceanbase gtest gmock ${HYPERSCAN_LIB}) + target_link_libraries(${case} PRIVATE -Wl,--whole-archive mock_di -Wl,--no-whole-archive oceanbase gtest gmock ${HYPERSCAN_LIB}) target_include_directories(${case} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/unittest ${CMAKE_SOURCE_DIR}/mittest ${CMAKE_SOURCE_DIR}/deps/oblib/unittest) endfunction() diff --git a/unittest/observer/mysql/test_query_response_time.cpp b/unittest/observer/mysql/test_query_response_time.cpp index e43eb36722..eca1fbb3ac 100644 --- a/unittest/observer/mysql/test_query_response_time.cpp +++ b/unittest/observer/mysql/test_query_response_time.cpp @@ -13,6 +13,7 @@ #include #include "lib/utility/ob_test_util.h" #include "observer/mysql/ob_query_response_time.h" +#include "sql/resolver/ob_stmt_type.h" using namespace oceanbase::common; using namespace oceanbase::observer; @@ -48,30 +49,52 @@ void TestQueryRsponseTime::TearDown() } TEST_F(TestQueryRsponseTime, basic_test){ - ObRSTTimeCollector time_collector; - time_collector.setup(10); - ASSERT_EQ(100,time_collector.bound(2)); - ASSERT_EQ(13,time_collector.bound_count()); - time_collector.collect(5); - time_collector.collect(50); - ASSERT_EQ(1,time_collector.count(1)); - ASSERT_EQ(5,time_collector.total(1)); - ASSERT_EQ(1,time_collector.count(2)); - ASSERT_EQ(50,time_collector.total(2)); - time_collector.flush(); - ASSERT_EQ(0,time_collector.count(1)); - ASSERT_EQ(0,time_collector.total(1)); - ASSERT_EQ(0,time_collector.count(2)); - ASSERT_EQ(0,time_collector.total(2)); - time_collector.setup(100); - ASSERT_EQ(100,time_collector.bound(1)); - ASSERT_EQ(7,time_collector.bound_count()); - time_collector.collect(5); - time_collector.collect(50); - ASSERT_EQ(2,time_collector.count(1)); - ASSERT_EQ(55,time_collector.total(1)); - ASSERT_EQ(0,time_collector.count(2)); - ASSERT_EQ(0,time_collector.total(2)); + ObRespTimeInfoCollector time_collector; + ASSERT_EQ(OB_SUCCESS, time_collector.setup(10)); + ASSERT_EQ(100,time_collector.utility().bound(2)); + ASSERT_EQ(13,time_collector.utility().bound_count()); + ASSERT_EQ(OB_SUCCESS, time_collector.collect(oceanbase::sql::stmt::StmtType::T_SELECT, false/*is_inner_sql*/, 5)); + ASSERT_EQ(OB_SUCCESS, time_collector.collect(oceanbase::sql::stmt::StmtType::T_SELECT, false/*is_inner_sql*/, 50)); + + int64_t val = -1; + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(1, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_total_time_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(5, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 2, val)); + ASSERT_EQ(1, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_total_time_val(RespTimeSqlType::select_sql, 2, val)); + ASSERT_EQ(50, val); + ASSERT_EQ(OB_SUCCESS, time_collector.flush()); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(0, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_total_time_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(0, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 2, val)); + ASSERT_EQ(0, val); + ASSERT_EQ(0,time_collector.get_total_time_val(RespTimeSqlType::select_sql, 2, val)); + + ASSERT_EQ(OB_SUCCESS, time_collector.setup(100)); + ASSERT_EQ(100,time_collector.utility().bound(1)); + ASSERT_EQ(7,time_collector.utility().bound_count()); + ASSERT_EQ(OB_SUCCESS, time_collector.collect(oceanbase::sql::stmt::StmtType::T_SELECT, false/*is_inner_sql*/, 5)); + ASSERT_EQ(OB_SUCCESS, time_collector.collect(oceanbase::sql::stmt::StmtType::T_SELECT, false/*is_inner_sql*/, 50)); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(2, val); + + ASSERT_EQ(OB_SUCCESS, time_collector.get_total_time_val(RespTimeSqlType::select_sql, 1, val)); + ASSERT_EQ(55, val); + ASSERT_EQ(OB_SUCCESS, time_collector.get_count_val(RespTimeSqlType::select_sql, 2, val)); + ASSERT_EQ(0, val); + ASSERT_EQ(OB_SUCCESS, time_collector.get_total_time_val(RespTimeSqlType::select_sql, 2, val)); + ASSERT_EQ(0, val); } int main(int argc, char** argv) diff --git a/unittest/share/CMakeLists.txt b/unittest/share/CMakeLists.txt index cb062a1a69..9bf29a4ed8 100644 --- a/unittest/share/CMakeLists.txt +++ b/unittest/share/CMakeLists.txt @@ -93,6 +93,7 @@ if(OB_BUILD_CLOSE_MODULES) endif() ob_unittest(test_ash_index) +ob_unittest(test_wr) add_subdirectory(allocator) add_subdirectory(auto_increment) diff --git a/unittest/share/test_ash_index.cpp b/unittest/share/test_ash_index.cpp index 4b1519bfa0..9f3b1e9b3a 100644 --- a/unittest/share/test_ash_index.cpp +++ b/unittest/share/test_ash_index.cpp @@ -31,21 +31,23 @@ public: virtual void TearDown(); void reset_ash_list() { - ObActiveSessHistList::get_instance().write_pos_ = 0; - ObActiveSessHistList::get_instance().list_.reset(); + if (ObActiveSessHistList::get_instance().ash_buffer_.is_valid()) { + ObActiveSessHistList::get_instance().ash_buffer_.reset(); + } ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init()); } void reset_ash_list_with_write_pos(int64_t write_pos) { - ObActiveSessHistList::get_instance().write_pos_ = 0; - ObActiveSessHistList::get_instance().list_.reset(); + if (ObActiveSessHistList::get_instance().ash_buffer_.is_valid()) { + ObActiveSessHistList::get_instance().ash_buffer_.reset(); + } ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init()); - ObActiveSessHistList::get_instance().write_pos_ += write_pos; + ObActiveSessHistList::get_instance().ash_buffer_->write_pos_ += write_pos; } void push_back_sample_time(int64_t sample_time) { int64_t write_pos = ObActiveSessHistList::get_instance().write_pos(); - ActiveSessionStat stat; + ObActiveSessionStat stat; stat.sample_time_ = sample_time; ObActiveSessHistList::get_instance().add(stat); ASSERT_EQ(ObActiveSessHistList::get_instance().write_pos(), write_pos + 1); @@ -56,6 +58,9 @@ public: void TestAshIndex::SetUp() { + if (ObActiveSessHistList::get_instance().ash_buffer_.is_valid()) { + ObActiveSessHistList::get_instance().ash_buffer_.reset(); + } ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init()); } @@ -407,7 +412,7 @@ TEST_F(TestAshIndex, ash_overwrite) ASSERT_EQ(true, iter.has_next()) << "current count:" << i; ASSERT_EQ(0, iter.next().sample_time_); } - ASSERT_EQ(false, iter.has_next()) << "write pos:" << iter.list_->write_pos() << " curr:" << iter.curr_; + ASSERT_EQ(false, iter.has_next()) << "write pos:" << iter.ash_buffer_->write_pos() << " curr:" << iter.curr_; iter.init_with_sample_time_index(-1, -1); ASSERT_EQ(false, iter.has_next()); iter.init_with_sample_time_index(999, 999); @@ -577,11 +582,11 @@ TEST_F(TestAshIndex, ash_overwrite) push_back_sample_time(11); push_back_sample_time(12); iter = ObActiveSessHistList::get_instance().create_iterator(); - ObActiveSessHistList::get_instance().write_pos_ += ObActiveSessHistList::get_instance().size(); + ObActiveSessHistList::get_instance().ash_buffer_->write_pos_ += ObActiveSessHistList::get_instance().size(); iter.init_with_sample_time_index(12, 13); ASSERT_EQ(false, iter.has_next()); iter = ObActiveSessHistList::get_instance().create_iterator(); - ObActiveSessHistList::get_instance().write_pos_ += ObActiveSessHistList::get_instance().size() - 7; + ObActiveSessHistList::get_instance().ash_buffer_->write_pos_ += ObActiveSessHistList::get_instance().size() - 7; iter.init_with_sample_time_index(12, 13); ASSERT_EQ(true, iter.has_next()); ASSERT_EQ(12, iter.next().sample_time_); @@ -601,7 +606,7 @@ TEST_F(TestAshIndex, ash_overwrite) push_back_sample_time(15); } ASSERT_EQ(true, iter.has_next()); - ASSERT_EQ(8, iter.next().sample_time_) << "write pos:" << iter.list_->write_pos() << " curr:" << iter.curr_;; + ASSERT_EQ(8, iter.next().sample_time_) << "write pos:" << iter.ash_buffer_->write_pos() << " curr:" << iter.curr_; ASSERT_EQ(true, iter.has_next()); ASSERT_EQ(0, iter.next().sample_time_); ASSERT_EQ(false, iter.has_next()); @@ -762,6 +767,58 @@ TEST_F(TestAshIndex, ash_MIN_MAX) ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter)); } + +TEST_F(TestAshIndex, reverse_index) +{ + int ret = OB_SUCCESS; + + // empty list + auto iter = ObActiveSessHistList::get_instance().create_reverse_iterator_no_lock(); + + ASSERT_EQ(false, iter.has_next()); + push_back_sample_time(1); + ASSERT_EQ(false, iter.has_next()); + reset_ash_list(); + + push_back_sample_time(1); + iter = ObActiveSessHistList::get_instance().create_reverse_iterator_no_lock(); + ASSERT_EQ(true, iter.has_next()); + ASSERT_EQ(1, iter.next().sample_time_); + ASSERT_EQ(false, iter.has_next()); + reset_ash_list(); + + push_back_sample_time(1); + push_back_sample_time(2); + iter = ObActiveSessHistList::get_instance().create_reverse_iterator_no_lock(); + ASSERT_EQ(true, iter.has_next()); + ASSERT_EQ(1, iter.next().sample_time_); + ASSERT_EQ(true, iter.has_next()); + ASSERT_EQ(2, iter.next().sample_time_); + ASSERT_EQ(false, iter.has_next()); + reset_ash_list(); + + for (int i = 0; i < ObActiveSessHistList::get_instance().size(); i++) { + push_back_sample_time(i); + } + iter = ObActiveSessHistList::get_instance().create_reverse_iterator_no_lock(); + for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) { + ASSERT_EQ(i, iter.next().sample_time_); + ASSERT_EQ(true, iter.has_next()); + } + ASSERT_EQ(ObActiveSessHistList::get_instance().size() - 1, iter.next().sample_time_); + ASSERT_EQ(false, iter.has_next()); + for (int i = 0; i < ObActiveSessHistList::get_instance().size() / 2; i++) { + push_back_sample_time(i + ObActiveSessHistList::get_instance().size()); + } + iter = ObActiveSessHistList::get_instance().create_reverse_iterator_no_lock(); + for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) { + ASSERT_EQ(i + ObActiveSessHistList::get_instance().size() / 2, iter.next().sample_time_); + ASSERT_EQ(true, iter.has_next()); + } + ASSERT_EQ((int64_t)(ObActiveSessHistList::get_instance().size() * 1.5 - 1), iter.next().sample_time_); + ASSERT_EQ(false, iter.has_next()); +} + } // end namespace share } // end namespace oceanbase diff --git a/unittest/share/test_latch.cpp b/unittest/share/test_latch.cpp index 4ac80739cb..56d43a5918 100644 --- a/unittest/share/test_latch.cpp +++ b/unittest/share/test_latch.cpp @@ -194,7 +194,6 @@ TEST(ObLatch, normal) } //just print longer than 1s log - ObSessionStatEstGuard est_guard(1, 1); ret = latch.wrlock(ObLatchIds::DEFAULT_MUTEX); ASSERT_EQ(OB_SUCCESS, ret); ret = latch.wrlock(ObLatchIds::DEFAULT_MUTEX, ObTimeUtility::current_time() + 2000 * 1000); diff --git a/unittest/share/test_wr.cpp b/unittest/share/test_wr.cpp new file mode 100644 index 0000000000..541bdb8f5a --- /dev/null +++ b/unittest/share/test_wr.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE +#define private public +#define protected public +#include "share/wr/ob_wr_collector.h" +#include "observer/mysql/ob_query_retry_ctrl.h" +#undef private +#undef public +#include + +namespace oceanbase +{ +namespace share +{ +using namespace common; + +class TestWr : public ::testing::Test +{ +public: + virtual void SetUp() {} + virtual void TearDown(){} +}; + +TEST_F(TestWr, wr_collector_is_can_retry) +{ + observer::ObQueryRetryCtrl retry_ctrl; + retry_ctrl.init(); + + // err that cannot be retried + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_ERR_XML_INDEX)); + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_INVALID_MASK)); + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_LS_NEED_REBUILD)); + + // retry_func that is empty_proc func, cannot be retried + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_ERR_SP_DOES_NOT_EXIST)); + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_ERR_FUNCTION_UNKNOWN)); + ASSERT_EQ(false, ObWrCollector::is_can_retry(OB_OBJECT_NAME_EXIST)); + + // err that can be retried + ASSERT_EQ(true, ObWrCollector::is_can_retry(OB_SCHEMA_EAGAIN)); + ASSERT_EQ(true, ObWrCollector::is_can_retry(OB_LOCATION_NOT_EXIST)); + ASSERT_EQ(true, ObWrCollector::is_can_retry(OB_GTS_NOT_READY)); +} + +} // end namespace share +} // end namespace oceanbase + +int main(int argc, char **argv) +{ + oceanbase::common::ObLogger::get_logger().set_log_level("INFO"); + OB_LOGGER.set_log_level("INFO"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/unittest/sql/optimizer/storage_perf/ob_storage_perf_read.cpp b/unittest/sql/optimizer/storage_perf/ob_storage_perf_read.cpp index 396264e0b8..0df5ac10a2 100644 --- a/unittest/sql/optimizer/storage_perf/ob_storage_perf_read.cpp +++ b/unittest/sql/optimizer/storage_perf/ob_storage_perf_read.cpp @@ -522,8 +522,6 @@ int ObStoragePerfRead::single_get_speed() ret = OB_NOT_INIT; STORAGE_LOG(WARN, "should init first"); } else { - //ObTenantStatEstGuard session_guard(1, 123*(thread_no_+1)); - ObTenantStatEstGuard tenant_guard(1); ObRowGenerate row_generate; ObMemtableCtxFactory mem_ctx_fty; ObSchemaGetterGuard schema_guard; @@ -687,8 +685,6 @@ int ObStoragePerfRead::multi_get_speed() ret = OB_NOT_INIT; STORAGE_LOG(WARN, "should init first"); } else { - //ObSessionStatEstGuard session_guard(1, 124 * (thread_no_ + 1)); - ObTenantStatEstGuard tenant_guard(1); ObRowGenerate row_generate; ObArenaAllocator allocator(ObModIds::TEST); ObMemtableCtxFactory mem_ctx_fty; @@ -888,7 +884,6 @@ int ObStoragePerfRead::scan_speed() ret = OB_NOT_INIT; STORAGE_LOG(WARN, "should init first"); } else { - ObSessionStatEstGuard session_guard(1, 125 * (thread_no_ + 1)); ObRowGenerate row_generate; ObRowGenerate row_generate2; ObArenaAllocator allocator(ObModIds::TEST); diff --git a/unittest/sql/session/test_session_mgr.cpp b/unittest/sql/session/test_session_mgr.cpp index 358c631539..4813a35423 100644 --- a/unittest/sql/session/test_session_mgr.cpp +++ b/unittest/sql/session/test_session_mgr.cpp @@ -123,7 +123,6 @@ TEST_F(DISABLED_TestSessionMgr, test_performace) gettimeofday(&get_end, NULL); gettimeofday(&stat_beg, NULL); for (uint32_t i = 1; i < SESSION_COUNT; ++i) { - ObSessionStatEstGuard guard(1, static_cast(i)); EVENT_DEC(ACTIVE_SESSIONS); } gettimeofday(&stat_end, NULL);