可恶,又是个线上问题

这几天,在搞 ShardingSphere,这不又来了一个问题嘛,启动的时候报了一个NPE出来。

可恶,又是个线上问题

好在,这个问题不影响使用,只是启动会报点错,接下来,又是辛苦的排查过程。

直接定位到报错的地方,发现是ShardingSphere在启动时候去加载表一些元数据信息报错,看到这个地方就很明显的猜测是 map 去 get 的时候报错了。

可恶,又是个线上问题

一通往上翻源码,发现这里定义的是 TreeMap,那应该没毛病了,就是上面 dataType 是个 null,所以报错了,可是我还是年轻了。

可恶,又是个线上问题

问题原因

上面我们已经定位到问题出现的地方,接下来就分析下为什么会出现这个问题呢?

从源码看到,主要是在这个地方去加载数据库表的列的元数据信息。

可恶,又是个线上问题

在这个类里发现了拼接的 SQL 查询语句,主要是去查 information_schema 下面的 columns 表。

可恶,又是个线上问题

这时候我想看下这个到底是为啥,于是打开本地 debug 看了一下没有任何问题,然后去测试环境上发现也没有问题,好像只有生产有这个问题。

这个 dataTypeMap 就是列类型的一个映射,但是本地没有办法重现。

可恶,又是个线上问题

本地没有办法的话,那就根据上面的 SQL 去生产库里看了下 COLUMNS 表这个字段有啥问题,查询一看,发现了一大堆的 null,还有一些其他的乱七八糟的类型,那看来 NPE 的原因就是因为这些 null 了。

可恶,又是个线上问题

那这些 null 值是怎么来的呢?根据排查发现都是来自 TIDB 的视图生成的。本地和测试没有办法重现是因为其实用的是 Mysql。

可恶,又是个线上问题

排查

这个环境问题还挺恶心的,因为没有 TIDB 的环境,只能自己装一个了去想办法重现一下了(过程很费时间)。

好在 Mac 装这些东西还是很方便的,安装、刷新环境变量、启动。

1. curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
2. source ${your_shell_profile}
3. tiup playground

然后本地按照那个很沙雕的创建视图的方法创建个视图出来,再本地 DEBUG 看看。

进来一看,和开始想的不一样,居然是个 null 字符串,不是我想象中的 null,那这个看起来不应该会报空指针才对啊?!

可恶,又是个线上问题

有点想不通为啥这里会空,然后打开这个类看了一眼。

嗯???

这尼玛??

?????

难道是拆箱导致的?

可恶,又是个线上问题

好吧,没错。 dataTypeMap.get(dataType) 是 null,拆箱调用的啥我不用说了吧,就是这原因。。。

修复

你说咋改?

有同学说了,那还不简单,你是个沙雕吗?改成 Integer不就完事儿了。

嗯,你说的没错,我就这么改了。

然后,改完之后启动又是一堆报错,到处存在调用。

这玩意儿不能动,他仿佛在和我说,你动动试试,果然动动就逝世。

可恶,又是个线上问题

文章写到这里,我还没想好怎么改,大概有 3 个方案:

  1. 完全去掉 TIDB 还用视图这离谱的操作,从根源上解决问题
  2. 按照这个方法,改成 Integer,就是不知道要改多少地方
  3. 不去加载视图的元数据,就可以避免这个问题了,毕竟这年头谁用视图啊

给大家个机会,去给他们提个 PR。

