原文地址:Extending MySQL using the Component Infrastructure – part 12: instrument your code
原文作者:LEFRED
这篇文章是关于使用组件基础架构扩展 MySQL 的系列文章的第十二篇:
- 使用组件基础架构扩展 MySQL – 第 1 部分
- 使用组件基础架构扩展 MySQL - 第 2 部分:构建服务器
- 使用组件基础设施扩展 MySQL - 第 3 部分:组件服务
- 使用组件基础架构扩展 MySQL - 第 4 部分:错误日志记录
- 使用组件基础架构扩展 MySQL - 第 5 部分:权限
- 使用组件基础架构扩展 MySQL - 第 6 部分:函数
- 使用组件基础架构扩展 MySQL - 第 7 部分:给用户的消息
- 使用组件基础架构扩展 MySQL - 第 8 部分:链接第三方库
- 使用组件基础架构扩展 MySQL - 第 9 部分:添加新功能
- 使用组件基础架构扩展 MySQL - 第 10 部分:状态变量
- 使用组件基础架构扩展 MySQL - 第 11 部分:performance_schema 表
- 使用组件基础架构扩展 MySQL - 第 12 部分:检测您的代码
我们已经看到了多种服务来创建我们的组件。现在,我们的病毒扫描组件已完成并按预期工作。
但是,当您为 MySQL 服务器创建扩展时,将检测添加到您的代码中也是一个很好的做法。这将帮助您了解您的代码在做什么以及它在 MySQL 中的执行方式。
这正是我们今天将添加到我们的组件中的内容。
新代码位于此 GitHub 存储库的par12分支上:
https 😕/github.com/lefred/mysql-component-viruscan 。
Performance_Schema我们首先将我们在(参见第 11 部分)中用于表的互斥锁从native_mutex_tto替换为mysql_mutex_t。
我们将使用REQUIRES_MYSQL_MUTEX_SERVICE_PLACEHOLDER(line 61 of scan.h)
。我们还需要将它添加到我们组件的需求中(第 485 行scan.cc)
然后我们在第 52 到 56 行定义将在 MySQL Performance Schema 中使用的新互斥键和信息scan.cc:
PSI_mutex_key key_mutex_virus_data = 0;
PSI_mutex_info virus_data_mutex[] = {
{&key_mutex_virus_data, "virus_scan_data",
PSI_FLAG_SINGLETON, PSI_VOLATILITY_PERMANENT,
"Virus scan data, permanent mutex, singleton."}
};
非常重要native_mutex_t的一点是在初始化组件时不要忘记互斥体的注册(这不是类型所必需的)。否则什么都不会按预期工作。
这正是我们在viruscan_service_init()第 372 行所做的scan.cc:
mysql_mutex_register("virus_scan", virus_data_mutex, 1);
我们将添加一个“错误”,当触发该错误时,我们将花费 5 秒钟等待获得的锁以创建一些争用,以防另一个会话同时尝试扫描触发该错误的数据。
这个假错误是由字符串“ bug-struck”触发的,它在第 214 行到第 221 行编码scan.cc:
//just a fake bug
if (strcmp(data, "bug-stuck") == 0) {
mysql_mutex_lock(&LOCK_virus_data);
LogComponentErr(INFORMATION_LEVEL, ER_LOG_PRINTF_MSG,
"Generating a bug to spend time in mutex");
my_sleep(5000000); // 5.0s
mysql_mutex_unlock(&LOCK_virus_data);
}
我们还在 MySQL 的错误日志中打印一条消息。
performance_schema让我们在表格setup_instruments中查看所有这些操作events_waits_history:


同时进入另一个会话:




总结
如果您正在寻找可以检测的内容,这是可用检测的当前列表:PFS_PSI_LIST。
我们现在已经介绍了要创建的大部分主要组件服务,这些服务可用于创建我们自己的组件。
我希望你喜欢这次旅程,我很想看看你将创建的组件。请与我分享!
和往常一样,享受 MySQL 和快乐的编码!




