~percona-dev/percona-server/release-5.1.47-12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
--- a/patch_info/control_global_slow.patch	1970-01-01 03:00:00.000000000 +0300
+++ b/patch_info/control_global_slow.patch	2010-06-03 14:56:38.000000000 +0400
@@ -0,0 +1,9 @@
+File=control_global_slow.patch
+Name=Allow choose scope to use of slow-query-log's variables - global or local
+Version=1.0
+Author=Percona <info@percona.com>
+License=GPL
+Comment=http://www.percona.com/docs/wiki/patches:control_global_slow
+Changelog
+2010-06-03
+First version of patch
diff -Nur Percona-Server.orig/sql/mysqld.cc Percona-Server/sql/mysqld.cc
--- Percona-Server.orig/sql/mysqld.cc	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/mysqld.cc	2010-05-28 01:58:52.000000000 +0400
@@ -5785,6 +5785,7 @@
   OPT_OPTIMIZER_FIX,
   OPT_SUPPRESS_LOG_WARNING_1592,
   OPT_USE_GLOBAL_LONG_QUERY_TIME,
+  OPT_USE_GLOBAL_LOG_SLOW_CONTROL,
   OPT_IGNORE_BUILTIN_INNODB,
   OPT_BINLOG_DIRECT_NON_TRANS_UPDATE,
   OPT_DEFAULT_CHARACTER_SET_OLD
@@ -6790,6 +6791,9 @@
    "Timestamp is printed for all records of the slow log even if they are same time.",
    (uchar**) &opt_log_slow_timestamp_every, (uchar**) &opt_log_slow_timestamp_every,
    0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
+  {"use_global_log_slow_control", OPT_USE_GLOBAL_LOG_SLOW_CONTROL,
+    "Choose flags, wich always use the global variables. Multiple flags allowed in a comma-separated string. [none, log_slow_filter, log_slow_rate_limit, log_slow_verbosity, long_query_time, min_examined_row_limit]",
+   0, 0, 0, GET_STR, NO_ARG, 0, 0, 0, SLOG_UG_NONE, 0, 0},
   {"use_global_long_query_time", OPT_USE_GLOBAL_LONG_QUERY_TIME,
    "Control always use global long_query_time or local long_query_time.",
    (uchar**) &opt_use_global_long_query_time, (uchar**) &opt_use_global_long_query_time,
@@ -7938,6 +7942,7 @@
   global_system_variables.binlog_format= BINLOG_FORMAT_UNSPEC;
 
   global_system_variables.log_slow_verbosity= SLOG_V_MICROTIME;
+  global_system_variables.use_global_log_slow_control = SLOG_UG_NONE;
   global_system_variables.log_slow_filter= SLOG_F_NONE;
   /*
     Default behavior for 4.1 and 5.0 is to treat NULL values as unequal
@@ -8457,6 +8462,23 @@
       exit(1);
     }
     break;
+  case OPT_USE_GLOBAL_LOG_SLOW_CONTROL:
+    {
+      ulong &v = global_system_variables.use_global_log_slow_control;
+      v =  msl_flag_resolve_by_name(slog_use_global, argument, SLOG_UG_NONE, SLOG_UG_INVALID);
+      if (v != SLOG_UG_NONE)
+      {
+	ulong mask = SLOG_UG_NONE;
+	mask = ~mask;
+	v = v & mask;
+      }
+      if (v == SLOG_UG_INVALID)
+      {
+	fprintf(stderr,"Invalid argument in use_global_log_slow_control: %s\n", argument);
+	exit(1);
+      }
+      break;
+    }
   case OPT_SERVER_ID:
     server_id_supplied = 1;
     break;
diff -Nur Percona-Server.orig/sql/mysql_priv.h Percona-Server/sql/mysql_priv.h
--- Percona-Server.orig/sql/mysql_priv.h	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/mysql_priv.h	2010-05-28 01:52:43.000000000 +0400
@@ -621,6 +621,28 @@
   const char *name;
 };
 
+/* use global log slow control */
+#define SLOG_UG_NONE                        1 << 0
+#define SLOG_UG_LOG_SLOW_FILTER             1 << 1
+#define SLOG_UG_LOG_SLOW_RATE_LIMIT         1 << 2
+#define SLOG_UG_LOG_SLOW_VERBOSITY          1 << 3
+#define SLOG_UG_LONG_QUERY_TIME             1 << 4
+#define SLOG_UG_MIN_EXAMINED_ROW_LIMIT      1 << 6
+/* ... */
+#define SLOG_UG_INVALID                     1 << 31
+
+static const struct msl_opts slog_use_global[]=
+  {
+    { SLOG_UG_NONE                      , "none" },
+    { SLOG_UG_LOG_SLOW_FILTER           , "log_slow_filter" },
+    { SLOG_UG_LOG_SLOW_RATE_LIMIT       , "log_slow_rate_limit" },
+    { SLOG_UG_LOG_SLOW_VERBOSITY        , "log_slow_verbosity" },
+    { SLOG_UG_LONG_QUERY_TIME           , "long_query_time" },
+    { SLOG_UG_MIN_EXAMINED_ROW_LIMIT    , "min_examined_row_limit" },
+    /* ... */
+    { SLOG_UG_INVALID                 , (char*)0 }
+  };
+
 #define SLOG_V_MICROTIME      1 << 0
 #define SLOG_V_QUERY_PLAN     1 << 1
 #define SLOG_V_INNODB         1 << 2
diff -Nur Percona-Server.orig/sql/set_var.cc Percona-Server/sql/set_var.cc
--- Percona-Server.orig/sql/set_var.cc	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/set_var.cc	2010-05-28 02:02:45.000000000 +0400
@@ -918,6 +918,12 @@
                                        SLOG_V_MICROTIME,
                                        SLOG_V_INVALID,
                                        slog_verb);