Original: https://www.cnblogs.com/ilovejaney/p/16730613.html
Author: 艾小仙
Title: 可恶,又是个线上问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/801891/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • AI数字绘画 stable-diffusion 保姆级教程

    简介 近段时间来,你可能在不少地方都看到了非常多这样的好看的画。 比如这样的赛博朋克风 prompt: Cyberpunk, 8k resolution, castle, the …

    Python 2023年10月27日
    029
  • Selenium+pytest+allure踩过的坑

    一、多进程运行报错 虽然pytest能设置并发,貌似不能对一次运行中的不同用例设置不同的并发数,所以加入了多进程。这里使用了继承式调用: from selenium import …

    Python 2023年9月10日
    053
  • python反爬与反反爬 (二) ajax

    文章目录 反爬 爬虫 * 方案 – 1.解析js 2.selenium + 下载selenium 下载Chrome驱动 添加到环境变量 编写代码 反爬 ajax使用js…

    Python 2023年8月13日
    075
  • GO语言学习——包(package)

    包(package) package packagename 其中: package:声明包的关键字 packagename:包名,可以不与文件夹的名称一致,不能包含 &#8211…

    Python 2023年6月10日
    082
  • Django中HTML判断等于/不等于/包含/不包含某个字符

    django中一个变量与某个值进行比较, 显示不同按钮 Django中{% ifequal A B %} 用来比较A和B两个值是否相等,{% ifnotequal A B %}` …

    Python 2023年8月4日
    0169
  • Python爬虫学习:Cookie 和 Session 的区别是什么?

    Cookie意为”甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscap…

    Python 2023年10月30日
    057
  • Python学习.iloc和.loc区别、联系与用法

    最近接触到数据科学,需要对一些数据表进行分析,观察到代码中一会出现loc一会又出现iloc,下面对两者的用法给出我的一些理解。 1.联系 (1)操作对象相同:loc和iloc都是对…

    Python 2023年8月15日
    064
  • python:playwright结合pytest执行用例

    playwright结合Pytest为您的 Web 应用程序编写端到端的测试。 安装pytest插件 C:\Users\lifeng01>pip insta…

    Python 2023年9月10日
    052
  • 关于Django 部署(uwsgi)的记录

    sudo pip install virtualenv sudo pip install virtualenvwrapper mkdir ~/.virtualenvs vi ~/….

    Python 2023年8月6日
    034
  • 地下城地图图块生成算法

    生成地下城,包含房间和迷宫通路。 一. 概述 生成地下城,包含房间和迷宫通路。类似: 示例效果一 示例效果二 二. 思路 1.生成迷宫通路 从房间的边缘坐标XY为奇数的格子生成迷宫…

    Python 2023年10月13日
    050
  • 【盘点】Python机器学习常用的10个库!

    推荐文章 很多小伙伴都发现了,用户自主「申请上首页」的按钮取消了,那博主们写的文章还有上首页曝光的机会吗?我们的回答是”当然有!!!”虽然我们取消了上首页申…

    Python 2023年5月24日
    0102
  • Django的项目建立

    系统:CentOS7 系统版本:7.6 内核版本:3.10.0-957.el7.x86_64 python版本:3.6.8 Django版本:2.1.10 一、创建Django项目…

    Python 2023年8月4日
    065
  • Python中OpenCV库(二)

    OpenCV库(二) 五、 图像直方图 1、 基本概念 2、 统计函数 3、绘制直方图 3.1 matplotlib 3.2 OpenCV 4、 使用掩膜的直方图 六、 视频采集 …

    Python 2023年6月9日
    083
  • redis持久化机制

    踢一场足球需要很长的时间,那么就需要充足的体力来支撑。那么redis中的持久化机制是怎么样的?接下来就来聊一聊。每一个足球运动员的身体是真的强,为了胜利,在大草原上奔跑,那个路程我…

    Python 2023年9月30日
    032
  • python贪吃蛇游戏运行时窗口黑屏_Pygame窗口显示空白黑屏

    问题:缩进误差 您的game_intro()函数已定义,但从未调用 您写了gameDisplay而不是screen4次,也用display_width, display_heigh…

    Python 2023年9月21日
    061
  • pytest简介

    目录 一.Pytest介绍 二、安装 三. 执行方式 四、Pytest常用命令 五、pytest测试框架中的setup和tearDown 六、allure2生成报告 七、失败重试插…

    Python 2023年9月11日
    034
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球