* when USE_THREAD_DUMP is set.
*/
volatile unsigned long threads_to_dump = 0;
+unsigned int debug_commands_issued = 0;
/* Dumps to the buffer some known information for the desired thread, and
* optionally extra info for the current thread. The dump will be appended to
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
exit(code);
return 1;
}
if (!fdtab[fd].owner)
return cli_msg(appctx, LOG_INFO, "File descriptor was already closed.\n");
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
fd_delete(fd);
return 1;
}
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
usleep((long)delay * 1000);
return 1;
}
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
chunk_reset(&trash);
for (arg = 3; *args[arg]; arg++) {
if (arg > 3)
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
gettimeofday(&curr, NULL);
tv_ms_add(&deadline, &curr, loop);
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
ha_panic();
return 1;
}
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
return 1;
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
chunk_reset(&trash);
for (arg = 3; *args[arg]; arg++) {
if (arg > 3)
if (!start)
return cli_err(appctx, "Will not dump from NULL address.\n");
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
+
/* by default, dump ~128 till next block of 16 */
len = strtoul(args[4], NULL, 0);
if (!len)
if (*args[4])
sig = atoi(args[4]);
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
if (thr)
ha_tkill(thr - 1, sig);
else
);
}
+ _HA_ATOMIC_ADD(&debug_commands_issued, 1);
for (arg = 3; *args[arg]; arg++) {
old = 0;
end = word = args[arg];
[INF_FAILED_RESOLUTIONS] = { .name = "FailedResolutions", .desc = "Total number of failed DNS resolutions in current worker process since started" },
[INF_TOTAL_BYTES_OUT] = { .name = "TotalBytesOut", .desc = "Total number of bytes emitted by current worker process since started" },
[INF_BYTES_OUT_RATE] = { .name = "BytesOutRate", .desc = "Number of bytes emitted by current worker process over the last second" },
+ [INF_DEBUG_COMMANDS_ISSUED] = { .name = "DebugCommandsIssued", .desc = "Number of debug commands issued on this process (anything > 0 is unsafe)" },
};
const struct name_desc stat_fields[ST_F_TOTAL_FIELDS] = {
info[INF_FAILED_RESOLUTIONS] = mkf_u32(0, dns_failed_resolutions);
info[INF_TOTAL_BYTES_OUT] = mkf_u64(0, global.out_bytes);
info[INF_BYTES_OUT_RATE] = mkf_u64(FN_RATE, (unsigned long long)read_freq_ctr(&global.out_32bps) * 32);
+ info[INF_DEBUG_COMMANDS_ISSUED] = mkf_u32(0, debug_commands_issued);
return 1;
}