暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 使用组件基础架构扩展 MySQL - 第 12 部分:检测您的代码

原创 XXYGGOD 2022-06-22
769

原文地址: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

image.png

image.png

同时进入另一个会话:
image.png
image.png
image.png
image.png

总结

如果您正在寻找可以检测的内容,这是可用检测的当前列表:PFS_PSI_LIST。

我们现在已经介绍了要创建的大部分主要组件服务,这些服务可用于创建我们自己的组件。

我希望你喜欢这次旅程,我很想看看你将创建的组件。请与我分享!

和往常一样,享受 MySQL 和快乐的编码!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论