一次奇怪的的bug排查过程
公司对底层基础库进行了重构,线上稳定跑了几天,在查看订单系统的log时,有几条error信息非常的奇怪,
orderID:80320180 statemachine error: no event [Revoked] at current state [Paid]
orderID:81983045 statemachine error: no event [Refund] at current state [Revoked]
订单有状态机进行维护
- 已经被撤消的订单不能再进行有其他操作,和状态更改。
- 已经支付的订单,不能被撤消,只能退款或者部分退款。
这两条log虽然没有太大问题,关键问题在于,正常情况下,这条log就不应该被执行,所有对订单进行操作的接口,都会判断订单的状态,如果订单已经支付,撤消就会直接当做错误的操作,返回给客户端error,这条log所在的地方是不会被执行到的,总结和排查问题
- 这个错误不是每天都有,偶尔会被报出来
- 有旧的镜像在跑旧的业务代码导致的?查看
k8s镜像信息,没有问题。 - 并发问题导致的?规定在操作订单的时候都是行级锁,再判断订单状态的,但需要排查一下业务代码,是不是有哪里有没进行锁行操作,导致代码被重入了?好在
Log也有链路id可以根据trace-id来确定是哪个接口调用,就能很快定位到问题所在的地方,

根据trace-id追踪发现了一个新问题,查不到数据,只有那一条错误log,查看代码,这个系统的trace在初始化的时候不知道什么时候被改错了。
先修复trace-id的问题,但对当前的问题也没啥用了,等上线后,还不知道这个问题啥时候能复现呢。
只能用最笨的办法一点点的排查代码了,对所有操作订单的地方进行检查,代码没有问题,又检查了一遍还是没有问题,突然脑子里冒出个段子:难道是神密力量导致电缆里的几个bit出了问题,导致我们的代码运行异常了?哈哈。
又检查完一遍业务代码还是木有问题。数据库的问题?那还不如是系统的bug呢。
这时候同事导出一份CDC数据,根据这些数据查看订单支付状态,从2->3->2 变回去了,正常流程下不可能有这样的情况发生,100%确定就是系统的问题,但业务代码中没有看出问题来哇!

再debug看一下数据库(postgresql)里事务的执行情况,
找一个事务的pid

到数据库pg_stat_activity里观察执行情况

发现一个更奇怪的现象,无论我执行插入还是执行修改操作query字段里一直都是BEGIN READ WRITE,sql没有在事务里执行?再一步的深入查看代码,一直到基础库的代码终于发现了问题的原因,公司的数据库基础库封装的有问题,在创建创建事务的时候正确创建了tx

但在执行具体的sql时没有使用tx

因为sql没有在事务里执行,我们的行锁也没锁住,为了验证我是正确的,写gotest创建两个事务,第一个事务,不提交也不回滚,正常情况下,第二个事务,会一直等待第一个事务。

果然,直接就打印出来两个结果,没有锁住,再结合CDC数据中看到的状态也就能说通了,代码被重入了,哪怕有问题 rollback也不能把已经执行的sql回滚。
终于找到原因了,没白浪费这么长时间,修改代码

再执行代码观察事务

query里有正常的数据了。基础库的问题,在业务代码的各种测试时都是按正常流程进行的,所以也测试不出一来,盲目的相信业务代码,虽然业务代码确实没有问题,如果能早一点进行锁的测试就能更快的定位到基础库的问题。提交MR修改引用的项目,等低峰上线。
不起眼的错误log信息,一定要重视,说不定就是个超级大bug在兴风作浪,或者是两个 ( ̄^ ̄)
一次奇怪的的bug排查过程的更多相关文章
- 年年出妖事,一例由JSON解析导致的"薛定谔BUG"排查过程记录
前言 做开发这么多年,也碰到无数的bug了.不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因. 但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我 ...
- 解Bug之路-记一次中间件导致的慢SQL排查过程
解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章 ...
- 解Bug之路-记一次存储故障的排查过程
解Bug之路-记一次存储故障的排查过程 高可用真是一丝细节都不得马虎.平时跑的好好的系统,在相应硬件出现故障时就会引发出潜在的Bug.偏偏这些故障在应用层的表现稀奇古怪,很难让人联想到是硬件出了问题, ...
- 记录一次数据库CPU被打满的排查过程
1 前言 近期随着数据量的增长,数据库CPU使用率100%报警频繁起来.第一个想到的就是慢Sql,我们对未合理运用索引的表加入索引后,问题依然没有得到解决,深入排查时,发现在 order by id ...
- wordpress插件bug排查后记(记一次由于开启memecached引起的插件bug)
这篇文章是写给自己的. 周三的时候我在维护公司的一个wordpress项目页面时发现了一个非常奇怪的情况:当我尝试更新网站上的一个页面后,在wordpress后台的编辑器中发现其内容并没有按我预期的将 ...
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
- CentOS 7.1系统自动重启的Bug定位过程
[问题] 有同事反应最近有多台MongoDB的服务器CentOS 7.1系统会自动重启,分析了下问题原因. [排查过程] 1. 检查系统日志/var/log/message,并没有记录异常信息,jou ...
- 一次压力测试Bug排查-epoll使用避坑指南
Bug复现 使用Webbench对服务器进行压力测试,创建1000个客户端,并发访问服务器10s,正常情况下有接近8万个HTTP请求访问服务器. 结果显示仅有7个请求被成功处理,0个请求处理失败,服务 ...
- 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...
随机推荐
- 内网渗透DC-1靶场通关(CTF)
最新博客见我的个人博客地址 DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题. ...
- AIbee 笔试
CSS选择器 div+p 选择紧接在div元素之后的所有< p >元素 C++删除数组最后一个元素. 例如[1 2 3 4] 最后变为 [1 2 3] 用splice的删除,增加和替换 a ...
- 全连接层dense作用
参考来源
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
- 进阶区forgotg攻防世界
攻防世界进阶区--forgot 前言,这题中看不中用啊宝友!!! 1.查看保护 第一反应就是蛮简单的,32位. 2.获取信息(先运行程序看看) 装的可以,蛮多的东西. 但是就是中看不中用 3.ida ...
- [火星补锅] 非确定性有穷状态决策自动机练习题Vol.3 T3 && luogu P4211 [LNOI2014]LCA 题解
前言: 这题感觉还是很有意思.离线思路很奇妙.可能和二次离线有那么一点点相似?当然我不会二次离线我就不云了. 解析: 题目十分清真. 求一段连续区间内的所有点和某个给出的点的Lca的深度和. 首先可以 ...
- Qt字符编码小知识
1.VS2010默认编码是GBK,Qt5的内置编码是utf-8,想要在VS2010及其以上版本,优雅的使用utf-8的字符编码需要 // Coding: UTF-8(BOM) #if defined( ...
- Python爬取COVID-19疫情监控实战
一.项目概述 本项目基于Python.Flask.Echarts打造的一个疫情监控系统,涉及技术: Python网络爬虫 Python与Mysql数据库交互 使用Flask构建web项目 基于Echa ...
- best-time-to-buy-and-sell-stock-iii leetcode C++
Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...
- LCA-离线tarjan模板
/* *算法引入: *树上两点的最近公共祖先; *对于有根树的两个结点u,v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u,v的祖先且x的深度尽可能大; *对于x来说,从u到v的路径一定 ...