From: Christopher Powers Date: August 9 2011 11:43pm Subject: bzr push into mysql-trunk branch (chris.powers:3355 to 3358) WL#4896 List-Archive: http://lists.mysql.com/commits/140554 Message-Id: <201108092343.p79NhWWO008083@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3358 Christopher Powers 2011-08-09 WL#4896 "Performance Schema Net IO" Error formatting output changes for socket_summary_by_instance modified: mysql-test/suite/perfschema/include/socket_summary_check.inc mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 3357 Christopher Powers 2011-08-09 WL#4896 "Performance Schema Net IO" - Format error output in socket_summary_by_instance_func.test modified: mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 3356 Christopher Powers 2011-08-09 WL#4896 "Performance Schema Net IO" socket_summary_by_instance_func.test: - Relax non-zero op count constraint for MISC socket operations. - Disable abort on errors for easier PB debugging modified: include/mysql.h.pp include/mysql/psi/psi_abi_v1.h.pp mysql-test/suite/perfschema/include/socket_summary_check.inc mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 3355 Christopher Powers 2011-08-09 [merge] local merge modified: mysql-test/suite/perfschema/include/socket_summary_check.inc* === modified file 'include/mysql.h.pp' --- a/include/mysql.h.pp 2011-05-31 13:52:09 +0000 +++ b/include/mysql.h.pp 2011-08-09 22:48:26 +0000 @@ -27,7 +27,7 @@ typedef struct st_net { unsigned int *return_status; unsigned char reading_or_writing; char save_char; - my_bool unused1; + my_bool mysql_socket_idle; my_bool unused2; my_bool compress; my_bool unused3; === modified file 'include/mysql/psi/psi.h' --- a/include/mysql/psi/psi.h 2011-08-05 00:20:04 +0000 +++ b/include/mysql/psi/psi.h 2011-08-09 19:09:51 +0000 @@ -953,9 +953,6 @@ struct PSI_socket_locker_state_v1 int m_src_line; /** Internal data. */ void *m_wait; - /** True if socket state is IDLE. */ - my_bool m_idle; - }; /* Using typedef to make reuse between PSI_v1 and PSI_v2 easier later. */ === modified file 'include/mysql/psi/psi_abi_v1.h.pp' --- a/include/mysql/psi/psi_abi_v1.h.pp 2011-08-05 16:12:52 +0000 +++ b/include/mysql/psi/psi_abi_v1.h.pp 2011-08-09 22:48:26 +0000 @@ -248,7 +248,6 @@ struct PSI_socket_locker_state_v1 const char* m_src_file; int m_src_line; void *m_wait; - my_bool m_idle; }; typedef void (*register_mutex_v1_t) (const char *category, struct PSI_mutex_info_v1 *info, int count); === modified file 'include/mysql_com.h' --- a/include/mysql_com.h 2011-06-30 15:50:45 +0000 +++ b/include/mysql_com.h 2011-08-09 19:09:51 +0000 @@ -302,7 +302,7 @@ typedef struct st_net { unsigned int *return_status; unsigned char reading_or_writing; char save_char; - my_bool unused1; /* Please remove with the next incompatible ABI change. */ + my_bool mysql_socket_idle; /* Perfschema: True when socket state is IDLE */ my_bool unused2; /* Please remove with the next incompatible ABI change */ my_bool compress; my_bool unused3; /* Please remove with the next incompatible ABI change. */ === modified file 'mysql-test/suite/perfschema/include/socket_summary_check.inc' --- a/mysql-test/suite/perfschema/include/socket_summary_check.inc 2011-08-06 17:22:25 +0000 +++ b/mysql-test/suite/perfschema/include/socket_summary_check.inc 2011-08-09 23:42:16 +0000 @@ -66,7 +66,7 @@ if(`SELECT COUNT(*) $part1`) SELECT 'not in socket_instances' AS state, EVENT_NAME, OBJECT_INSTANCE_BEGIN $part1; --echo # abort 1 - exit; +# exit; } --vertical_results @@ -76,7 +76,7 @@ if(`SELECT COUNT(*) $part1`) # # If we run this check sufficient frequent than AVG_TIMER_* can be removed from other checks. #----------------------------------------------------------------------------------------------- -let $my_lo= 0.90; +let $my_lo= 0.99; let $my_hi= 1.01; let $my_rules= @@ -103,8 +103,15 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; + + -- echo # Debug 2a: Dump socket_summary_by_instance + eval + SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN, + $part + FROM performance_schema.socket_summary_by_instance + ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; --echo # abort 2 - exit; +# exit; } @@ -144,7 +151,7 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; --echo # abort 3 - exit; +# exit; } @@ -179,7 +186,7 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; --echo # abort 4 - exit; +# exit; } @@ -210,7 +217,7 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; --echo # abort 5 - exit; +# exit; } @@ -241,7 +248,7 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; --echo # abort 6 - exit; +# exit; } --horizontal_results === modified file 'mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test' --- a/mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 2011-08-02 20:00:18 +0000 +++ b/mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 2011-08-09 23:42:16 +0000 @@ -77,17 +77,29 @@ if($my_socket_debug) # cause that the test needs maintenance. # Advantage: # More thorough checks. +# let $print_details= 0; + # # Number of attempts within the test checking the stability of counter increments. +# let $loop_rounds= 3; + # # Additional SCHEMA used for # - detection of our "worker" session within the PROCESSLIST. # No other connection should use this schema as default schema. # - easy cleanup because auxiliary objects are stored there +# CREATE SCHEMA mysqltest; CREATE SCHEMA mysqlsupertest; + +# +# Clear summary tables of previous entries +# +TRUNCATE performance_schema.socket_summary_by_instance; +TRUNCATE performance_schema.socket_summary_by_event_name; + # # Auxiliary tables for storing current values at certain points of time. # We store states of performance_schema.socket_summary_by_instance here @@ -96,9 +108,11 @@ CREATE SCHEMA mysqlsupertest; # - to minimize the impact of statements used for the checks on results. # CREATE TEMPORARY TABLE my_socket_summary_by_instance AS # would be nice but the optimizer does not support important statements. +# CREATE TABLE mysqltest.my_socket_summary_by_instance AS SELECT *, 'Pseudo_Before' AS pk FROM performance_schema.socket_summary_by_instance WHERE 1 = 0; + CREATE TABLE mysqltest.socket_summary_by_instance_detail AS SELECT EVENT_NAME,OBJECT_INSTANCE_BEGIN, COUNT_READ, SUM_TIMER_READ, SUM_NUMBER_OF_BYTES_READ, @@ -106,27 +120,34 @@ SELECT EVENT_NAME,OBJECT_INSTANCE_BEGIN, COUNT_MISC, SUM_TIMER_MISC FROM performance_schema.socket_summary_by_instance WHERE 1 = 2; + ALTER TABLE mysqltest.socket_summary_by_instance_detail ADD statement VARCHAR(300), ADD run INTEGER; + # # Auxiliary SQL functions used to shorten some commands. +# CREATE FUNCTION mysqltest.min_of_triple (f1 BIGINT UNSIGNED, f2 BIGINT UNSIGNED, f3 BIGINT UNSIGNED) RETURNS BIGINT UNSIGNED RETURN IF(IF(f1 < f2,f1,f2) < f3,IF(f1 < f2,f1,f2), f3); + CREATE FUNCTION mysqltest.max_of_triple (f1 BIGINT UNSIGNED, f2 BIGINT UNSIGNED, f3 BIGINT UNSIGNED) RETURNS BIGINT UNSIGNED RETURN IF(IF(f1 > f2,f1,f2) > f3,IF(f1 > f2,f1,f2), f3); # # Auxiliary table for experiments with SELECTs earning different result sets. +# CREATE TABLE mysqltest.my_aux (col1 INTEGER, col2 VARCHAR(1024), PRIMARY KEY(col1)); INSERT INTO mysqltest.my_aux SET col1 = 1, col2 = REPEAT('a',0); INSERT INTO mysqltest.my_aux SET col1 = 2, col2 = REPEAT('a',1); INSERT INTO mysqltest.my_aux SET col1 = 3, col2 = REPEAT('a',1024); + # # Auxiliary mysqltest variables used to shorten commands and to ensure # that we run all time the right operation. +# let $truncate= TRUNCATE TABLE mysqltest.my_socket_summary_by_instance; # @@ -348,7 +369,8 @@ AND AND ((COUNT_MISC = 0 AND SUM_TIMER_MISC = 0) OR - (COUNT_MISC > 0 AND SUM_TIMER_MISC > 0)); + (COUNT_MISC > 0)); +#(COUNT_MISC > 0 AND SUM_TIMER_MISC > 0)); if(`SELECT COUNT(*) FROM mysqltest.socket_summary_by_instance_detail WHERE NOT ( $my_rules )`) @@ -360,9 +382,14 @@ if(`SELECT COUNT(*) FROM mysqltest.socke --echo # $my_rules --echo # eval - SELECT * - FROM mysqltest.socket_summary_by_instance_detail - ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; + SELECT EVENT_NAME, lpad(OBJECT_INSTANCE_BEGIN,20,' ') as OBJECT_INSTANCE, + lpad(COUNT_READ,7, ' ') as CREAD, lpad(SUM_TIMER_READ,12,' ') as TREAD, lpad(SUM_NUMBER_OF_BYTES_READ,7,' ') as BREAD, + lpad(COUNT_WRITE,7, ' ') as CWRITE, lpad(SUM_TIMER_WRITE,12,' ') as TWRITE,lpad(SUM_NUMBER_OF_BYTES_WRITE,7,' ') as BWRITE, + lpad(COUNT_MISC,7,' ') as CMISC, lpad(SUM_TIMER_MISC,13,' ') as TMISC, + rpad(statement,50,' ') as STATEMENT, lpad(run, 5, ' ') as RUN + FROM mysqltest.socket_summary_by_instance_detail order by EVENT_NAME, OBJECT_INSTANCE_BEGIN; + + } --echo # 4.2 Results must be stable --echo # Everything except "client_connection" for default connection @@ -429,21 +456,22 @@ if(`SELECT COUNT(statement) $part`) AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin ORDER BY EVENT_NAME, statement, run; - --echo CWP Debug 1 - Dump mysqltest.socket_summary_by_instance_detail - SELECT EVENT_NAME, lpad(OBJECT_INSTANCE_BEGIN,20,' ') as OBJECT_INSTANCE, lpad(COUNT_READ,5,' ') as CREAD, lpad(sum_timer_read,12,' ') as TREAD, - lpad(sum_number_of_bytes_read, 7,' ') as BREAD, lpad(count_write,7,' ') as CWRITE, lpad(sum_timer_write,12,' ') as TWRITE, - lpad(sum_number_of_bytes_write,7,' ') as BWRITE, lpad(count_misc,7,' ') as CMISC, lpad(sum_timer_misc,13,' ') as TMISC, + --echo Debug 4.2a - Dump mysqltest.socket_summary_by_instance_detail + SELECT EVENT_NAME, lpad(OBJECT_INSTANCE_BEGIN,20,' ') as OBJECT_INSTANCE, + lpad(COUNT_READ,7, ' ') as CREAD, lpad(SUM_TIMER_READ,12,' ') as TREAD, lpad(SUM_NUMBER_OF_BYTES_READ,7,' ') as BREAD, + lpad(COUNT_WRITE,7, ' ') as CWRITE, lpad(SUM_TIMER_WRITE,12,' ') as TWRITE,lpad(SUM_NUMBER_OF_BYTES_WRITE,7,' ') as BWRITE, + lpad(COUNT_MISC,7,' ') as CMISC, lpad(SUM_TIMER_MISC,13,' ') as TMISC, rpad(statement,50,' ') as STATEMENT, lpad(run, 5, ' ') as RUN FROM mysqltest.socket_summary_by_instance_detail order by EVENT_NAME, statement, run; - --echo CWP Debug 2 - Std dev and coefficient of variation for mysqltest.socket_summary_by_instance_detail - select rpad(event_name,39,' ') as EVENT_NAME1, rpad(statement,49,' ') as STATEMENT1, - lpad(count(count_read), 5,' ') as COUNT_READ, - lpad(std(count_read)/avg(count_read),10,' ') as CV_COUNT_READ, - lpad(std(sum_number_of_bytes_read)/avg(sum_number_of_bytes_read),10,' ') as CV_BYTES_READ, - lpad(std(count_write)/avg(count_write),10,' ') as CV_COUNT_WRITE, - lpad(std(sum_number_of_bytes_write)/avg(sum_number_of_bytes_write),10,' ') as CV_BYTES_WRITE, - lpad(std(count_misc)/avg(count_misc),10,' ') as CV_COUNT_MISC + --echo Debug 4.2b - Std dev and coefficient of variation for mysqltest.socket_summary_by_instance_detail + select rpad(EVENT_NAME,39,' ') as EVENT_NAME1, rpad(statement,49,' ') as STATEMENT1, + lpad(count(COUNT_READ),5,' ') as COUNT_READ, + lpad(std(COUNT_READ)/avg(COUNT_READ),10,' ') as CV_COUNT_READ, + lpad(std(SUM_NUMBER_OF_BYTES_READ)/avg(SUM_NUMBER_OF_BYTES_READ),10,' ') as CV_BYTES_READ, + lpad(std(COUNT_WRITE)/avg(COUNT_WRITE),10,' ') as CV_COUNT_WRITE, + lpad(std(SUM_NUMBER_OF_BYTES_WRITE)/avg(SUM_NUMBER_OF_BYTES_WRITE),10,' ') as CV_BYTES_WRITE, + lpad(std(COUNT_MISC)/avg(COUNT_MISC),10,' ') as CV_COUNT_MISC from mysqltest.socket_summary_by_instance_detail WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin group by EVENT_NAME1, STATEMENT1; === modified file 'sql/net_serv.cc' --- a/sql/net_serv.cc 2011-08-05 00:20:04 +0000 +++ b/sql/net_serv.cc 2011-08-09 19:09:51 +0000 @@ -44,6 +44,7 @@ #include #include #include "probes_mysql.h" +#include "mysql/psi/mysql_idle.h" #ifdef EMBEDDED_LIBRARY #undef MYSQL_SERVER @@ -103,6 +104,7 @@ my_bool my_net_init(NET *net, Vio* vio) net->where_b = net->remain_in_buf=0; net->last_errno=0; net->unused= 0; + net->mysql_socket_idle= FALSE; if (vio) { @@ -711,12 +713,36 @@ static my_bool net_read_packet_header(NE { uchar pkt_nr; size_t count= NET_HEADER_SIZE; + MYSQL_IDLE_WAIT_VARIABLES(idle_locker, idle_state) /* no ; */ if (net->compress) count+= COMP_HEADER_SIZE; - if (net_read_raw_loop(net, count)) - return TRUE; + /* + If the server is IDLE, waiting for the next command: + - do not time the wait on the socket + - time the wait as IDLE server time instead. + */ + #ifdef HAVE_PSI_INTERFACE + if (net->mysql_socket_idle) + { + mysql_socket_set_state(net->vio->mysql_socket, PSI_SOCKET_STATE_IDLE); + MYSQL_START_IDLE_WAIT(idle_locker, &idle_state); + + my_bool rc= net_read_raw_loop(net, count); + + MYSQL_END_IDLE_WAIT(idle_locker); + mysql_socket_set_state(net->vio->mysql_socket, PSI_SOCKET_STATE_ACTIVE); + + if (rc) + return TRUE; + } + else + #endif + { + if (net_read_raw_loop(net, count)) + return TRUE; + } DBUG_DUMP("packet_header", net->buff + net->where_b, NET_HEADER_SIZE); === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2011-08-05 23:59:49 +0000 +++ b/sql/sql_parse.cc 2011-08-09 19:09:51 +0000 @@ -96,7 +96,6 @@ #include "mysql/psi/mysql_statement.h" #include "sql_bootstrap.h" #include "opt_explain.h" -#include "mysql/psi/mysql_idle.h" #define FLAGSTR(V,F) ((V)&(F)?#F" ":"") @@ -805,7 +804,6 @@ bool do_command(THD *thd) ulong packet_length; NET *net= &thd->net; enum enum_server_command command; - //MYSQL_IDLE_WAIT_VARIABLES(idle_locker, idle_state) /* no ; */ DBUG_ENTER("do_command"); @@ -848,18 +846,15 @@ bool do_command(THD *thd) */ DEBUG_SYNC(thd, "before_do_command_net_read"); - /* - The server is now IDLE, waiting for the next command: - - do not time the wait on the socket - - time the wait as IDLE server time instead. - */ - //mysql_socket_set_state(net->vio->mysql_socket, PSI_SOCKET_STATE_IDLE); - //MYSQL_START_IDLE_WAIT(idle_locker, &idle_state); + #ifdef HAVE_PSI_INTERFACE + net->mysql_socket_idle= TRUE; + #endif packet_length= my_net_read(net); - //MYSQL_END_IDLE_WAIT(idle_locker); - //mysql_socket_set_state(net->vio->mysql_socket, PSI_SOCKET_STATE_ACTIVE); + #ifdef HAVE_PSI_INTERFACE + net->mysql_socket_idle= FALSE; + #endif if (packet_length == packet_error) { === modified file 'storage/perfschema/pfs.cc' --- a/storage/perfschema/pfs.cc 2011-08-05 20:16:40 +0000 +++ b/storage/perfschema/pfs.cc 2011-08-09 19:09:51 +0000 @@ -2894,7 +2894,6 @@ get_thread_socket_locker_v1(PSI_socket_l state->m_flags= flags; state->m_socket= socket; state->m_operation= op; - state->m_idle= pfs_socket->m_idle; return reinterpret_cast (state); } @@ -4581,11 +4580,13 @@ static void start_socket_wait_v1(PSI_soc { PSI_socket_locker_state *state= reinterpret_cast (locker); DBUG_ASSERT(state != NULL); + PFS_socket *socket= reinterpret_cast(state->m_socket); + DBUG_ASSERT(socket != NULL); register uint flags= state->m_flags; ulonglong timer_start= 0; - if (flags & STATE_FLAG_TIMED && !state->m_idle) + if (flags & STATE_FLAG_TIMED && !socket->m_idle) { timer_start= get_timer_raw_value_and_function(wait_timer, &state->m_timer); state->m_timer_start= timer_start; @@ -4617,7 +4618,6 @@ static void end_socket_wait_v1(PSI_socke ulonglong timer_end= 0; ulonglong wait_time= 0; bool socket_closed= false; - bool socket_idle= state->m_idle; PFS_byte_stat *byte_stat; register uint flags= state->m_flags; size_t bytes= ((int)byte_count > -1 ? byte_count : 0); @@ -4662,7 +4662,7 @@ static void end_socket_wait_v1(PSI_socke /** Aggregation for EVENTS_WAITS_SUMMARY_BY_INSTANCE */ if (flags & STATE_FLAG_TIMED) { - if (!socket_idle) + if (!socket->m_idle) { timer_end= state->m_timer(); wait_time= timer_end - state->m_timer_start; @@ -4670,13 +4670,12 @@ static void end_socket_wait_v1(PSI_socke else { /* - A state of IDLE means that this is a RECV operation following a (possibly - very long) idle period. The split between the idle time and the RECV is - unknown, so the entire wait time will be later assigned to the global - IDLE class. Incrementing the RECV count with a zero wait time will throw - off the stats, so assign the current min wait as a best guess. + If idle, then this was a RECV operation that blocked on the socket for an + indeterminate time waiting for data, so the wait time will later be + recorded as an IDLE event. The duration of the actual RECV is unknown and + is therefore set to zero. */ - wait_time= byte_stat->m_min; + wait_time= 0; } /* Aggregate to the socket instrument for now (timed) */ @@ -4734,10 +4733,6 @@ static void end_socket_wait_v1(PSI_socke } } - /* Clear IDLE state */ - if (socket_idle) - socket->m_idle= false; - /* This socket will no longer be used */ if (socket_closed) destroy_socket(socket); === modified file 'storage/perfschema/pfs_instr.cc' --- a/storage/perfschema/pfs_instr.cc 2011-08-05 00:20:04 +0000 +++ b/storage/perfschema/pfs_instr.cc 2011-08-09 19:09:51 +0000 @@ -1414,8 +1414,8 @@ PFS_socket* create_socket(PFS_socket_cla pfs->m_fd= fd; pfs->m_identity= pfs; pfs->m_class= klass; - pfs->m_enabled= klass->m_enabled && flag_global_instrumentation; - pfs->m_timed= klass->m_timed; + pfs->m_enabled= klass->m_enabled && flag_global_instrumentation; + pfs->m_timed= klass->m_timed; pfs->m_idle= false; pfs->m_socket_stat.reset(); pfs->m_lock.dirty_to_allocated(); === modified file 'storage/perfschema/table_events_waits.cc' --- a/storage/perfschema/table_events_waits.cc 2011-07-25 03:34:01 +0000 +++ b/storage/perfschema/table_events_waits.cc 2011-08-09 19:26:45 +0000 @@ -686,7 +686,11 @@ int table_events_waits_common::read_row_ case 16: /* NUMBER_OF_BYTES */ if ((m_row.m_operation == OPERATION_TYPE_FILEREAD) || (m_row.m_operation == OPERATION_TYPE_FILEWRITE) || - (m_row.m_operation == OPERATION_TYPE_FILECHSIZE)) + (m_row.m_operation == OPERATION_TYPE_FILECHSIZE) || + (m_row.m_operation == OPERATION_TYPE_SOCKETSEND) || + (m_row.m_operation == OPERATION_TYPE_SOCKETRECV) || + (m_row.m_operation == OPERATION_TYPE_SOCKETSENDTO) || + (m_row.m_operation == OPERATION_TYPE_SOCKETRECVFROM)) set_field_ulonglong(f, m_row.m_number_of_bytes); else f->set_null(); === modified file 'storage/perfschema/table_helper.h' --- a/storage/perfschema/table_helper.h 2011-04-19 19:46:36 +0000 +++ b/storage/perfschema/table_helper.h 2011-08-09 21:46:19 +0000 @@ -373,15 +373,24 @@ struct PFS_socket_io_stat_row inline void set(time_normalizer *normalizer, const PFS_socket_io_stat *stat) { PFS_byte_stat all; + PFS_byte_stat read= stat->m_read; + PFS_byte_stat write= stat->m_write; + PFS_byte_stat misc= stat->m_misc; - m_read.set(normalizer, &stat->m_read); - m_write.set(normalizer, &stat->m_write); - m_misc.set(normalizer, &stat->m_misc); + m_read.set(normalizer, &read); + m_write.set(normalizer, &write); + m_misc.set(normalizer, &misc); + //m_read.set(normalizer, &stat->m_read); + //m_write.set(normalizer, &stat->m_write); + //m_misc.set(normalizer, &stat->m_misc); /* Combine stats for all operations */ - all.aggregate(&stat->m_read); - all.aggregate(&stat->m_write); - all.aggregate(&stat->m_misc); + all.aggregate(&read); + all.aggregate(&write); + all.aggregate(&misc); + //all.aggregate(&stat->m_read); + //all.aggregate(&stat->m_write); + //all.aggregate(&stat->m_misc); m_all.set(normalizer, &all); } No bundle (reason: useless for push emails).