mysql in溢出bug和排查经历

经过提示,发现:idea翻译一下源代码以后就会变成varX。
我看了一下github,代码似乎不是这样的。
这是mybatis里面io / defaultVFS的代码:

    protected boolean isJar(URL url, byte[] buffer) {
        try {
            InputStream is = url.openStream();
            Throwable var4 = null;

            boolean var5;
            try {
                is.read(buffer, 0, JAR_MAGIC.length);
                if (!Arrays.equals(buffer, JAR_MAGIC)) {
                    return false;
                }

                if (log.isDebugEnabled()) {
                    log.debug("Found JAR: " + url);
                }

                var5 = true;
            } catch (Throwable var16) {
                var4 = var16;
                throw var16;
            } finally {
                if (is != null) {
                    if (var4 != null) {
                        try {
                            is.close();
                        } catch (Throwable var15) {
                            var4.addSuppressed(var15);
                        }
                    } else {
                        is.close();
                    }
                }

            }

            return var5;
        } catch (Exception var18) {
            return false;
        }
    }
}

大概几个月前,遇见一个很难排除的bug。
很多人看我的文档,都以为我写的内容是:系统出了bug,所有的人都束手无策,这时候我蹦出来,三下五除二直接解决。
其实不是,真实的情况是:项目经理老菜鸟看着我这个小菜鸟,两个人开始分析、讨论、分锅、吵架。
两个菜鸟盯着一个bug一起修,修不完第二天继续修。最多的一次一个bug修了五天,吵了大概十个小时。快的bug大概七八个小时能搞定。有时候不止两个人,四五个人一起修。
有的时候是项目经理全责,有的时候是我全责,有的时候已经离职的开发全责。
最后简化一下过程,分析一下故障原因,如果当天记录的就几千字起步,如果不是当天那就只剩一两千字了。

这次的bug是个老bug。
系统的业务逻辑是这样的:XX用户买了100只鸡,这一百只鸡的名字是:鸡1、鸡2 ……鸡100。
我们的每个产品都有自己的名字,比如用户买100头驴、200只鸡、300只鸭子,我们的打的单据是:

  • 用户买100头驴、200只鸡、300只鸭子
  • 用户买的100头驴的名字是驴1、……鸡的名字是:鸡1……鸭子的名字是:鸭1……

假如有人说:为啥一只鸭子也要有编号?你直接计数鸭子数目不行吗?

  • 问用户,用户要求系统这么设计。
  • 我们的每个产品贵的几万一年,便宜的几百一个,起个名字卖给谁了、用了多久。

有一天,用户有一个正常的业务卡住了。
点击没反应。

项目经理和我一起排查这个故障,我花了五分钟直接定位了:不是用户的问题,我们系统崩了。
项目经理他不承认,他认为是我推卸责任:正常修bug不是这么快的。
于是项目经理就往前端写入数据,提交。我认为不是这个问题,所以袖手旁观。(我们一起修bug)
名场面来了:
用户提供的数据有300条,他用CV大法输入了300次,选了半个小时,然后点提交,卡死了。
项目经理不死心又刷新。前端的数据全丢了。
项目经理还是不死心,又把300条数据全部从前端输入。又丢了。


我是真的很无语:你说他不负责任吧,他勤勤恳恳的把300个数据输入进入系统,与工作态度上和袖手旁观的我天壤之别。


说他能力强吧。给他说:前面有个沟,他说:有沟我还要往前走!!!
摔的眼泪汪汪的,又可气又可笑。
我还能害他不成?我给他说前面有沟就看一下啊!

我是如何快速定位bug的呢?
是这么回事:

我们有一个用户买了价值几百元的设备,买了一万多个。
那时候我记得另一个项目组的开发说过in有最大值限制,这时候正好用得着。
bug直接排除。mysql in里面最大是1M的报文,oracle是1024个。我们用的mysql。

我直接认为是sql in炸了。单个sql可能超过1M的限制了。
PS:之前看小说斗破的时候,那个小说大概10M左右???我们单个sql1M,十个sql一本斗破。

// in里面一万条数据
select * from t1 where id in (……………………)
update t1 set condition = 1 where id in (………………)

