summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicențiu Ciorbaru <cvicentiu@gmail.com>2021-09-29 14:10:56 +0300
committerVicențiu Ciorbaru <cvicentiu@gmail.com>2021-09-29 14:10:56 +0300
commitb1030352b7eb85725b8ae86a3934ad07cd925712 (patch)
treeec4d05bb73fc2778dfceea8fa24912ab3120250e
parent53066bd0a5153a0b35fef577701eff6032db0080 (diff)
downloadmariadb-git-b1030352b7eb85725b8ae86a3934ad07cd925712.tar.gz
Implement DEBUG_SYNC multiple signal firing capabilitybb-10.6-vicentiu-debug_sync
One can now do: set DEBUG_SYNC='... SIGNAL s1,s2,s3...' Multiple signals can be fired, they need to be split by commas.
-rw-r--r--mysql-test/main/debug_sync.result4
-rw-r--r--mysql-test/main/debug_sync.test7
-rw-r--r--sql/debug_sync.cc39
3 files changed, 37 insertions, 13 deletions
diff --git a/mysql-test/main/debug_sync.result b/mysql-test/main/debug_sync.result
index 9b6699f9bc2..4c1711a6d6b 100644
--- a/mysql-test/main/debug_sync.result
+++ b/mysql-test/main/debug_sync.result
@@ -315,4 +315,8 @@ SET DEBUG_SYNC= 'now WAIT_FOR s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: ''
+SET DEBUG_SYNC= 'now SIGNAL s1,s2,s5,s7';
+SHOW VARIABLES LIKE 'DEBUG_SYNC';
+Variable_name Value
+debug_sync ON - current signals: 's2,s7,s1,s5'
SET DEBUG_SYNC= 'RESET';
diff --git a/mysql-test/main/debug_sync.test b/mysql-test/main/debug_sync.test
index 0ea637a393a..1dc3dc9c71e 100644
--- a/mysql-test/main/debug_sync.test
+++ b/mysql-test/main/debug_sync.test
@@ -439,10 +439,13 @@ SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'now WAIT_FOR s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
+SET DEBUG_SYNC= 'now SIGNAL s1,s2,s5,s7';
+SHOW VARIABLES LIKE 'DEBUG_SYNC';
+
+
#
# Cleanup after test case.
-# Otherwise signal would contain 'flushed' here,
-# which could confuse the next test.
+# Otherwise signal would confuse the next test.
#
SET DEBUG_SYNC= 'RESET';
diff --git a/sql/debug_sync.cc b/sql/debug_sync.cc
index e0a2a0aef3b..22c12c420e3 100644
--- a/sql/debug_sync.cc
+++ b/sql/debug_sync.cc
@@ -122,9 +122,9 @@ struct st_debug_sync_globals
@retval false otherwise.
*/
- inline bool is_signalled(const String &signal_name)
+ inline bool is_signalled(const char *signal_name, size_t length)
{
- return ds_signal_set.find(signal_name.ptr(), signal_name.length());
+ return ds_signal_set.find(signal_name, length);
}
void clear_signal(const String &signal_name)
@@ -140,21 +140,21 @@ struct st_debug_sync_globals
DBUG_VOID_RETURN;
}
- bool set_signal(const String &signal_name)
+ bool set_signal(const char *signal_name, size_t length)
{
/* Need to check if the signal is already in the hash set, because
Hash_set doesn't differentiate between OOM and key already in. */
- if (is_signalled(signal_name))
+ if (is_signalled(signal_name, length))
return FALSE;
/* LEX_CSTRING and the string allocated with only one malloc. */
LEX_CSTRING *s= (LEX_CSTRING *) my_malloc(PSI_NOT_INSTRUMENTED,
- sizeof(LEX_CSTRING) +
- signal_name.length() + 1, MYF(0));
+ sizeof(LEX_CSTRING) + length + 1,
+ MYF(0));
char *str= (char *)(s + 1);
- memcpy(str, signal_name.ptr(), signal_name.length());
- str[signal_name.length()]= '\0';
+ memcpy(str, signal_name, length);
+ str[length]= '\0';
- s->length= signal_name.length();
+ s->length= length;
s->str= str;
if (ds_signal_set.insert(s))
return TRUE;
@@ -1510,7 +1510,23 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
if (action->signal.length())
{
- if (debug_sync_global.set_signal(action->signal))
+ int offset= 0, pos;
+ bool error= false;
+
+ /* This loop covers all signals in the list except for the last one.
+ Split the signal string by commas and set a signal in the global
+ variable for each one. */
+ while (!error && (pos= action->signal.strstr(",", 1, offset)) > 0)
+ {
+ error= debug_sync_global.set_signal(action->signal.ptr() + offset,
+ pos - offset);
+ offset= pos + 1;
+ }
+
+ if (error ||
+ /* The last signal in the list. */
+ debug_sync_global.set_signal(action->signal.ptr() + offset,
+ action->signal.length() - offset))
{
/*
Error is reported by my_malloc().
@@ -1566,7 +1582,8 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
The facility can become disabled when some thread cannot get
the required dynamic memory allocated.
*/
- while (!debug_sync_global.is_signalled(action->wait_for) &&
+ while (!debug_sync_global.is_signalled(action->wait_for.ptr(),
+ action->wait_for.length()) &&
!thd->killed &&
opt_debug_sync_timeout)
{