Download | Plain Text | Line Numbers


diff -Naur sql/slave.cc sql/slave.cc
--- sql/slave.cc	2011-08-31 19:22:46.000000000 +0200
+++ sql/slave.cc	2011-10-22 18:18:02.000000000 +0200
@@ -2034,7 +2034,10 @@
   slave threads, since a replication event can become this much larger
   than the corresponding packet (query) sent from client to master.
 */
-  thd->variables.max_allowed_packet= global_system_variables.max_allowed_packet
+  //thd->variables.max_allowed_packet= global_system_variables.max_allowed_packet
+  //  + MAX_LOG_EVENT_HEADER;  /* note, incr over the global not session var */
+  thd->variables.max_allowed_packet= max(global_system_variables.max_allowed_packet,
+      global_system_variables.replicate_max_allowed_packet)
     + MAX_LOG_EVENT_HEADER;  /* note, incr over the global not session var */
   thd->slave_thread = 1;
   thd->enable_slow_log= opt_log_slow_slave_statements;
@@ -2785,7 +2788,10 @@
     thread, since a replication event can become this much larger than
     the corresponding packet (query) sent from client to master.
   */
-    mysql->net.max_packet_size= thd->net.max_packet_size+= MAX_LOG_EVENT_HEADER;
+    //mysql->net.max_packet_size= thd->net.max_packet_size+= MAX_LOG_EVENT_HEADER;
+    mysql->net.max_packet_size = max(thd->net.max_packet_size,
+        global_system_variables.replicate_max_allowed_packet)
+      + MAX_LOG_EVENT_HEADER;
   }
   else
   {
diff -Naur sql/sql_class.h sql/sql_class.h
--- sql/sql_class.h	2011-08-31 19:22:46.000000000 +0200
+++ sql/sql_class.h	2011-10-22 18:08:09.000000000 +0200
@@ -460,6 +460,7 @@
   ulong join_buff_size;
   ulong lock_wait_timeout;
   ulong max_allowed_packet;
+  ulong replicate_max_allowed_packet;
   ulong max_error_count;
   ulong max_length_for_sort_data;
   ulong max_sort_length;
diff -Naur sql/sql_repl.cc sql/sql_repl.cc
--- sql/sql_repl.cc	2011-07-13 21:09:03.000000000 +0200
+++ sql/sql_repl.cc	2011-10-22 18:19:37.000000000 +0200
@@ -587,7 +587,10 @@
     this larger than the corresponding packet (query) sent 
     from client to master.
   */
-  thd->variables.max_allowed_packet+= MAX_LOG_EVENT_HEADER;
+  //thd->variables.max_allowed_packet+= MAX_LOG_EVENT_HEADER;
+  thd->variables.max_allowed_packet = max(thd->variables.max_allowed_packet,
+      thd->variables.replicate_max_allowed_packet)
+    + MAX_LOG_EVENT_HEADER;
 
   /*
     We can set log_lock now, it does not move (it's a member of
@@ -1787,7 +1790,10 @@
     /*
       to account binlog event header size
     */
-    thd->variables.max_allowed_packet += MAX_LOG_EVENT_HEADER;
+    //thd->variables.max_allowed_packet += MAX_LOG_EVENT_HEADER;
+    thd->variables.max_allowed_packet = max(thd->variables.max_allowed_packet,
+        thd->variables.replicate_max_allowed_packet)
+      + MAX_LOG_EVENT_HEADER;
 
     mysql_mutex_lock(log_lock);
 
diff -Naur sql/sys_vars.cc sql/sys_vars.cc
--- sql/sys_vars.cc	2011-08-31 19:22:46.000000000 +0200
+++ sql/sys_vars.cc	2011-10-22 18:05:27.000000000 +0200
@@ -1058,6 +1058,31 @@
        BLOCK_SIZE(1024), NO_MUTEX_GUARD, NOT_IN_BINLOG,
        ON_CHECK(check_max_allowed_packet));
 
+static bool
+check_replicate_max_allowed_packet(sys_var *self, THD *thd,  set_var *var)
+{
+  longlong val;
+  if (session_readonly(self, thd, var))
+    return true;
+
+  val= var->save_result.ulonglong_value;
+  if (val < (longlong) global_system_variables.max_allowed_packet)
+  {
+    push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
+                        WARN_OPTION_BELOW_LIMIT, ER(WARN_OPTION_BELOW_LIMIT),
+                        "replicate_max_allowed_packet", "max_allowed_packet");
+  }
+  return false;
+}
+
+static Sys_var_ulong Sys_replicate_max_allowed_packet(
+       "replicate_max_allowed_packet",
+       "Max packet length to send to or receive from the server for replication threads",
+       SESSION_VAR(replicate_max_allowed_packet), CMD_LINE(REQUIRED_ARG),
+       VALID_RANGE(1024, 1024*1024*1024), DEFAULT(1024*1024),
+       BLOCK_SIZE(1024), NO_MUTEX_GUARD, NOT_IN_BINLOG,
+       ON_CHECK(check_replicate_max_allowed_packet));
+
 static Sys_var_ulonglong Sys_max_binlog_cache_size(
        "max_binlog_cache_size",
        "Sets the total size of the transactional cache",