第二种可能:select in是O(MN)的时间复杂度,估计这个sql正跑着呢,(我怀疑是第二个update炸了)

项目经理对我表示:这个业务很重要。你处理一下。
我不为所动。


干啥啊?SQL炸了,开发全锅(虽然写这个代码的人离职了,但是继任的开发接起来啊!!!数据量过大系统就炸咋做的功能??测试呢?咋通过的测试用例?)
价值千万的一条工单卡单?我担得起这个责任吗?

就算我解决了,那也应该往上抛,给开发改代码啊!系统下一次卡单也让我刷?

我认为流程是:去找开发。可是项目经理不想去找。

  • 我们系统的开发是摊派过来的,负责多个系统,所以修bug要排期。
  • 项目经理给开发安排任务,不给钱不给奖金也没有绩效,所以能拖就拖。
  • 项目经理和开发同级

项目经理去求开发,任务直接排到这个周周末了,还得项目经理催。
用户可不会领会这一套。
有人说:你忍心让你项目经理吃这个苦?

  • 他薪资是我的4-6倍。我操这个心干嘛。能者多劳,拿了这个钱可是烫手的很。
  • 开发代码有问题,你让开发给我讲业务逻辑,把bug修了。可以;你给源代码让我自己看,也可以。什么都不给你让修,修啥修。
  • 几千万的业务,刷错了责任谁认? 刷错了,那我可是真的全责哥了。

这时候,项目经理的将驴脾气上来了:我认为这个业务很简单啊!
之前在大学的时候,遇见过很多这样的人:不管多难的问题就认为很简单,无脑接下来;过了几天就开始哭鼻子。
项目经理一个是没办法,一个是人自负。麻溜的接下来了。

这个业务是这个样子的:改数据的话需要修改大概10多个业务表。业务逻辑是比较清晰的。
项目经理他脑子是一团浆糊,半懂不懂的。你让他去刷数据要了他命。一个业务十个表,还有其中的映射关系够令他头大的了。
忙活了大概4个小时,啥也没做出来。

  • 我们系统报文是Json,项目经理看不懂Json。我给他说Json可以直接解析出来看,他说JSON解析了以后丢格式。
  • 他想写个sql替换掉Json报文中错误的部分,然后问我如何用replace替换Json格式。
  • 处理不了以后,他就把JSON当做字符串,用\n把数据拆分了。看着Json看不懂,问我为啥(格式都裁错了当然看不懂)
  • 我给他说,你看键值对,他说他不懂啥叫做键值对。让他括号分隔,他非要/n分隔(因为核心业务在列表里面)

这几板斧下去,是个人就知道和他说话费脑子。
懂业务啥啊,网上关于JSON的课程就一个小时包教包会,你四个小时够看四遍的。你不看JSON解析抱着你那三板斧不放???

我看不下去,给他补了。补了大概半个小时。
坏消息是:补错了。

为啥补错了呢?

  • 我没有技术文档。也没有给源代码。我实际上是不知道这个业务执行了哪些sql……只能靠经验瞎琢磨。
  • 所有的东西都在我脑子里面存着,可是取出来的时候取错了。
  • 一般计费的业务我是死活不碰的,这个业务也就刷了两三次,业务不精。

我一时犯浑,弄错了一个字段。

责任在我。


过了几天,用户找过来了:数据没有。
项目经理又是在系统几十个表里面查。最后定位到是我的问题。
因为出的问题是比较简单的,所以直接排除了。


项目经理又不高兴了:你干的是啥啊!!!拍着我肩膀说:下一次上上心。
真·全责哥。你说你可以刷、你刷了、你弄错了,你当然全责。对吧?


工作本应该是开发、项目经理负责的。应该他们两个人把bug修了。
开发啥也没做,项目经理啥也没做,非逼着维护不按照业务流程刷数据。干完了以后对了一点奖励没有、不领情,出了问题维护又全责。
保证没有下一次了,下一次让你自己去找开发去。

 

作者:青碧凝霜
链接:https://leetcode-cn.com/circle/discuss/c40Pde/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值