+static sys_var_thd_msl_flag_correct_none sys_use_global_log_slow_control(&vars, "use_global_log_slow_control",
+									 &SV::use_global_log_slow_control,
+									 SLOG_UG_NONE,
+									 SLOG_UG_NONE,
+									 SLOG_UG_INVALID,
+									 slog_use_global);
 static sys_var_bool_ptr       sys_log_slow_slave_statements(&vars, "log_slow_slave_statements",
                                                             &opt_log_slow_slave_statements);
 static sys_var_bool_ptr       sys_log_slow_sp_statements(&vars, "log_slow_sp_statements",
@@ -3924,6 +3930,17 @@
     thd->variables.*offset= var->save_result.ulong_value;
   return 0;
 }
+bool sys_var_thd_msl_flag_correct_none::update(THD *thd, set_var *var)
+{
+  ulong result = var->save_result.ulong_value;
+  if (result != none_val)
+    result = result & (~none_val);
+  if (var->type == OPT_GLOBAL)
+    global_system_variables.*offset = result;
+  else
+    thd->variables.*offset = result;
+  return 0;
+}
 
 
 /****************************************************************************
diff -Nur Percona-Server.orig/sql/sql_class.h Percona-Server/sql/sql_class.h
--- Percona-Server.orig/sql/sql_class.h	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/sql_class.h	2010-05-28 02:05:05.000000000 +0400
@@ -407,6 +407,7 @@
   ulong log_slow_rate_limit;
   ulong log_slow_filter;
   ulong log_slow_verbosity;
+  ulong use_global_log_slow_control;
 
   ulong      innodb_io_reads;
   ulonglong  innodb_io_read;
diff -Nur Percona-Server.orig/sql/sql_parse.cc Percona-Server/sql/sql_parse.cc
--- Percona-Server.orig/sql/sql_parse.cc	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/sql_parse.cc	2010-05-28 02:04:04.000000000 +0400
@@ -1665,7 +1665,10 @@
   free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
   DBUG_RETURN(error);
 }
-
+#define SLOG_UG_SETUP(session,value,flag,global) do {   \
+  if(value & flag) \
+    session = global; \
+  } while(false);
 
 void log_slow_statement(THD *thd)
 {
@@ -1698,6 +1701,18 @@
   if (opt_use_global_long_query_time)
     thd->variables.long_query_time = global_system_variables.long_query_time;
 
+  /* use_global_log_slow_control */
+  {
+    system_variables const &g     = global_system_variables; // global                                                           
+    system_variables       &s     = thd->variables;          // session                                                          
+    ulong const            &value = g.use_global_log_slow_control;
+    SLOG_UG_SETUP(s.log_slow_filter,           value, SLOG_UG_LOG_SLOW_FILTER,             g.log_slow_filter);
+    SLOG_UG_SETUP(s.log_slow_rate_limit,       value, SLOG_UG_LOG_SLOW_RATE_LIMIT,         g.log_slow_rate_limit);
+    SLOG_UG_SETUP(s.log_slow_verbosity,        value, SLOG_UG_LOG_SLOW_VERBOSITY,          g.log_slow_verbosity);
+    SLOG_UG_SETUP(s.long_query_time,           value, SLOG_UG_LONG_QUERY_TIME,             g.long_query_time);
+    SLOG_UG_SETUP(s.min_examined_row_limit,    value, SLOG_UG_MIN_EXAMINED_ROW_LIMIT,      g.min_examined_row_limit);
+  }
+
   /* Do not log this thread's queries due to rate limiting. */
   if (thd->write_to_slow_log != TRUE
       && (thd->variables.long_query_time >= 1000000
diff -Nur Percona-Server.orig/sql/set_var.h Percona-Server/sql/set_var.h
--- Percona-Server.orig/sql/set_var.h	2010-05-28 01:47:26.000000000 +0400
+++ Percona-Server/sql/set_var.h	2010-05-28 02:58:15.000000000 +0400
@@ -627,6 +627,20 @@
   uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
 };
 
+class sys_var_thd_msl_flag_correct_none : public sys_var_thd_msl_flag
+{
+ public:
+  sys_var_thd_msl_flag_correct_none(sys_var_chain *chain, const char *name_arg, ulong SV::*offset_arg,
+				    const ulong none_val_arg,
+				    const ulong default_val_arg,
+				    const ulong invalid_val_arg,
+				    const struct msl_opts *flags_arg)
+    : sys_var_thd_msl_flag(chain,name_arg,offset_arg,none_val_arg,default_val_arg,invalid_val_arg,flags_arg)
+    {
+    }
+  virtual bool update(THD *thd, set_var *var);
+};
+
 class sys_var_thd_storage_engine :public sys_var_thd
 {
 protected: