mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-17 02:56:51 +00:00
DEBUG: cli: add a new "debug dev deadlock" expert command
This command will create the requested number of tasks competing on a lock, resulting in triggering the watchdog and crashing the process. This will help stress the watchdog and inspect the lock debugging parts.
This commit is contained in:
parent
dd75b64cdf
commit
dadf00e226
31
src/debug.c
31
src/debug.c
@ -457,6 +457,36 @@ static int debug_parse_cli_close(char **args, char *payload, struct appctx *appc
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this is meant to cause a deadlock when more than one task is running it or when run twice */
|
||||||
|
static struct task *debug_run_cli_deadlock(struct task *task, void *ctx, unsigned int state)
|
||||||
|
{
|
||||||
|
static HA_SPINLOCK_T lock __maybe_unused;
|
||||||
|
|
||||||
|
HA_SPIN_LOCK(OTHER_LOCK, &lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parse a "debug dev deadlock" command. It always returns 1. */
|
||||||
|
static int debug_parse_cli_deadlock(char **args, char *payload, struct appctx *appctx, void *private)
|
||||||
|
{
|
||||||
|
int tasks;
|
||||||
|
|
||||||
|
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
_HA_ATOMIC_INC(&debug_commands_issued);
|
||||||
|
for (tasks = atoi(args[3]); tasks > 0; tasks--) {
|
||||||
|
struct task *t = task_new_on(tasks % global.nbthread);
|
||||||
|
if (!t)
|
||||||
|
continue;
|
||||||
|
t->process = debug_run_cli_deadlock;
|
||||||
|
t->context = NULL;
|
||||||
|
task_wakeup(t, TASK_WOKEN_INIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* parse a "debug dev delay" command. It always returns 1. */
|
/* parse a "debug dev delay" command. It always returns 1. */
|
||||||
static int debug_parse_cli_delay(char **args, char *payload, struct appctx *appctx, void *private)
|
static int debug_parse_cli_delay(char **args, char *payload, struct appctx *appctx, void *private)
|
||||||
{
|
{
|
||||||
@ -1535,6 +1565,7 @@ static struct cli_kw_list cli_kws = {{ },{
|
|||||||
{{ "debug", "dev", "bug", NULL }, "debug dev bug : call BUG_ON() and crash", debug_parse_cli_bug, NULL, NULL, NULL, ACCESS_EXPERT },
|
{{ "debug", "dev", "bug", NULL }, "debug dev bug : call BUG_ON() and crash", debug_parse_cli_bug, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
{{ "debug", "dev", "check", NULL }, "debug dev check : call CHECK_IF() and possibly crash", debug_parse_cli_check, NULL, NULL, NULL, ACCESS_EXPERT },
|
{{ "debug", "dev", "check", NULL }, "debug dev check : call CHECK_IF() and possibly crash", debug_parse_cli_check, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
{{ "debug", "dev", "close", NULL }, "debug dev close <fd> : close this file descriptor", debug_parse_cli_close, NULL, NULL, NULL, ACCESS_EXPERT },
|
{{ "debug", "dev", "close", NULL }, "debug dev close <fd> : close this file descriptor", debug_parse_cli_close, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
|
{{ "debug", "dev", "deadlock", NULL }, "debug dev deadlock [nbtask] : deadlock between this number of tasks", debug_parse_cli_deadlock, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
{{ "debug", "dev", "delay", NULL }, "debug dev delay [ms] : sleep this long", debug_parse_cli_delay, NULL, NULL, NULL, ACCESS_EXPERT },
|
{{ "debug", "dev", "delay", NULL }, "debug dev delay [ms] : sleep this long", debug_parse_cli_delay, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
#if defined(DEBUG_DEV)
|
#if defined(DEBUG_DEV)
|
||||||
{{ "debug", "dev", "exec", NULL }, "debug dev exec [cmd] ... : show this command's output", debug_parse_cli_exec, NULL, NULL, NULL, ACCESS_EXPERT },
|
{{ "debug", "dev", "exec", NULL }, "debug dev exec [cmd] ... : show this command's output", debug_parse_cli_exec, NULL, NULL, NULL, ACCESS_EXPERT },
|
||||||
|
Loading…
Reference in New Issue
Block a user