diff options
author | Rohit Kalhans <rohit.kalhans@oracle.com> | 2012-05-29 12:21:17 +0530 |
---|---|---|
committer | Rohit Kalhans <rohit.kalhans@oracle.com> | 2012-05-29 12:21:17 +0530 |
commit | 5b8308aef921723fbaaa2ae6bcbb4fe32879e65e (patch) | |
tree | 83f60814b3cdb2e45d040716ff335601b826ccb3 | |
parent | ca9a3a8915455ad2069572235f743a3dff1f6d5e (diff) | |
parent | 35d4c18ef46923d4d1102ea290365e5704574792 (diff) | |
download | mariadb-git-5b8308aef921723fbaaa2ae6bcbb4fe32879e65e.tar.gz |
upmerge from mysql-5.1 branch -> mysql-5.5 branch
-rw-r--r-- | client/mysqlbinlog.cc | 21 | ||||
-rw-r--r-- | mysys/my_write.c | 5 | ||||
-rw-r--r-- | sql/log_event.cc | 6 |
3 files changed, 31 insertions, 1 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index ecebde461f9..f2754fbd012 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -698,6 +698,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, DBUG_ENTER("process_event"); print_event_info->short_form= short_form; Exit_status retval= OK_CONTINUE; + IO_CACHE *const head= &print_event_info->head_cache; /* Format events are not concerned by --offset and such, we always need to @@ -761,6 +762,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, } else ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; break; case CREATE_FILE_EVENT: @@ -812,6 +815,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, output of Append_block_log_event::print is only a comment. */ ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; if ((retval= load_processor.process((Append_block_log_event*) ev)) != OK_CONTINUE) goto end; @@ -820,6 +825,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, case EXEC_LOAD_EVENT: { ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; Execute_load_log_event *exv= (Execute_load_log_event*)ev; Create_file_log_event *ce= load_processor.grab_event(exv->file_id); /* @@ -849,6 +856,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, print_event_info->common_header_len= glob_description_event->common_header_len; ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; if (!remote_opt) { ev->free_temp_buf(); // free memory allocated in dump_local_log_entries @@ -878,6 +887,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, break; case BEGIN_LOAD_QUERY_EVENT: ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; if ((retval= load_processor.process((Begin_load_query_log_event*) ev)) != OK_CONTINUE) goto end; @@ -988,6 +999,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, } default: ev->print(result_file, print_event_info); + if (head->error == -1) + goto err; } } @@ -2020,7 +2033,13 @@ err: end: if (fd >= 0) my_close(fd, MYF(MY_WME)); - end_io_cache(file); + /* + Since the end_io_cache() writes to the + file errors may happen. + */ + if (end_io_cache(file)) + retval= ERROR_STOP; + return retval; } diff --git a/mysys/my_write.c b/mysys/my_write.c index c77c3a1cb2b..4b1ccb6fe41 100644 --- a/mysys/my_write.c +++ b/mysys/my_write.c @@ -40,6 +40,11 @@ size_t my_write(File Filedes, const uchar *Buffer, size_t Count, myf MyFlags) #else writtenbytes= write(Filedes, Buffer, Count); #endif + DBUG_EXECUTE_IF("simulate_file_write_error", + { + errno= ENOSPC; + writtenbytes= (size_t) -1; + }); if (writtenbytes == Count) break; if (writtenbytes != (size_t) -1) diff --git a/sql/log_event.cc b/sql/log_event.cc index f932056dfd6..fe0e8c19c35 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -3164,6 +3164,12 @@ void Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) { Write_on_release_cache cache(&print_event_info->head_cache, file); + /** + reduce the size of io cache so that the write function is called + for every call to my_b_write(). + */ + DBUG_EXECUTE_IF ("simulate_file_write_error", + {(&cache)->write_pos= (&cache)->write_end- 500;}); print_query_header(&cache, print_event_info); my_b_write(&cache, (uchar*) query, q_len); my_b_printf(&cache, "\n%s\n", print_event_info->delimiter); |