diff options
author | Luis Soares <luis.soares@sun.com> | 2009-10-07 22:13:07 +0100 |
---|---|---|
committer | Luis Soares <luis.soares@sun.com> | 2009-10-07 22:13:07 +0100 |
commit | 75a4dd3e6a1909110944bdbfd90d00b4a303e3b4 (patch) | |
tree | 63ef6c466f5d064f17971f5e974fdf441b290ccd | |
parent | 6507f04de26425cdd67ccf69313c563eb1b07f65 (diff) | |
download | mariadb-git-75a4dd3e6a1909110944bdbfd90d00b4a303e3b4.tar.gz |
BUG#40611, BUG#44779: reverted in mysql-5.1-rep+2.
-rw-r--r-- | mysql-test/suite/binlog/r/binlog_max_extension.result | 8 | ||||
-rw-r--r-- | mysql-test/suite/binlog/t/binlog_max_extension.test | 92 | ||||
-rw-r--r-- | sql/log.cc | 75 | ||||
-rw-r--r-- | sql/log.h | 13 |
4 files changed, 14 insertions, 174 deletions
diff --git a/mysql-test/suite/binlog/r/binlog_max_extension.result b/mysql-test/suite/binlog/r/binlog_max_extension.result deleted file mode 100644 index af341db4536..00000000000 --- a/mysql-test/suite/binlog/r/binlog_max_extension.result +++ /dev/null @@ -1,8 +0,0 @@ -call mtr.add_suppression("Next log extension: 2147483647. Remaining log filename extensions: 0."); -call mtr.add_suppression("Log filename extension number exhausted:"); -call mtr.add_suppression("Can't generate a unique log-filename"); -RESET MASTER; -FLUSH LOGS; -Warnings: -Warning 1098 Can't generate a unique log-filename master-bin.(1-999) - diff --git a/mysql-test/suite/binlog/t/binlog_max_extension.test b/mysql-test/suite/binlog/t/binlog_max_extension.test deleted file mode 100644 index 9f52d195e21..00000000000 --- a/mysql-test/suite/binlog/t/binlog_max_extension.test +++ /dev/null @@ -1,92 +0,0 @@ -# BUG#40611: MySQL cannot make a binary log after sequential number beyond -# unsigned long. -# -# Problem statement -# ================= -# -# Extension for log file names might be created with negative -# numbers (when counter used would wrap around), causing server -# failure when incrementing -00001 (reaching number 000000 -# extension). -# -# Test -# ==== -# This tests aims at testing the a patch that removes negatives -# numbers from log name extensions and checks that the server -# reports gracefully that the limit has been reached. -# -# It instruments index file to point to a log file close to -# the new maximum and calls flush logs to get warning. -# - -call mtr.add_suppression("Next log extension: 2147483647. Remaining log filename extensions: 0."); -call mtr.add_suppression("Log filename extension number exhausted:"); -call mtr.add_suppression("Can't generate a unique log-filename"); - - --- source include/have_log_bin.inc -RESET MASTER; - --- let $MYSQLD_DATADIR= `select @@datadir` - -############################################### -# check hitting maximum file name extension: -############################################### - -########## -# Prepare -########## - -# 1. Stop master server --- write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -wait -EOF --- shutdown_server 10 --- source include/wait_until_disconnected.inc - -# 2. Prepare log and index file --- copy_file $MYSQLD_DATADIR/master-bin.index $MYSQLD_DATADIR/master-bin.index.orig --- copy_file $MYSQLD_DATADIR/master-bin.000001 $MYSQLD_DATADIR/master-bin.2147483646 --- append_file $MYSQLD_DATADIR/master-bin.index -master-bin.2147483646 -EOF - -# 3. Restart the server --- append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -restart -EOF --- enable_reconnect --- source include/wait_until_connected_again.inc - -########### -# Assertion -########### - -# assertion: should throw warning -FLUSH LOGS; - -############## -# Clean up -############## - -# 1. Stop the server --- write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -wait -EOF --- shutdown_server 10 --- source include/wait_until_disconnected.inc - -# 2. Undo changes to index and log files --- remove_file $MYSQLD_DATADIR/master-bin.index --- copy_file $MYSQLD_DATADIR/master-bin.index.orig $MYSQLD_DATADIR/master-bin.index --- remove_file $MYSQLD_DATADIR/master-bin.index.orig - --- remove_file $MYSQLD_DATADIR/master-bin.2147483646 --- remove_file $MYSQLD_DATADIR/master-bin.2147483647 - -# 3. Restart the server --- append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -restart -EOF --- enable_reconnect --- source include/wait_until_connected_again.inc diff --git a/sql/log.cc b/sql/log.cc index 45d71379b9e..5926c2c036f 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -53,7 +53,7 @@ LOGGER logger; MYSQL_BIN_LOG mysql_bin_log(&sync_binlog_period); static bool test_if_number(const char *str, - ulong *res, bool allow_wildcards); + long *res, bool allow_wildcards); static int binlog_init(void *p); static int binlog_close_connection(handlerton *hton, THD *thd); static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv); @@ -1835,27 +1835,22 @@ static void setup_windows_event_source() /** Find a unique filename for 'filename.#'. - Set '#' to the number next to the maximum found in the most - recent log file extension. - - This function will return nonzero if: (i) the generated name - exceeds FN_REFLEN; (ii) if the number of extensions is exhausted; - or (iii) some other error happened while examining the filesystem. + Set '#' to a number as low as possible. @return - nonzero if not possible to get unique filename. + nonzero if not possible to get unique filename */ static int find_uniq_filename(char *name) { + long number; uint i; - char buff[FN_REFLEN], ext_buf[FN_REFLEN]; + char buff[FN_REFLEN]; struct st_my_dir *dir_info; reg1 struct fileinfo *file_info; - ulong max_found= 0, next= 0, number= 0; + ulong max_found=0; size_t buf_length, length; char *start, *end; - int error= 0; DBUG_ENTER("find_uniq_filename"); length= dirname_part(buff, name, &buf_length); @@ -1863,15 +1858,15 @@ static int find_uniq_filename(char *name) end= strend(start); *end='.'; - length= (size_t) (end - start + 1); + length= (size_t) (end-start+1); - if (!(dir_info= my_dir(buff,MYF(MY_DONT_SORT)))) + if (!(dir_info = my_dir(buff,MYF(MY_DONT_SORT)))) { // This shouldn't happen strmov(end,".1"); // use name+1 - DBUG_RETURN(1); + DBUG_RETURN(0); } file_info= dir_info->dir_entry; - for (i= dir_info->number_off_files ; i-- ; file_info++) + for (i=dir_info->number_off_files ; i-- ; file_info++) { if (bcmp((uchar*) file_info->name, (uchar*) start, length) == 0 && test_if_number(file_info->name+length, &number,0)) @@ -1881,44 +1876,9 @@ static int find_uniq_filename(char *name) } my_dirend(dir_info); - /* check if reached the maximum possible extension number */ - if ((max_found == MAX_LOG_UNIQUE_FN_EXT)) - { - sql_print_error("Log filename extension number exhausted: %06lu. \ -Please fix this by archiving old logs and \ -updating the index files.", max_found); - error= 1; - goto end; - } - - next= max_found + 1; - sprintf(ext_buf, "%06lu", next); *end++='.'; - - /* - Check if the generated extension size + the file name exceeds the - buffer size used. If one did not check this, then the filename might be - truncated, resulting in error. - */ - if (((strlen(ext_buf) + (end - name)) >= FN_REFLEN)) - { - sql_print_error("Log filename too large: %s%s (%lu). \ -Please fix this by archiving old logs and updating the \ -index files.", name, ext_buf, (strlen(ext_buf) + (end - name))); - error= 1; - goto end; - } - - sprintf(end, "%06lu", next); - - /* print warning if reaching the end of available extensions. */ - if ((next > (MAX_LOG_UNIQUE_FN_EXT - LOG_WARN_UNIQUE_FN_EXT_LEFT))) - sql_print_warning("Next log extension: %lu. \ -Remaining log filename extensions: %lu. \ -Please consider archiving some logs.", next, (MAX_LOG_UNIQUE_FN_EXT - next)); - -end: - DBUG_RETURN(error); + sprintf(end,"%06ld",max_found+1); + DBUG_RETURN(0); } @@ -2117,13 +2077,6 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name) { if (find_uniq_filename(new_name)) { - /* - This should be treated as error once propagation of error further - up in the stack gets proper handling. - */ - push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_NO_UNIQUE_LOGFILE, ER(ER_NO_UNIQUE_LOGFILE), - log_name); sql_print_error(ER(ER_NO_UNIQUE_LOGFILE), log_name); return 1; } @@ -4841,11 +4794,11 @@ void MYSQL_BIN_LOG::set_max_size(ulong max_size_arg) @retval 1 String is a number @retval - 0 String is not a number + 0 Error */ static bool test_if_number(register const char *str, - ulong *res, bool allow_wildcards) + long *res, bool allow_wildcards) { reg2 int flag; const char *start; diff --git a/sql/log.h b/sql/log.h index b22e22a2cf5..a31be6dcce6 100644 --- a/sql/log.h +++ b/sql/log.h @@ -121,19 +121,6 @@ extern TC_LOG_DUMMY tc_log_dummy; #define LOG_CLOSE_TO_BE_OPENED 2 #define LOG_CLOSE_STOP_EVENT 4 -/* - Maximum unique log filename extension. - Note: setting to 0x7FFFFFFF due to atol windows - overflow/truncate. - */ -#define MAX_LOG_UNIQUE_FN_EXT 0x7FFFFFFF - -/* - Number of warnings that will be printed to error log - before extension number is exhausted. -*/ -#define LOG_WARN_UNIQUE_FN_EXT_LEFT 1000 - class Relay_log_info; typedef struct st_log_info |