From: Marc Alff Date: November 12 2010 6:23am Subject: bzr commit into mysql-5.5-bugteam branch (marc.alff:3120) Bug#58052 List-Archive: http://lists.mysql.com/commits/123684 X-Bug: 58052 Message-Id: <201011120624.oAC6OE7M003834@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4736532272543076417==" --===============4736532272543076417== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/malff/BZR_TREE/mysql-5.5-bugteam-58052/ based on revid:svoj@stripped 3120 Marc Alff 2010-11-12 Bug#58052 Binary log IO not being accounted for properly Before this fix, file io for the binary log file was not accounted properly, and showed no io at all. This bug was due to the following issues: 1) file io for the binlog was instrumented: - sometime as "wait/io/file/sql/binlog" - sometime as "wait/io/file/sql/MYSQL_LOG" leading to inconsistent event_names. 2) the binlog file itself was using an IO_CACHE, but the IO_CACHE implementation in mysys/mf_iocache.c was not instrumented to make performance schema calls to record file io. 3) The "wait/io/file/sql/MYSQL_LOG" instrumentation was used for several log files, such as: - the binary log - the slow log - the query log which caused file io in these different log files to be accounted against the same instrument. The instrumentation needs to have a finer grain and report io in different event_names, because each file really serves a different purpose. With this fix: - the IO_CACHE implementation is now instrumented - the "wait/io/file/sql/MYSQL_LOG" instrument has been removed - binlog io is now always instrumented with "wait/io/file/sql/binlog" - the slow log is instrumented with a new name, "wait/io/file/sql/slow_log" - the query log is instrumented with a new name, "wait/io/file/sql/query_log" modified: mysys/mf_iocache.c sql/log.cc sql/log.h sql/mysqld.cc sql/mysqld.h === modified file 'mysys/mf_iocache.c' --- a/mysys/mf_iocache.c 2010-07-29 12:32:11 +0000 +++ b/mysys/mf_iocache.c 2010-11-12 06:23:26 +0000 @@ -173,7 +173,7 @@ int init_io_cache(IO_CACHE *info, File f if (file >= 0) { - pos= my_tell(file, MYF(0)); + pos= mysql_file_tell(file, MYF(0)); if ((pos == (my_off_t) -1) && (my_errno == ESPIPE)) { /* @@ -205,7 +205,7 @@ int init_io_cache(IO_CACHE *info, File f if (!(cache_myflags & MY_DONT_CHECK_FILESIZE)) { /* Calculate end of file to avoid allocating oversized buffers */ - end_of_file=my_seek(file,0L,MY_SEEK_END,MYF(0)); + end_of_file= mysql_file_seek(file, 0L, MY_SEEK_END, MYF(0)); /* Need to reset seek_not_done now that we just did a seek. */ info->seek_not_done= end_of_file == seek_offset ? 0 : 1; if (end_of_file < seek_offset) @@ -485,7 +485,7 @@ int _my_b_read(register IO_CACHE *info, */ if (info->seek_not_done) { - if ((my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) + if ((mysql_file_seek(info->file, pos_in_file, MY_SEEK_SET, MYF(0)) != MY_FILEPOS_ERROR)) { /* No error, reset seek_not_done flag. */ @@ -529,7 +529,7 @@ int _my_b_read(register IO_CACHE *info, end aligned with a block. */ length=(Count & (size_t) ~(IO_SIZE-1))-diff_length; - if ((read_length= my_read(info->file,Buffer, length, info->myflags)) + if ((read_length= mysql_file_read(info->file,Buffer, length, info->myflags)) != length) { /* @@ -572,7 +572,7 @@ int _my_b_read(register IO_CACHE *info, } length=0; /* Didn't read any chars */ } - else if ((length= my_read(info->file,info->buffer, max_length, + else if ((length= mysql_file_read(info->file,info->buffer, max_length, info->myflags)) < Count || length == (size_t) -1) { @@ -1056,7 +1056,7 @@ int _my_b_read_r(register IO_CACHE *cach */ if (cache->seek_not_done) { - if (my_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0)) + if (mysql_file_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) { cache->error= -1; @@ -1064,7 +1064,7 @@ int _my_b_read_r(register IO_CACHE *cach DBUG_RETURN(1); } } - len= my_read(cache->file, cache->buffer, length, cache->myflags); + len= mysql_file_read(cache->file, cache->buffer, length, cache->myflags); } DBUG_PRINT("io_cache_share", ("read %lu bytes", (ulong) len)); @@ -1203,7 +1203,7 @@ int _my_b_seq_read(register IO_CACHE *in With read-append cache we must always do a seek before we read, because the write could have moved the file pointer astray */ - if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) == MY_FILEPOS_ERROR) + if (mysql_file_seek(info->file, pos_in_file, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) { info->error= -1; unlock_append_buffer(info); @@ -1220,8 +1220,8 @@ int _my_b_seq_read(register IO_CACHE *in size_t read_length; length=(Count & (size_t) ~(IO_SIZE-1))-diff_length; - if ((read_length= my_read(info->file,Buffer, length, - info->myflags)) == (size_t) -1) + if ((read_length= mysql_file_read(info->file,Buffer, length, + info->myflags)) == (size_t) -1) { info->error= -1; unlock_append_buffer(info); @@ -1254,7 +1254,7 @@ int _my_b_seq_read(register IO_CACHE *in } else { - length= my_read(info->file,info->buffer, max_length, info->myflags); + length= mysql_file_read(info->file,info->buffer, max_length, info->myflags); if (length == (size_t) -1) { info->error= -1; @@ -1431,7 +1431,7 @@ int _my_b_async_read(register IO_CACHE * return 1; } - if (my_seek(info->file,next_pos_in_file,MY_SEEK_SET,MYF(0)) + if (mysql_file_seek(info->file, next_pos_in_file, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) { info->error= -1; @@ -1441,8 +1441,8 @@ int _my_b_async_read(register IO_CACHE * read_length=IO_SIZE*2- (size_t) (next_pos_in_file & (IO_SIZE-1)); if (Count < read_length) { /* Small block, read to cache */ - if ((read_length=my_read(info->file,info->request_pos, - read_length, info->myflags)) == (size_t) -1) + if ((read_length=mysql_file_read(info->file,info->request_pos, + read_length, info->myflags)) == (size_t) -1) return info->error= -1; use_length=min(Count,read_length); memcpy(Buffer,info->request_pos,(size_t) use_length); @@ -1462,7 +1462,7 @@ int _my_b_async_read(register IO_CACHE * } else { /* Big block, don't cache it */ - if ((read_length= my_read(info->file,Buffer, Count,info->myflags)) + if ((read_length= mysql_file_read(info->file, Buffer, Count,info->myflags)) != Count) { info->error= read_length == (size_t) -1 ? -1 : read_length+left_length; @@ -1569,14 +1569,14 @@ int _my_b_write(register IO_CACHE *info, "seek_not_done" to indicate this to other functions operating on the IO_CACHE. */ - if (my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0))) + if (mysql_file_seek(info->file, info->pos_in_file, MY_SEEK_SET, MYF(0))) { info->error= -1; return (1); } info->seek_not_done=0; } - if (my_write(info->file, Buffer, length, info->myflags | MY_NABP)) + if (mysql_file_write(info->file, Buffer, length, info->myflags | MY_NABP)) return info->error= -1; #ifdef THREAD @@ -1639,7 +1639,7 @@ int my_b_append(register IO_CACHE *info, if (Count >= IO_SIZE) { /* Fill first intern buffer */ length=Count & (size_t) ~(IO_SIZE-1); - if (my_write(info->file,Buffer, length, info->myflags | MY_NABP)) + if (mysql_file_write(info->file,Buffer, length, info->myflags | MY_NABP)) { unlock_append_buffer(info); return info->error= -1; @@ -1695,11 +1695,11 @@ int my_block_write(register IO_CACHE *in { /* Of no overlap, write everything without buffering */ if (pos + Count <= info->pos_in_file) - return my_pwrite(info->file, Buffer, Count, pos, - info->myflags | MY_NABP); + return mysql_file_pwrite(info->file, Buffer, Count, pos, + info->myflags | MY_NABP); /* Write the part of the block that is before buffer */ length= (uint) (info->pos_in_file - pos); - if (my_pwrite(info->file, Buffer, length, pos, info->myflags | MY_NABP)) + if (mysql_file_pwrite(info->file, Buffer, length, pos, info->myflags | MY_NABP)) info->error= error= -1; Buffer+=length; pos+= length; @@ -1789,7 +1789,7 @@ int my_b_flush_io_cache(IO_CACHE *info, */ if (!append_cache && info->seek_not_done) { /* File touched, do seek */ - if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) == + if (mysql_file_seek(info->file, pos_in_file, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) { UNLOCK_APPEND_BUFFER; @@ -1803,7 +1803,7 @@ int my_b_flush_io_cache(IO_CACHE *info, info->write_end= (info->write_buffer+info->buffer_length- ((pos_in_file+length) & (IO_SIZE-1))); - if (my_write(info->file,info->write_buffer,length, + if (mysql_file_write(info->file,info->write_buffer,length, info->myflags | MY_NABP)) info->error= -1; else @@ -1815,7 +1815,7 @@ int my_b_flush_io_cache(IO_CACHE *info, else { info->end_of_file+=(info->write_pos-info->append_read_pos); - DBUG_ASSERT(info->end_of_file == my_tell(info->file,MYF(0))); + DBUG_ASSERT(info->end_of_file == mysql_file_tell(info->file, MYF(0))); } info->append_read_pos=info->write_pos=info->write_buffer; === modified file 'sql/log.cc' --- a/sql/log.cc 2010-10-20 19:02:59 +0000 +++ b/sql/log.cc 2010-11-12 06:23:26 +0000 @@ -2177,7 +2177,11 @@ bool MYSQL_LOG::init_and_set_log_file_na 1 error */ -bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg, +bool MYSQL_LOG::open( +#ifdef HAVE_PSI_INTERFACE + PSI_file_key log_file_key, +#endif + const char *log_name, enum_log_type log_type_arg, const char *new_name, enum cache_type io_cache_type_arg) { char buff[FN_REFLEN]; @@ -2205,7 +2209,12 @@ bool MYSQL_LOG::open(const char *log_nam db[0]= 0; - if ((file= mysql_file_open(key_file_MYSQL_LOG, +#ifdef HAVE_PSI_INTERFACE + /* Keep the key for reopen */ + m_log_file_key= log_file_key; +#endif + + if ((file= mysql_file_open(log_file_key, log_file_name, open_flags, MYF(MY_WME | ME_WAITTANG))) < 0 || init_io_cache(&log_file, file, IO_SIZE, io_cache_type, @@ -2389,7 +2398,11 @@ void MYSQL_QUERY_LOG::reopen_file() Note that at this point, log_state != LOG_CLOSED (important for is_open()). */ - open(save_name, log_type, 0, io_cache_type); + open( +#ifdef HAVE_PSI_INTERFACE + m_log_file_key, +#endif + save_name, log_type, 0, io_cache_type); my_free(save_name); mysql_mutex_unlock(&LOCK_log); @@ -2855,8 +2868,8 @@ bool MYSQL_BIN_LOG::open(const char *log write_error= 0; /* open the main log file */ - if (MYSQL_LOG::open(log_name, log_type_arg, new_name, - io_cache_type_arg)) + if (MYSQL_LOG::open(key_file_binlog, + log_name, log_type_arg, new_name, io_cache_type_arg)) { #ifdef HAVE_REPLICATION close_purge_index_file(); === modified file 'sql/log.h' --- a/sql/log.h 2010-09-29 14:26:32 +0000 +++ b/sql/log.h 2010-11-12 06:23:26 +0000 @@ -196,7 +196,11 @@ public: MYSQL_LOG(); void init_pthread_objects(); void cleanup(); - bool open(const char *log_name, + bool open( +#ifdef HAVE_PSI_INTERFACE + PSI_file_key log_file_key, +#endif + const char *log_name, enum_log_type log_type, const char *new_name, enum cache_type io_cache_type_arg); @@ -223,6 +227,10 @@ public: volatile enum_log_state log_state; enum cache_type io_cache_type; friend class Log_event; +#ifdef HAVE_PSI_INTERFACE + /** Instrumentation key to use for file io in @c log_file */ + PSI_file_key m_log_file_key; +#endif }; class MYSQL_QUERY_LOG: public MYSQL_LOG @@ -241,14 +249,22 @@ public: bool open_slow_log(const char *log_name) { char buf[FN_REFLEN]; - return open(generate_name(log_name, "-slow.log", 0, buf), LOG_NORMAL, 0, - WRITE_CACHE); + return open( +#ifdef HAVE_PSI_INTERFACE + key_file_slow_log, +#endif + generate_name(log_name, "-slow.log", 0, buf), + LOG_NORMAL, 0, WRITE_CACHE); } bool open_query_log(const char *log_name) { char buf[FN_REFLEN]; - return open(generate_name(log_name, ".log", 0, buf), LOG_NORMAL, 0, - WRITE_CACHE); + return open( +#ifdef HAVE_PSI_INTERFACE + key_file_query_log, +#endif + generate_name(log_name, ".log", 0, buf), + LOG_NORMAL, 0, WRITE_CACHE); } private: === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-11-09 15:59:33 +0000 +++ b/sql/mysqld.cc 2010-11-12 06:23:26 +0000 @@ -7838,9 +7838,10 @@ PSI_file_key key_file_binlog, key_file_b key_file_dbopt, key_file_des_key_file, key_file_ERRMSG, key_select_to_file, key_file_fileparser, key_file_frm, key_file_global_ddl_log, key_file_load, key_file_loadfile, key_file_log_event_data, key_file_log_event_info, - key_file_master_info, key_file_misc, key_file_MYSQL_LOG, key_file_partition, + key_file_master_info, key_file_misc, key_file_partition, key_file_pid, key_file_relay_log_info, key_file_send_file, key_file_tclog, key_file_trg, key_file_trn, key_file_init; +PSI_file_key key_file_query_log, key_file_slow_log; static PSI_file_info all_server_files[]= { @@ -7863,11 +7864,12 @@ static PSI_file_info all_server_files[]= { &key_file_log_event_info, "log_event_info", 0}, { &key_file_master_info, "master_info", 0}, { &key_file_misc, "misc", 0}, - { &key_file_MYSQL_LOG, "MYSQL_LOG", 0}, { &key_file_partition, "partition", 0}, { &key_file_pid, "pid", 0}, + { &key_file_query_log, "query_log", 0}, { &key_file_relay_log_info, "relay_log_info", 0}, { &key_file_send_file, "send_file", 0}, + { &key_file_slow_log, "slow_log", 0}, { &key_file_tclog, "tclog", 0}, { &key_file_trg, "trigger_name", 0}, { &key_file_trn, "trigger", 0}, === modified file 'sql/mysqld.h' --- a/sql/mysqld.h 2010-11-05 13:16:27 +0000 +++ b/sql/mysqld.h 2010-11-12 06:23:26 +0000 @@ -270,9 +270,10 @@ extern PSI_file_key key_file_binlog, key key_file_dbopt, key_file_des_key_file, key_file_ERRMSG, key_select_to_file, key_file_fileparser, key_file_frm, key_file_global_ddl_log, key_file_load, key_file_loadfile, key_file_log_event_data, key_file_log_event_info, - key_file_master_info, key_file_misc, key_file_MYSQL_LOG, key_file_partition, + key_file_master_info, key_file_misc, key_file_partition, key_file_pid, key_file_relay_log_info, key_file_send_file, key_file_tclog, key_file_trg, key_file_trn, key_file_init; +extern PSI_file_key key_file_query_log, key_file_slow_log; void init_server_psi_keys(); #endif /* HAVE_PSI_INTERFACE */ --===============4736532272543076417== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///Users/malff/BZR_TREE/mysql-5.5-bugteam-58052/ # testament_sha1: 1837cef04b24310aaf17695be98955836cb25c8e # timestamp: 2010-11-12 07:23:51 +0100 # base_revision_id: svoj@stripped # # Begin bundle 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 J2plbw== --===============4736532272543076417==--