From: Marc Alff Date: February 21 2012 6:28pm Subject: bzr push into mysql-trunk-wl5767 branch (marc.alff:3443 to 3444) List-Archive: http://lists.mysql.com/commits/143018 Message-Id: <201202211829.q1LIT1Jf011389@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3444 Marc Alff 2012-02-21 Code cleanup modified: include/mysql/psi/psi.h include/mysql/psi/psi_abi_v1.h.pp include/mysql/psi/psi_abi_v2.h.pp mysql-test/suite/perfschema/r/digest_table_full.result mysql-test/suite/perfschema/r/statement_digest.result mysql-test/suite/perfschema/r/statement_digest_consumers.result mysql-test/suite/perfschema/r/statement_digest_long_query.result storage/perfschema/pfs.cc storage/perfschema/pfs_digest.cc storage/perfschema/pfs_digest.h storage/perfschema/pfs_events_statements.h storage/perfschema/pfs_events_waits.h storage/perfschema/table_events_statements.cc storage/perfschema/table_helper.cc storage/perfschema/table_helper.h 3443 Marc Alff 2012-02-20 Post merge cleanup: integration with recent changes in sql/ related to MD5. modified: mysql-test/suite/perfschema/r/digest_table_full.result mysql-test/suite/perfschema/r/statement_digest.result mysql-test/suite/perfschema/r/statement_digest_consumers.result mysql-test/suite/perfschema/r/statement_digest_long_query.result storage/perfschema/pfs.cc storage/perfschema/pfs_digest.cc storage/perfschema/pfs_digest.h storage/perfschema/unittest/stub_server_misc.h === modified file 'include/mysql/psi/psi.h' --- a/include/mysql/psi/psi.h 2012-02-20 18:05:15 +0000 +++ b/include/mysql/psi/psi.h 2012-02-21 18:27:58 +0000 @@ -261,9 +261,11 @@ typedef struct PSI_bootstrap PSI_bootstr Compiling option to disable the statement digest instrumentation. */ +#ifndef DISABLE_PSI_STATEMENT #ifndef DISABLE_PSI_STATEMENT_DIGEST #define HAVE_PSI_STATEMENT_DIGEST_INTERFACE #endif +#endif /** @def DISABLE_PSI_SOCKET @@ -946,21 +948,26 @@ struct PSI_table_locker_state_v1 uint m_index; }; +#define PSI_MAX_DIGEST_STORAGE_SIZE 1024 + /** Structure to store token count/array for a statement on which digest is to be calculated. */ -typedef struct { - my_bool m_full; - int m_byte_count; - char m_token_array[1024]; - } PFS_digest_storage; +struct PSI_digest_storage +{ + my_bool m_full; + int m_byte_count; + char m_token_array[PSI_MAX_DIGEST_STORAGE_SIZE]; +}; +typedef struct PSI_digest_storage PSI_digest_storage; -struct PSI_digest_locker_state_v1 +struct PSI_digest_locker_state { int m_last_id_index; - PFS_digest_storage m_digest_storage; + PSI_digest_storage m_digest_storage; }; +typedef struct PSI_digest_locker_state PSI_digest_locker_state; /** State data storage for @c get_thread_statement_locker_v1_t, @@ -1020,7 +1027,8 @@ struct PSI_statement_locker_state_v1 ulong m_sort_rows; /** Metric, number of sort scans. */ ulong m_sort_scan; - struct PSI_digest_locker_state_v1 m_digest_state; + /** Statement digest. */ + PSI_digest_locker_state m_digest_state; }; /** @@ -2246,7 +2254,6 @@ typedef struct PSI_file_locker_state_v1 typedef struct PSI_table_locker_state_v1 PSI_table_locker_state; typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state; typedef struct PSI_socket_locker_state_v1 PSI_socket_locker_state; -typedef struct PSI_digest_locker_state_v1 PSI_digest_locker_state; #endif #ifdef USE_PSI_2 @@ -2267,7 +2274,6 @@ typedef struct PSI_file_locker_state_v2 typedef struct PSI_table_locker_state_v2 PSI_table_locker_state; typedef struct PSI_statement_locker_state_v2 PSI_statement_locker_state; typedef struct PSI_socket_locker_state_v2 PSI_socket_locker_state; -typedef struct PSI_digest_locker_state_v2 PSI_digest_locker_state; #endif #else /* HAVE_PSI_INTERFACE */ === modified file 'include/mysql/psi/psi_abi_v1.h.pp' --- a/include/mysql/psi/psi_abi_v1.h.pp 2012-02-12 22:05:27 +0000 +++ b/include/mysql/psi/psi_abi_v1.h.pp 2012-02-21 18:27:58 +0000 @@ -239,16 +239,19 @@ struct PSI_table_locker_state_v1 void *m_wait; uint m_index; }; -typedef struct { - my_bool m_full; - int m_byte_count; - char m_token_array[1024]; - } PFS_digest_storage; -struct PSI_digest_locker_state_v1 +struct PSI_digest_storage +{ + my_bool m_full; + int m_byte_count; + char m_token_array[1024]; +}; +typedef struct PSI_digest_storage PSI_digest_storage; +struct PSI_digest_locker_state { int m_last_id_index; - PFS_digest_storage m_digest_storage; + PSI_digest_storage m_digest_storage; }; +typedef struct PSI_digest_locker_state PSI_digest_locker_state; struct PSI_statement_locker_state_v1 { my_bool m_discarded; @@ -274,7 +277,7 @@ struct PSI_statement_locker_state_v1 ulong m_sort_range; ulong m_sort_rows; ulong m_sort_scan; - struct PSI_digest_locker_state_v1 m_digest_state; + PSI_digest_locker_state m_digest_state; }; struct PSI_socket_locker_state_v1 { @@ -611,6 +614,5 @@ typedef struct PSI_file_locker_state_v1 typedef struct PSI_table_locker_state_v1 PSI_table_locker_state; typedef struct PSI_statement_locker_state_v1 PSI_statement_locker_state; typedef struct PSI_socket_locker_state_v1 PSI_socket_locker_state; -typedef struct PSI_digest_locker_state_v1 PSI_digest_locker_state; extern MYSQL_PLUGIN_IMPORT PSI *PSI_server; C_MODE_END === modified file 'include/mysql/psi/psi_abi_v2.h.pp' --- a/include/mysql/psi/psi_abi_v2.h.pp 2012-02-12 22:05:27 +0000 +++ b/include/mysql/psi/psi_abi_v2.h.pp 2012-02-21 18:27:58 +0000 @@ -210,6 +210,5 @@ typedef struct PSI_file_locker_state_v2 typedef struct PSI_table_locker_state_v2 PSI_table_locker_state; typedef struct PSI_statement_locker_state_v2 PSI_statement_locker_state; typedef struct PSI_socket_locker_state_v2 PSI_socket_locker_state; -typedef struct PSI_digest_locker_state_v2 PSI_digest_locker_state; extern MYSQL_PLUGIN_IMPORT PSI *PSI_server; C_MODE_END === modified file 'mysql-test/suite/perfschema/r/digest_table_full.result' --- a/mysql-test/suite/perfschema/r/digest_table_full.result 2012-02-20 20:56:20 +0000 +++ b/mysql-test/suite/perfschema/r/digest_table_full.result 2012-02-21 18:27:58 +0000 @@ -76,7 +76,7 @@ SELECT DIGEST, DIGEST_TEXT, COUNT_STAR, SUM_ERRORS FROM performance_schema.events_statements_summary_by_digest; DIGEST DIGEST_TEXT COUNT_STAR SUM_ROWS_AFFECTED SUM_WARNINGS SUM_ERRORS NULL NULL 29 21 1 2 -f7ab835f907f396b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 0 0 0 +f7ab835f907f396baeb2c5e6e605929b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 0 0 0 SHOW VARIABLES LIKE "performance_schema_digests_size"; Variable_name Value performance_schema_digests_size 2 === modified file 'mysql-test/suite/perfschema/r/statement_digest.result' --- a/mysql-test/suite/perfschema/r/statement_digest.result 2012-02-20 20:56:20 +0000 +++ b/mysql-test/suite/perfschema/r/statement_digest.result 2012-02-21 18:27:58 +0000 @@ -75,28 +75,28 @@ Warning 1265 Data truncated for column ' SELECT DIGEST, DIGEST_TEXT, COUNT_STAR, SUM_ROWS_AFFECTED, SUM_WARNINGS, SUM_ERRORS FROM performance_schema.events_statements_summary_by_digest; DIGEST DIGEST_TEXT COUNT_STAR SUM_ROWS_AFFECTED SUM_WARNINGS SUM_ERRORS -f7ab835f907f396b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 0 0 0 -0431ac94abde6328 SELECT ? FROM t1 1 0 0 0 -d798ff4be98e0d26 SELECT ? FROM `t1` 1 0 0 0 -d5016618084cd788 SELECT ?, ... FROM t1 2 0 0 0 -6f08c6cdf2afab43 SELECT ? FROM t2 1 0 0 0 -4fef50eb0b2f2fbc SELECT ?, ... FROM t2 2 0 0 0 -c4335f4ded28cdc3 INSERT INTO t1 VALUES (?) 1 1 0 0 -b015c102ab03f4bc INSERT INTO t2 VALUES (?) 1 1 0 0 -f83d4b46c3fe5ff9 INSERT INTO t3 VALUES (...) 1 1 0 0 -b81724d2cfa0ab7f INSERT INTO t4 VALUES (...) 1 1 0 0 -960035d85bc6d14f INSERT INTO t5 VALUES (...) 1 1 0 0 -6ee7554974d2ffa1 INSERT INTO t1 VALUES (?) /* , ... */ 2 7 0 0 -827ec3eb62c9f2ed INSERT INTO t3 VALUES (...) /* , ... */ 1 3 0 0 -55e9e1b918c4e559 INSERT INTO t5 VALUES (...) /* , ... */ 1 3 0 0 -d055f262b12b2384 SELECT ? + ? 3 0 0 0 -de392358e87965c3 SELECT ? 1 0 0 0 -d8bde89f42443bc5 CREATE SCHEMA statements_digest_temp 2 2 0 0 -5f49c045f89918f9 DROP SCHEMA statements_digest_temp 2 0 0 0 -04bbba67445b1f70 SELECT ? FROM t11 1 0 0 1 -60be4562b0114c30 CREATE TABLE t11 ( c CHARACTER (?) ) 2 0 0 1 -b1115cec4d694e11 INSERT INTO t11 VALUES (?) 1 1 1 0 -2ff7a4150e76c272 SHOW WARNINGS 1 0 0 0 +f7ab835f907f396baeb2c5e6e605929b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 0 0 0 +0431ac94abde6328653ad7c73f14d029 SELECT ? FROM t1 1 0 0 0 +d798ff4be98e0d2613b5d055f70cec1e SELECT ? FROM `t1` 1 0 0 0 +d5016618084cd788c9098d2e0260a9f0 SELECT ?, ... FROM t1 2 0 0 0 +6f08c6cdf2afab43864454acffa74758 SELECT ? FROM t2 1 0 0 0 +4fef50eb0b2f2fbc0d6e65c1ce6deeef SELECT ?, ... FROM t2 2 0 0 0 +c4335f4ded28cdc34f7903b443dcf022 INSERT INTO t1 VALUES (?) 1 1 0 0 +b015c102ab03f4bccdfb32f01589af49 INSERT INTO t2 VALUES (?) 1 1 0 0 +f83d4b46c3fe5ff99035ff92b367422f INSERT INTO t3 VALUES (...) 1 1 0 0 +b81724d2cfa0ab7f2ba1e05d6bf925ed INSERT INTO t4 VALUES (...) 1 1 0 0 +960035d85bc6d14f454362580d6e5454 INSERT INTO t5 VALUES (...) 1 1 0 0 +6ee7554974d2ffa1ab5bd9549339e3e5 INSERT INTO t1 VALUES (?) /* , ... */ 2 7 0 0 +827ec3eb62c9f2eddd602524a535abcf INSERT INTO t3 VALUES (...) /* , ... */ 1 3 0 0 +55e9e1b918c4e559684d4297de2bdbd9 INSERT INTO t5 VALUES (...) /* , ... */ 1 3 0 0 +d055f262b12b2384248d1f132e7b9fea SELECT ? + ? 3 0 0 0 +de392358e87965c3f5da40056c9629a3 SELECT ? 1 0 0 0 +d8bde89f42443bc5632dfafe3f4c34f7 CREATE SCHEMA statements_digest_temp 2 2 0 0 +5f49c045f89918f9cd317263aa694c53 DROP SCHEMA statements_digest_temp 2 0 0 0 +04bbba67445b1f70cc44467ccc9d2b23 SELECT ? FROM t11 1 0 0 1 +60be4562b0114c30639771d1b123cf00 CREATE TABLE t11 ( c CHARACTER (?) ) 2 0 0 1 +b1115cec4d694e118d0ee714c44bb998 INSERT INTO t11 VALUES (?) 1 1 1 0 +2ff7a4150e76c272e5ebf9e66e0ddd10 SHOW WARNINGS 1 0 0 0 #################################### # CLEANUP #################################### === modified file 'mysql-test/suite/perfschema/r/statement_digest_consumers.result' --- a/mysql-test/suite/perfschema/r/statement_digest_consumers.result 2012-02-20 20:56:20 +0000 +++ b/mysql-test/suite/perfschema/r/statement_digest_consumers.result 2012-02-21 18:27:58 +0000 @@ -88,28 +88,28 @@ Warning 1265 Data truncated for column ' #################################### SELECT digest, digest_text, count_star FROM performance_schema.events_statements_summary_by_digest; digest digest_text count_star -f7ab835f907f396b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 -0431ac94abde6328 SELECT ? FROM t1 1 -d798ff4be98e0d26 SELECT ? FROM `t1` 1 -d5016618084cd788 SELECT ?, ... FROM t1 2 -6f08c6cdf2afab43 SELECT ? FROM t2 1 -4fef50eb0b2f2fbc SELECT ?, ... FROM t2 2 -c4335f4ded28cdc3 INSERT INTO t1 VALUES (?) 1 -b015c102ab03f4bc INSERT INTO t2 VALUES (?) 1 -f83d4b46c3fe5ff9 INSERT INTO t3 VALUES (...) 1 -b81724d2cfa0ab7f INSERT INTO t4 VALUES (...) 1 -960035d85bc6d14f INSERT INTO t5 VALUES (...) 1 -6ee7554974d2ffa1 INSERT INTO t1 VALUES (?) /* , ... */ 2 -827ec3eb62c9f2ed INSERT INTO t3 VALUES (...) /* , ... */ 1 -55e9e1b918c4e559 INSERT INTO t5 VALUES (...) /* , ... */ 1 -d055f262b12b2384 SELECT ? + ? 3 -de392358e87965c3 SELECT ? 1 -d8bde89f42443bc5 CREATE SCHEMA statements_digest_temp 2 -5f49c045f89918f9 DROP SCHEMA statements_digest_temp 2 -04bbba67445b1f70 SELECT ? FROM t11 1 -60be4562b0114c30 CREATE TABLE t11 ( c CHARACTER (?) ) 2 -b1115cec4d694e11 INSERT INTO t11 VALUES (?) 1 -2ff7a4150e76c272 SHOW WARNINGS 1 +f7ab835f907f396baeb2c5e6e605929b TRUNCATE TABLE performance_schema . events_statements_summary_by_digest 1 +0431ac94abde6328653ad7c73f14d029 SELECT ? FROM t1 1 +d798ff4be98e0d2613b5d055f70cec1e SELECT ? FROM `t1` 1 +d5016618084cd788c9098d2e0260a9f0 SELECT ?, ... FROM t1 2 +6f08c6cdf2afab43864454acffa74758 SELECT ? FROM t2 1 +4fef50eb0b2f2fbc0d6e65c1ce6deeef SELECT ?, ... FROM t2 2 +c4335f4ded28cdc34f7903b443dcf022 INSERT INTO t1 VALUES (?) 1 +b015c102ab03f4bccdfb32f01589af49 INSERT INTO t2 VALUES (?) 1 +f83d4b46c3fe5ff99035ff92b367422f INSERT INTO t3 VALUES (...) 1 +b81724d2cfa0ab7f2ba1e05d6bf925ed INSERT INTO t4 VALUES (...) 1 +960035d85bc6d14f454362580d6e5454 INSERT INTO t5 VALUES (...) 1 +6ee7554974d2ffa1ab5bd9549339e3e5 INSERT INTO t1 VALUES (?) /* , ... */ 2 +827ec3eb62c9f2eddd602524a535abcf INSERT INTO t3 VALUES (...) /* , ... */ 1 +55e9e1b918c4e559684d4297de2bdbd9 INSERT INTO t5 VALUES (...) /* , ... */ 1 +d055f262b12b2384248d1f132e7b9fea SELECT ? + ? 3 +de392358e87965c3f5da40056c9629a3 SELECT ? 1 +d8bde89f42443bc5632dfafe3f4c34f7 CREATE SCHEMA statements_digest_temp 2 +5f49c045f89918f9cd317263aa694c53 DROP SCHEMA statements_digest_temp 2 +04bbba67445b1f70cc44467ccc9d2b23 SELECT ? FROM t11 1 +60be4562b0114c30639771d1b123cf00 CREATE TABLE t11 ( c CHARACTER (?) ) 2 +b1115cec4d694e118d0ee714c44bb998 INSERT INTO t11 VALUES (?) 1 +2ff7a4150e76c272e5ebf9e66e0ddd10 SHOW WARNINGS 1 SELECT digest, digest_text FROM performance_schema.events_statements_current; digest digest_text #################################### === modified file 'mysql-test/suite/perfschema/r/statement_digest_long_query.result' --- a/mysql-test/suite/perfschema/r/statement_digest_long_query.result 2012-02-20 20:56:20 +0000 +++ b/mysql-test/suite/perfschema/r/statement_digest_long_query.result 2012-02-21 18:27:58 +0000 @@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 #################################### SELECT digest, digest_text, count_star FROM events_statements_summary_by_digest; digest digest_text count_star -4b653d085960e08d TRUNCATE TABLE events_statements_summary_by_digest 1 -2dd9d11451985e28 SELECT ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ! ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ... 1 +4b653d085960e08d033c67cb23748eb3 TRUNCATE TABLE events_statements_summary_by_digest 1 +2dd9d11451985e288ffd7f2cdefc28e2 SELECT ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ! ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ? + ... 1 === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2012-02-20 20:56:20 +0000 +++ b/storage/perfschema/pfs.cc 2012-02-21 18:27:58 +0000 @@ -1042,13 +1042,6 @@ static inline int mysql_mutex_lock(...) @ingroup Performance_schema_implementation */ -/** TIMED bit in the state flags bitfield. */ -#define STATE_FLAG_TIMED (1<<0) -/** THREAD bit in the state flags bitfield. */ -#define STATE_FLAG_THREAD (1<<1) -/** EVENT bit in the state flags bitfield. */ -#define STATE_FLAG_EVENT (1<<2) - pthread_key(PFS_thread*, THR_PFS); bool THR_PFS_initialized= false; @@ -4226,7 +4219,7 @@ get_thread_statement_locker_v1(PSI_state pfs->m_sort_scan= 0; pfs->m_no_index_used= 0; pfs->m_no_good_index_used= 0; - pfs->m_statement_digest_stat_ptr= NULL; + digest_reset(& pfs->m_digest_storage); /* New stages will have this statement as parent */ PFS_events_stages *child_stage= & pfs_thread->m_stage_current; @@ -4252,6 +4245,13 @@ get_thread_statement_locker_v1(PSI_state flags= 0; } + if (flag_statements_digest) + { + flags|= STATE_FLAG_DIGEST; + state->m_digest_state.m_last_id_index= 0; + digest_reset(& state->m_digest_state.m_digest_storage); + } + state->m_discarded= false; state->m_class= klass; state->m_flags= flags; @@ -4273,11 +4273,6 @@ get_thread_statement_locker_v1(PSI_state state->m_no_index_used= 0; state->m_no_good_index_used= 0; - state->m_digest_state.m_last_id_index= 0; - state->m_digest_state.m_digest_storage.m_byte_count= 0; - state->m_digest_state.m_digest_storage.m_token_array[0]= '\0'; - state->m_digest_state.m_digest_storage.m_full= false; - return reinterpret_cast (state); } @@ -4539,7 +4534,7 @@ static void end_statement_v1(PSI_stateme /* Capture statement stats by digest. */ - PFS_digest_storage *digest_storage= NULL; + PSI_digest_storage *digest_storage= NULL; PFS_statement_stat *digest_stat= NULL; PFS_statements_digest_stat* digest_stat_ptr= NULL; @@ -4595,8 +4590,19 @@ static void end_statement_v1(PSI_stateme pfs->m_timer_end= timer_end; pfs->m_end_event_id= thread->m_event_id; - pfs->m_statement_digest_stat_ptr= digest_stat_ptr; - + PSI_digest_storage *from= & state->m_digest_state.m_digest_storage; + + if (from->m_byte_count > 0) + { + /* + The following columns in events_statement_current: + - DIGEST, + - DIGEST_TEXT + are computed from the digest storage. + */ + digest_copy(& pfs->m_digest_storage, from); + } + if (flag_events_statements_history) insert_events_statements_history(thread, pfs); if (flag_events_statements_history_long) === modified file 'storage/perfschema/pfs_digest.cc' --- a/storage/perfschema/pfs_digest.cc 2012-02-20 20:56:20 +0000 +++ b/storage/perfschema/pfs_digest.cc 2012-02-21 18:27:58 +0000 @@ -121,7 +121,7 @@ static uchar *digest_hash_get_key(const DBUG_ASSERT(typed_entry != NULL); digest= *typed_entry; DBUG_ASSERT(digest != NULL); - *length= 16; + *length= PFS_MD5_SIZE; result= digest->m_digest_hash.m_md5; return const_cast (reinterpret_cast (result)); } @@ -166,15 +166,17 @@ static LF_PINS* get_digest_hash_pins(PFS PFS_statements_digest_stat* find_or_create_digest(PFS_thread* thread, - PFS_digest_storage* digest_storage) + PSI_digest_storage* digest_storage) { + if (statements_digest_stat_array == NULL) + return NULL; + + if (digest_storage->m_byte_count <= 0) + return NULL; + LF_PINS *pins= get_digest_hash_pins(thread); - /* There shoulod be at least one token. */ - if(unlikely(pins == NULL) || - !(digest_storage->m_byte_count >= PFS_SIZE_OF_A_TOKEN)) - { + if (unlikely(pins == NULL)) return NULL; - } /* Compute MD5 Hash of the tokens received. */ PFS_digest_hash md5; @@ -192,7 +194,7 @@ find_or_create_digest(PFS_thread* thread /* Lookup LF_HASH using this new key. */ entry= reinterpret_cast (lf_hash_search(&digest_hash, pins, - hash_key, 16)); + hash_key, PFS_MD5_SIZE)); if(!entry) { @@ -210,17 +212,14 @@ find_or_create_digest(PFS_thread* thread /* Add a new record in digest stat array. */ pfs= &statements_digest_stat_array[digest_index]; + /* Copy digest hash/LF Hash search key. */ + memcpy(pfs->m_digest_hash.m_md5, md5.m_md5, PFS_MD5_SIZE); + /* Copy digest storage to statement_digest_stat_array so that it could be used later to generate digest text. */ - pfs->m_digest_storage.m_byte_count= digest_storage->m_byte_count; - pfs->m_digest_storage.m_full= digest_storage->m_full; - /* Copy token array. */ - memcpy(pfs->m_digest_storage.m_token_array, digest_storage->m_token_array, - PFS_MAX_DIGEST_STORAGE_SIZE); - /* Copy digest hash/LF Hash search key. */ - memcpy(pfs->m_digest_hash.m_md5, md5.m_md5, 16); + digest_copy(& pfs->m_digest_storage, digest_storage); pfs->m_first_seen= now; pfs->m_last_seen= now; @@ -270,12 +269,12 @@ void purge_digest(PFS_thread* thread, un /* Lookup LF_HASH using this new key. */ entry= reinterpret_cast (lf_hash_search(&digest_hash, pins, - hash_key, 16)); + hash_key, PFS_MD5_SIZE)); if(entry && (entry != MY_ERRPTR)) { lf_hash_delete(&digest_hash, pins, - hash_key, 16); + hash_key, PFS_MD5_SIZE); } lf_hash_search_unpin(pins); return; @@ -287,12 +286,9 @@ void PFS_statements_digest_stat::reset() if (unlikely(thread == NULL)) return; - m_digest_storage.m_byte_count= 0; - m_digest_storage.m_token_array[0]= '\0'; - m_digest_storage.m_full= false; + digest_reset(& m_digest_storage); m_stat.reset(); purge_digest(thread, m_digest_hash.m_md5); - m_digest_hash.m_md5[0]= '\0'; m_first_seen= 0; m_last_seen= 0; } @@ -320,7 +316,7 @@ void reset_esms_by_digest() /* Iterate token array and updates digest_text. */ -void get_digest_text(char* digest_text, PFS_digest_storage* digest_storage) +void get_digest_text(char* digest_text, PSI_digest_storage* digest_storage) { uint tok= 0; int current_byte= 0; @@ -332,7 +328,7 @@ void get_digest_text(char* digest_text, /* -4 is to make sure extra space for ... and a '\0' at the end. */ int available_bytes_to_write= COL_DIGEST_TEXT_SIZE - 4; - DBUG_ASSERT(byte_count <= PFS_MAX_DIGEST_STORAGE_SIZE); + DBUG_ASSERT(byte_count <= PSI_MAX_DIGEST_STORAGE_SIZE); while(current_byte < byte_count && available_bytes_to_write > 0) @@ -393,39 +389,66 @@ void get_digest_text(char* digest_text, *digest_text= '\0'; } -struct PSI_digest_locker* pfs_digest_start_v1(PSI_statement_locker *locker) +static inline uint peek_token(const PSI_digest_storage *digest, int index) { - PSI_statement_locker_state *statement_state= NULL; - PSI_digest_locker_state *state= NULL; - PFS_digest_storage *digest_storage= NULL; - - /* - If current statement is not instrumented - or if statement_digest consumer is not enabled. - */ - if(!locker || !(flag_thread_instrumentation) - || (!flag_statements_digest) - || (!statements_digest_stat_array)) + unsigned short sh; + DBUG_ASSERT(index >= 0); + DBUG_ASSERT(index + PFS_SIZE_OF_A_TOKEN <= digest->m_byte_count); + DBUG_ASSERT(digest->m_byte_count <= PSI_MAX_DIGEST_STORAGE_SIZE); + + sh= ((0x00ff & digest->m_token_array[index + 1])<<8) | (0x00ff & digest->m_token_array[index]); + return (uint) sh; +} + +/** + Function to read last two tokens from token array. If an identifier + is found, do not look for token after that. +*/ +static inline void peek_last_two_tokens(const PSI_digest_storage* digest_storage, + int last_id_index, uint *t1, uint *t2) +{ + int byte_count= digest_storage->m_byte_count; + + if (last_id_index <= byte_count - PFS_SIZE_OF_A_TOKEN) { - return NULL; + /* Take last token. */ + *t1= peek_token(digest_storage, byte_count - PFS_SIZE_OF_A_TOKEN); } + else + { + *t1= TOK_PFS_UNUSED; + } + + if(last_id_index <= byte_count - 2*PFS_SIZE_OF_A_TOKEN) + { + /* Take 2nd token from last. */ + *t2= peek_token(digest_storage, byte_count - 2 * PFS_SIZE_OF_A_TOKEN); + } + else + { + *t2= TOK_PFS_UNUSED; + } +} + + +struct PSI_digest_locker* pfs_digest_start_v1(PSI_statement_locker *locker) +{ + PSI_statement_locker_state *statement_state; statement_state= reinterpret_cast (locker); DBUG_ASSERT(statement_state != NULL); - state= &statement_state->m_digest_state; - DBUG_ASSERT(state != NULL); - - digest_storage= &state->m_digest_storage; + if (statement_state->m_discarded) + return NULL; - /* Initialize token array and token count. */ - digest_storage->m_byte_count= PFS_MAX_DIGEST_STORAGE_SIZE; - state->m_last_id_index= 0; - while(digest_storage->m_byte_count) - digest_storage->m_token_array[--digest_storage->m_byte_count]= 0; - digest_storage->m_full= false; + if (statement_state->m_flags & STATE_FLAG_DIGEST) + { + PSI_digest_locker_state *digest_state; + digest_state= &statement_state->m_digest_state; + return reinterpret_cast (digest_state); + } - return reinterpret_cast (state); + return NULL; } PSI_digest_locker* pfs_digest_add_token_v1(PSI_digest_locker *locker, @@ -433,17 +456,14 @@ PSI_digest_locker* pfs_digest_add_token_ OPAQUE_LEX_YYSTYPE *yylval) { PSI_digest_locker_state *state= NULL; - PFS_digest_storage *digest_storage= NULL; - - if(!locker) - return NULL; + PSI_digest_storage *digest_storage= NULL; state= reinterpret_cast (locker); DBUG_ASSERT(state != NULL); digest_storage= &state->m_digest_storage; - if( PFS_MAX_DIGEST_STORAGE_SIZE - digest_storage->m_byte_count < + if( PSI_MAX_DIGEST_STORAGE_SIZE - digest_storage->m_byte_count < PFS_SIZE_OF_A_TOKEN) { digest_storage->m_full= true; @@ -454,10 +474,11 @@ PSI_digest_locker* pfs_digest_add_token_ Take last_token 2 tokens collected till now. These tokens will be used in reduce for normalisation. Make sure not to consider ID tokens in reduce. */ - uint last_token = TOK_PFS_UNUSED; - uint last_token2= TOK_PFS_UNUSED; + uint last_token; + uint last_token2; - read_last_two_tokens(digest_storage, state->m_last_id_index, &last_token, &last_token2); + peek_last_two_tokens(digest_storage, state->m_last_id_index, + &last_token, &last_token2); switch (token) { @@ -514,7 +535,7 @@ PSI_digest_locker* pfs_digest_add_token_ token= TOK_PFS_ROW_SINGLE_VALUE; /* Read last two tokens again */ - read_last_two_tokens(digest_storage, state->m_last_id_index, &last_token, &last_token2); + peek_last_two_tokens(digest_storage, state->m_last_id_index, &last_token, &last_token2); if((last_token2 == TOK_PFS_ROW_SINGLE_VALUE || last_token2 == TOK_PFS_ROW_SINGLE_VALUE_LIST) && @@ -545,7 +566,7 @@ PSI_digest_locker* pfs_digest_add_token_ token= TOK_PFS_ROW_MULTIPLE_VALUE; /* Read last two tokens again */ - read_last_two_tokens(digest_storage, state->m_last_id_index, &last_token, &last_token2); + peek_last_two_tokens(digest_storage, state->m_last_id_index, &last_token, &last_token2); if((last_token2 == TOK_PFS_ROW_MULTIPLE_VALUE || last_token2 == TOK_PFS_ROW_MULTIPLE_VALUE_LIST) && === modified file 'storage/perfschema/pfs_digest.h' --- a/storage/perfschema/pfs_digest.h 2012-02-20 20:56:20 +0000 +++ b/storage/perfschema/pfs_digest.h 2012-02-21 18:27:58 +0000 @@ -25,7 +25,6 @@ #include "lf.h" #include "pfs_stat.h" -#define PFS_MAX_DIGEST_STORAGE_SIZE 1024 #define PFS_SIZE_OF_A_TOKEN 2 extern bool flag_statements_digest; @@ -34,12 +33,16 @@ extern unsigned int digest_index; extern ulong digest_max; struct PFS_thread; +/* Fixed, per MD5 hash. */ +#define PFS_MD5_SIZE 16 + /** Structure to store a MD5 hash value (digest) for a statement. */ -struct { - unsigned char m_md5[16]; - }typedef PFS_digest_hash; +struct PFS_digest_hash +{ + unsigned char m_md5[PFS_MD5_SIZE]; +}; /** A statement digest stat record. */ struct PFS_statements_digest_stat @@ -52,7 +55,7 @@ struct PFS_statements_digest_stat /** Digest Storage. */ - PFS_digest_storage m_digest_storage; + PSI_digest_storage m_digest_storage; /** Statement stat. @@ -74,9 +77,9 @@ void cleanup_digest(); int init_digest_hash(void); void cleanup_digest_hash(void); PFS_statements_digest_stat* find_or_create_digest(PFS_thread*, - PFS_digest_storage*); + PSI_digest_storage*); -void get_digest_text(char* digest_text, PFS_digest_storage*); +void get_digest_text(char* digest_text, PSI_digest_storage*); void reset_esms_by_digest(); @@ -90,13 +93,27 @@ PSI_digest_locker* pfs_digest_add_token_ uint token, OPAQUE_LEX_YYSTYPE *yylval); +static inline void digest_reset(PSI_digest_storage *digest) +{ + digest->m_full= false; + digest->m_byte_count= 0; +} + +static inline void digest_copy(PSI_digest_storage *to, const PSI_digest_storage *from) +{ + to->m_full= from->m_full; + to->m_byte_count= from->m_byte_count; + DBUG_ASSERT(to->m_byte_count <= PSI_MAX_DIGEST_STORAGE_SIZE); + memcpy(to->m_token_array, from->m_token_array, to->m_byte_count); +} + /** Function to read a single token from token array. */ inline void read_token(uint *tok, int *index, char *src) { unsigned short sh; - int remaining_bytes= PFS_MAX_DIGEST_STORAGE_SIZE - *index; + int remaining_bytes= PSI_MAX_DIGEST_STORAGE_SIZE - *index; DBUG_ASSERT(remaining_bytes >= 0); /* Make sure we have enough space to read a token from. @@ -112,12 +129,12 @@ inline void read_token(uint *tok, int *i /** Function to store a single token in token array. */ -inline void store_token(PFS_digest_storage* digest_storage, uint token) +inline void store_token(PSI_digest_storage* digest_storage, uint token) { char* dest= digest_storage->m_token_array; int* index= &digest_storage->m_byte_count; unsigned short sh= (unsigned short)token; - int remaining_bytes= PFS_MAX_DIGEST_STORAGE_SIZE - *index; + int remaining_bytes= PSI_MAX_DIGEST_STORAGE_SIZE - *index; DBUG_ASSERT(remaining_bytes >= 0); /* Make sure we have enough space to write a token to. */ @@ -137,7 +154,7 @@ inline void read_identifier(char **dest, uint available_bytes_to_write, uint offset) { uint length; - int remaining_bytes= PFS_MAX_DIGEST_STORAGE_SIZE - *index; + int remaining_bytes= PSI_MAX_DIGEST_STORAGE_SIZE - *index; DBUG_ASSERT(remaining_bytes >= 0); /* Read ID's length. @@ -164,12 +181,12 @@ inline void read_identifier(char **dest, /** Function to store an identifier in token array. */ -inline void store_identifier(PFS_digest_storage* digest_storage, +inline void store_identifier(PSI_digest_storage* digest_storage, uint id_length, char *id_name) { char* dest= digest_storage->m_token_array; int* index= &digest_storage->m_byte_count; - int remaining_bytes= PFS_MAX_DIGEST_STORAGE_SIZE - *index; + int remaining_bytes= PSI_MAX_DIGEST_STORAGE_SIZE - *index; DBUG_ASSERT(remaining_bytes >= 0); /* @@ -189,30 +206,4 @@ inline void store_identifier(PFS_digest_ } } -/** - Function to read last two tokens from token array. If an identifier - is found, do not look for token after that. -*/ -inline void read_last_two_tokens(PFS_digest_storage* digest_storage, - int last_id_index, uint *t1, uint *t2) -{ - int last_token_index; - int byte_count= digest_storage->m_byte_count; - - if(last_id_index <= byte_count - PFS_SIZE_OF_A_TOKEN) - { - /* Take last token. */ - last_token_index= byte_count - PFS_SIZE_OF_A_TOKEN; - DBUG_ASSERT(last_token_index >= 0); - read_token(t1, &last_token_index, digest_storage->m_token_array); - } - if(last_id_index <= byte_count - 2*PFS_SIZE_OF_A_TOKEN) - { - /* Take 2nd token from last. */ - last_token_index= byte_count - 2*PFS_SIZE_OF_A_TOKEN; - DBUG_ASSERT(last_token_index >= 0); - read_token(t2, &last_token_index, digest_storage->m_token_array); - } -} - #endif === modified file 'storage/perfschema/pfs_events_statements.h' --- a/storage/perfschema/pfs_events_statements.h 2012-02-10 12:55:57 +0000 +++ b/storage/perfschema/pfs_events_statements.h 2012-02-21 18:27:58 +0000 @@ -88,8 +88,8 @@ struct PFS_events_statements : public PF ulonglong m_no_index_used; /** Optimizer metric, number of 'no good index used'. */ ulonglong m_no_good_index_used; - /** statement digest stat */ - struct PFS_statements_digest_stat* m_statement_digest_stat_ptr; + /** Statement digest. */ + PSI_digest_storage m_digest_storage; }; void insert_events_statements_history(PFS_thread *thread, PFS_events_statements *statement); === modified file 'storage/perfschema/pfs_events_waits.h' --- a/storage/perfschema/pfs_events_waits.h 2011-08-11 03:11:58 +0000 +++ b/storage/perfschema/pfs_events_waits.h 2012-02-21 18:27:58 +0000 @@ -96,6 +96,15 @@ struct PFS_events_waits : public PFS_eve ulong m_flags; }; +/** TIMED bit in the state flags bitfield. */ +#define STATE_FLAG_TIMED (1<<0) +/** THREAD bit in the state flags bitfield. */ +#define STATE_FLAG_THREAD (1<<1) +/** EVENT bit in the state flags bitfield. */ +#define STATE_FLAG_EVENT (1<<2) +/** DIGEST bit in the state flags bitfield. */ +#define STATE_FLAG_DIGEST (1<<3) + void insert_events_waits_history(PFS_thread *thread, PFS_events_waits *wait); void insert_events_waits_history_long(PFS_events_waits *wait); === modified file 'storage/perfschema/table_events_statements.cc' --- a/storage/perfschema/table_events_statements.cc 2012-02-10 23:14:57 +0000 +++ b/storage/perfschema/table_events_statements.cc 2012-02-21 18:27:58 +0000 @@ -27,6 +27,7 @@ #include "pfs_timer.h" #include "sp_head.h" /* TYPE_ENUM_FUNCTION, ... */ #include "table_helper.h" +#include "my_md5.h" THR_LOCK table_events_statements_current::m_table_lock; @@ -368,16 +369,21 @@ void table_events_statements_common::mak /* Filling up statement digest information. */ - PFS_statements_digest_stat *pfs= statement->m_statement_digest_stat_ptr; - if(pfs && pfs->m_digest_storage.m_byte_count != 0) + PSI_digest_storage *digest= & statement->m_digest_storage; + if (digest->m_byte_count > 0) { - /* Generate the DIGEST text string from the MD5 digest */ - MD5_HASH_TO_STRING(pfs->m_digest_hash.m_md5, + PFS_digest_hash md5; + compute_md5_hash((char*) md5.m_md5, + digest->m_token_array, + digest->m_byte_count); + + /* Generate the DIGEST string from the MD5 digest */ + MD5_HASH_TO_STRING(md5.m_md5, m_row.m_digest.m_digest); - m_row.m_digest.m_digest_length= 16; + m_row.m_digest.m_digest_length= MD5_HASH_TO_STRING_LENGTH; /* Generate the DIGEST_TEXT string from the token array */ - get_digest_text(m_row.m_digest.m_digest_text, &pfs->m_digest_storage); + get_digest_text(m_row.m_digest.m_digest_text, digest); m_row.m_digest.m_digest_text_length= strlen(m_row.m_digest.m_digest_text); } else === modified file 'storage/perfschema/table_helper.cc' --- a/storage/perfschema/table_helper.cc 2012-02-06 12:08:15 +0000 +++ b/storage/perfschema/table_helper.cc 2012-02-21 18:27:58 +0000 @@ -115,7 +115,7 @@ int PFS_digest_row::make_row(PFS_stateme DIGEST in this row. */ MD5_HASH_TO_STRING(pfs->m_digest_hash.m_md5, m_digest); - m_digest_length= 16; + m_digest_length= MD5_HASH_TO_STRING_LENGTH; /* Caclulate digest_text information from the token array collected === modified file 'storage/perfschema/table_helper.h' --- a/storage/perfschema/table_helper.h 2011-11-23 12:56:12 +0000 +++ b/storage/perfschema/table_helper.h 2012-02-21 18:27:58 +0000 @@ -23,11 +23,11 @@ #include "pfs_instr_class.h" #include "pfs_digest.h" +/* + Write MD5 hash value in a string to be used + as DIGEST for the statement. +*/ #define MD5_HASH_TO_STRING(_hash, _str) \ - /* - Write MD5 hash value in a string to be used - as DIGEST for the statement. - */ \ sprintf(_str, "%02x%02x%02x%02x%02x%02x%02x%02x" \ "%02x%02x%02x%02x%02x%02x%02x%02x", \ _hash[0], _hash[1], _hash[2], _hash[3], \ @@ -35,6 +35,8 @@ _hash[8], _hash[9], _hash[10], _hash[11], \ _hash[12], _hash[13], _hash[14], _hash[15]) +#define MD5_HASH_TO_STRING_LENGTH 32 + struct PFS_host; struct PFS_user; struct PFS_account; No bundle (reason: useless for push emails).