summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2003-12-08 16:18:25 +0100
committerunknown <guilhem@mysql.com>2003-12-08 16:18:25 +0100
commita50761a565a07f4d0494d0193f15a80b57fc7108 (patch)
tree6dfcb95855b457d5a4207559902c7f4ee45af48b
parent1057ca5405f678f3005a26a183a77d74b0906214 (diff)
downloadmariadb-git-a50761a565a07f4d0494d0193f15a80b57fc7108.tar.gz
Fix for BUG#2045 "Sending SIGHUP to mysqld crashes it if running with --log-bin".
The constructor of Rotate_log_event used when we are rotating our binlog or relay log, should not assume that there is a nonzero THD available. For example, when we are reacting to SIGHUP, the THD is 0. In fact we don't need to use the THD in this constructor; we can do like for Stop_log_event, and use the minimal Log_event constructor. If we were allowed to put Unix-specific commands in the testsuite, I'd add a test for this (<sigh>). sql/log.cc: A comment to warn that thd can be 0. The part about LOG_EVENT_FORCED_ROTATE_F is just to avoid segfault; this flag is already removed in 4.1 anyway. sql/log_event.cc: A comment. sql/log_event.h: The constructor of Rotate_log_event used when we are rotating our binlog or relay log, should not assume that there is a nonzero THD available. For example, when we are reacting to SIGHUP, the THD is 0. In fact we don't need to use the THD in this constructor; we can do like for Stop_log_event, and use the minimal Log_event constructor. This fixes BUG#2045 "Sending SIGHUP to mysqld crashes it if running with --log-bin"
-rw-r--r--sql/log.cc4
-rw-r--r--sql/log_event.cc7
-rw-r--r--sql/log_event.h2
3 files changed, 9 insertions, 4 deletions
diff --git a/sql/log.cc b/sql/log.cc
index e6eaa3b802c..8bd42d28e59 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -843,7 +843,7 @@ void MYSQL_LOG::new_file(bool need_lock)
We log the whole file name for log file as the user may decide
to change base names at some point.
*/
- THD* thd = current_thd;
+ THD* thd = current_thd; /* may be 0 if we are reacting to SIGHUP */
Rotate_log_event r(thd,new_name+dirname_length(new_name));
r.set_log_pos(this);
@@ -852,7 +852,7 @@ void MYSQL_LOG::new_file(bool need_lock)
the slave running with log-bin, we set the flag on rotate
event to prevent infinite log rotation loop
*/
- if (thd->slave_thread)
+ if (thd && thd->slave_thread)
r.flags|= LOG_EVENT_FORCED_ROTATE_F;
r.write(&log_file);
bytes_written += r.get_event_len();
diff --git a/sql/log_event.cc b/sql/log_event.cc
index d17c94a2b44..9779b7401dd 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -128,7 +128,12 @@ Log_event::Log_event(THD* thd_arg, uint16 flags_arg, bool using_trans)
(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)));
}
-
+/*
+ This minimal constructor is for when you are not even sure that there is a
+ valid THD. For example in the server when we are shutting down or flushing
+ logs after receiving a SIGHUP (then we must write a Rotate to the binlog but
+ we have no THD, so we need this minimal constructor).
+*/
Log_event::Log_event()
:temp_buf(0), exec_time(0), cached_event_len(0), flags(0), cache_stmt(0),
thd(0)
diff --git a/sql/log_event.h b/sql/log_event.h
index 929d550951e..a1a7798be34 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -607,7 +607,7 @@ public:
Rotate_log_event(THD* thd_arg, const char* new_log_ident_arg,
uint ident_len_arg = 0,
ulonglong pos_arg = LOG_EVENT_OFFSET)
- :Log_event(thd_arg,0,0), new_log_ident(new_log_ident_arg),
+ :Log_event(), new_log_ident(new_log_ident_arg),
pos(pos_arg),ident_len(ident_len_arg ? ident_len_arg :
(uint) strlen(new_log_ident_arg)), alloced(0)
{}