[MySQL Bug]使用DEBUG_SYNC调试多线程并发导致的bug

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

———————————————————-

这里以一个简单的bug(bug#58198)为例,本例使用的也比较简单,就用SIGNAL 和WAIT_FOR

我们对Percona Server 5.5.18注入如下代码:
在函数mysql_change_db_impl(use db时会调用)中:
Index: sql/sql_db.cc
===================================================================
--- sql/sql_db.cc       (revision 1185)
+++ sql/sql_db.cc       (working copy)
@@ -1291,7 +1291,7 @@
       the previous database name, we should do it explicitly.
     */
     my_free(thd->db);
-
+    DEBUG_SYNC(thd, "use_db_free");
     thd->reset_db(new_db_name->str, new_db_name->length);
   }
在函数mysqld_list_processes(show processlist时会调用)中:
Index: sql/sql_show.cc
===================================================================
--- sql/sql_show.cc     (revision 1185)
+++ sql/sql_show.cc     (working copy)
@@ -1880,8 +1880,10 @@
          thd_info->host= thd->strdup(tmp_sctx->host_or_ip[0] ? 
                                       tmp_sctx->host_or_ip : 
                                       tmp_sctx->host ? tmp_sctx->host : "");
-        if ((thd_info->db=tmp->db))             // Safe test
+        if ((thd_info->db=tmp->db)) {            // Safe test
+          DEBUG_SYNC(thd, "after_read_db_ptr");
           thd_info->db=thd->strdup(thd_info->db);
+        }  
         thd_info->command=(int) tmp->command;
         mysql_mutex_lock(&tmp->LOCK_thd_data);
         if ((mysys_var= tmp->mysys_var))
在show processlist时,在拷贝了tmp->db的指针后,有可能tmp->db所指向的内存已经被释放或被重用,这时候就在show processlist时就可能显示意料外的值,或者直接crash掉。。。。。
如下:
创建测试库
create database a;
create database abcde;
con1:
SET DEBUG_SYNC=’RESET';                 —RESET表示重置DEBUG_SYNC
use a;
con2:
SET DEBUG_SYNC=’RESET';
SET DEBUG_SYNC=”after_read_db_ptr SIGNAL have_show WAIT_FOR have_free”;
—–当执行到 DEBUG_SYNC(thd, “after_read_db_ptr”)时会发送一个信号名为”have_show”,然后再等待信号名为”have_free”
show processlist;
—–发送“have_show”,等待“have_free”
con1:
SET DEBUG_SYNC=”now wait_for have_show”;
—-等待接收到信号”have_show”
SET DEBUG_SYNC=”use_db_free SIGNAL have_free WAIT_FOR finish_show”;
—-当执行到DEBUG_SYNC(thd, “use_db_free”)时,发送”have_free”信号,等待finish_show信号
use abcde;
—-发送have_free,等待finish_show
con2 :
SET DEBUG_SYNC=”now SIGNAL finish_show”;
—-发送finish_show信号
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
安全 数据库连接 数据库
连接池的并发和线程安全
连接池的并发和线程安全
|
1月前
|
SQL 缓存 关系型数据库
Mysql第十四天,Mysql并发参数调整
Mysql第十四天,Mysql并发参数调整
29 0
|
2月前
|
Java 调度 开发者
JDK 21中的虚拟线程:轻量级并发的新篇章
本文深入探讨了JDK 21中引入的虚拟线程(Virtual Threads)概念,分析了其背后的设计哲学,以及与传统线程模型的区别。文章还将讨论虚拟线程如何简化并发编程,提高资源利用率,并展示了一些使用虚拟线程进行开发的示例。
|
2月前
|
缓存 监控 Java
线程池的魔法:Java 开发者必备的并发工具
线程池的魔法:Java 开发者必备的并发工具
46 0
|
3月前
|
存储 缓存 并行计算
【面试问题】JDK并发类库提供的线程池实现有哪些?
【1月更文挑战第27天】【面试问题】JDK并发类库提供的线程池实现有哪些?
|
1月前
|
关系型数据库 MySQL 数据库
深入探讨MySQL并发事务的问题及解决方案
深入探讨MySQL并发事务的问题及解决方案
74 0
|
1天前
|
负载均衡 关系型数据库 MySQL
MySQL-Proxy实现MySQL读写分离提高并发负载
MySQL-Proxy实现MySQL读写分离提高并发负载
|
6天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
8天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
7 0
|
11天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。

热门文章

最新文章