作者:戴岳兵

MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:

  • MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.

也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。

而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。

使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:

其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取操作被系统中断打断时才会重试,但是这个重试并没有次数限制。

从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。

同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:

这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时 net->retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。

由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。

socket timeout是什么引起的_MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析相关推荐

  1. 错误处理: socket.timeout: The read operation timed out

    安装包的时候,出现了这个报错 socket.timeout: The read operation timed out 我原来cmd输入的是 pip install timm 问题应该是安装包所需要的 ...

  2. 正常使用 flex profiler 解决 Socket timeout

    将Flash Player debug版升级到10.x后 使用profiler时一直报socket timeout 如果降低到9.x版,问题自然也就解决了,可是很希望使用10.x做debugger 解 ...

  3. python中startout是什么意思_Python socket.timeout方法代碼示例

    本文整理匯總了Python中gevent.socket.timeout方法的典型用法代碼示例.如果您正苦於以下問題:Python socket.timeout方法的具體用法?Python socket ...

  4. Nagios的警报信息CHECK_NRPE: Socket timeout after 10 seconds.

    转载自:http://blog.chinaunix.net/uid-26446098-id-3292730.html Notification Type: PROBLEM Service: ora_l ...

  5. 成功解决socket.timeout: The read operation timed out问题

    我们有时候在pip install 某个包时会出现一大排红色的字,并提示socket.timeout: The read operation timed out的问题,可参考如下解决方法: 换镜像源下 ...

  6. Scrapy使用报错socket.timeout: timed out

    项目场景: 最近在学习Scrapy框架的时候遇到一个很奇怪的问题,为了设置请求时候的随机请求头引入了from fake_useragent import UserAgent,但是启动的时候报错. 问题 ...

  7. mysql命令参数_MySQL命令行参数完整版

    MySQL命令行参数完整版 mysql教程支持下面的选项: ---help,-? 显示帮助消息并退出. --batch,-B 打印结果,使用tab作为列间隔符,每个行占用新的一行.使用该选项,则mys ...

  8. mysql my.cnf 配置_MySQL——my.cnf参数设置说明

    [mysqld] server-id=513306# Mysql唯一标识,一个集群中唯一: port=3306# 服务端口,默认3306 user=mysql # 启动用户,建议用户mysql bin ...

  9. mysql 命令行如何输入参数_MySQL命令行参数完整版

    mysql支持下面的选项:  ---help,-?  显示帮助消息并退出.  --batch,-B  打印结果,使用tab作为列间隔符,每个行占用新的一行.使用该选项,则mysql不使用历史文件.  ...

最新文章

  1. python复数类型的虚部通过什么表示_python复数,python中复数怎么表示
  2. 第三课.Linux代码编辑器
  3. 串口同步异步c语言程序,同步串口spi的c语言编程
  4. python核心编程学习(第四章)
  5. 用python的turtle画炫酷的图-使用Python的turtle画炫酷图形
  6. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)(转载)
  7. 两个整数相加 相乘 有符号与无符号 溢出判断条件 移位与2的幂
  8. Android bootchart(二)
  9. spark 如何用netty实现akka的actor模型
  10. dofilter在java中_在Filter的doFilter中进行重定向 出现异常
  11. arch linux windows,windows+Archlinux双系统安装指南(一)
  12. 解决 Eclipse不支持tomcat9
  13. HTML网页标签代码基本教学(1)基本标签学习
  14. 分享两款免费的-思维导图-Freeplane-Setup,百度脑图
  15. 与 WinHTTP Web Proxy Auto-Discovery Service 服务相依的 DHCP Client 服务因下列错误而无法启动
  16. 第85节:Java中的JavaScript
  17. unity实现游戏中拍照功能(自动生成小照片)
  18. 初学者学习彩铅,那些作品最适合临摹?
  19. window时间同步
  20. KEIL5 MDK编译后出现.\Output\led.axf: Error: L6218E: Undefined symbol SystemInitreferred from startup_解决方案

热门文章

  1. Tomcat就是这么简单
  2. MongoDB解决“Error parsing YAML config file: yaml-cpp: error at line 2, column value(安装服务)
  3. vs 中使用32 位mysql_vs2010连接mysql数据库(含win32和x64两种平台)
  4. MySQL建立多选一列表_如何实现自定义列表的多个item,的单选或多选
  5. python圆面积函数_Python基础函数必学
  6. hive mysql命令,Hive数据库常用命令
  7. spring常见术语理解
  8. java基础 通过继承Thread类和实现Runnable接口创建线程
  9. 天津计算机专业排名2015,2015年南开大学计算机类专业最低分是多少?
  10. java set排序_Java Set排序的方法