背景:

练习一个小项目,爬取京东的数据,存到ES库中,然后读取ES库中数据,展示到页面上。效果图如下:

涉及两个接口,一个爬取写入ES接口,一个查询展示接口,当我写完代码信心满满准备看看效果的时候,调用爬取接口突然报了异常,因为我也是刚开始接触ES,所以对异常也是一脸的蒙,但本着有问题还是要解决的想法,开始分析原因。异常如下:

过程:

一开始我以为是我的程序并没有连上我的ES库,但是我试了一下查找方法,虽然查回来的数据是空的,但证明库还是连上了的。看着异常,顺着栈针找到自己的代码开始报错的地方,发现是调用ES的client入库的时候报的错,

  1. BulkResponse rsBulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);

在这个地方debug,顺着栈轨迹一层一层的进入,来到了异常栈的栈底,也就是BulkRequest.class ,是这个类的validate()方法,看名字应该是个校验方法,对这个方法一点点看,在debug显示变量值时,发现了异常中的错误信息,那就是这个request的validate()报了现有的错。

"type is miss",type没有找到,ES库中确实有这个要求,但我找了一下代码,发现并没有调用方法传去type的地方,难道是我写错了?翻看了一下教程,发现没写错。找到了写入数据的地方

  1. bulkRequest.add(new IndexRequest("jd_goods")
  2. .source(JSON.toJSONString(jdCommodityInfo.get(i)),XContentType.JSON));

点进IndexRequest(String index),找到了返回的错误信息,

  1. if (this.type == null) {
  2. validationException = ValidateActions.addValidationError("type is missing", validationException);
  3. }

错误的来源找到了,那是什么原因造成了这个错误呢?

回头看了一下我点进来的构造方法,猛的发现,这个构造方法里并没有type的定义

  1. public IndexRequest(String index) {
  2. this.opType = OpType.INDEX;
  3. this.version = -3L;
  4. this.versionType = VersionType.INTERNAL;
  5. this.autoGeneratedTimestamp = -1L;
  6. this.isRetry = false;
  7. this.ifSeqNo = -2L;
  8. this.ifPrimaryTerm = 0L;
  9. this.index = index;
  10. }

怪不得,你都没定义,验证的时候肯定报错啊!难道开源项目百年难得一遇的bug被我发现了,那我以后岂不是要升职加薪,当上总经理,出任CEO,赢取白富美,走上人生巅峰。为了验证我的想法,我找了一个带有type类型参数构造方法,进行了测试。

  1. bulkRequest.add(new IndexRequest("jd_goods" ,"doc")
  2. .source(JSON.toJSONString(jdCommodityInfo.get(i)),XContentType.JSON));

果然能执行成功。想想心里有点小激动,我要立刻去提Issues,去提Pr,不对,等等,我能遇见,别人也能遇见,而且我不是用的最近版本的ES,是不是已经被修复了。找了个高版本的ES代码,打开IndexRequ.clss找到validate(),果然被修复了,type判断已经被删除了。

总结:

虽然没能真正的修复一个开源项目的bug,到时候和同事,面试官好好的吹一下。但这个过程中真的学习到了,解决bug的思路。相信以后遇到未知bug的时候,也能轻松解决。

记一次使用elasticsearch遇到bug的探索过程的更多相关文章

  1. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  2. 解Bug之路-记一次中间件导致的慢SQL排查过程

    解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章 ...

  3. 【分布式搜索引擎】Elasticsearch写入和读取数据过程

    一.Elasticsearch写人数据的过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2)coordinating node,对docum ...

  4. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  5. Bug,项目过程中的重要数据

    作者|孙敏 为什么要做Bug分析? Bug是项目过程中的一个有价值的虫子,它不只是给开发的,而是开给整个项目组的. 通过Bug我们能获得什么? 积累测试方法,增强QA的测试能力,提升产品质量 发现项目 ...

  6. 记一个界面刷新相关的Bug

    今天遇到一个比较有意思的bug, 这里简单记录下. Bug的症状是通过拖拉边框把我们客户端主窗口拖小之后,再最大化,会发现窗口显示有问题, 看起来像是刷新问题, 有些地方显示的不对了. 这里要说明的是 ...

  7. 记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)

    问题描述: 一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”.从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚.但是, ...

  8. [debug]记一次竞态更新bug的解决

    公司的django项目,有一个旧接口,使用POST方法更新用户的一种记录型数据. 这个接口的历史有点长,最早的时候没有那么多需求,只会更新两个布尔字段.后来,加入一个需要高频次记录的字段.这些字段都属 ...

  9. 谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

随机推荐

  1. Python3和Python2中int和long的区别?

    Python3:Python3中int类型的范围是动态长度的,正整数或者负整数,用sys.getsizeof()可以看int占了几位. Python2:Python2中long类型的范围是无限大小.

  2. ping外网:unknown host www.baidu.comc排查

    ping 百度出现:(ping www.baidu.com) "ping: unknown host www.baidu.com"    1.ping 网关确定是否连接上路由器,并 ...

  3. 开发小白可以一年涨薪10w?这份java文档功不可没,学透你也可以

    靠这份文档,跳槽涨薪10K 金九银十的时候我分享了一份面试文档给我的兄弟,没想到这哥们2个月之内斩获数个BAT的offer, 最后选择了一个他最想要去的公司,既然有这么好的效果,我就打算把这份文档分享 ...

  4. <Android> Location Service 分析

    由于各种原因,老师希望我学习Android系统源码以应对可能参与的项目.我只好深入曹营,刺探军情了. 定位服务是手机上最常用的功能之一,据说也是相对比较简单的服务,所以从这里入手.其他系统服务的架构都 ...

  5. 有没有人想和我一起编写 Clear Writer 的?

    合作内容 程序编写 了解 JS.HTML.CSS 等基础前端技能,了解 Electron 开发. 翻译 熟练运用一门外语(中文英文除外),书面表达过关. 报酬 在 Github 上本项目里面的 REA ...

  6. linux安装syncthing

    https://blog.csdn.net/weixin_30527551/article/details/98882344 https://syncthing.net/downloads/ http ...

  7. Excel经典教程之一

    照片名称:未命名 照片名称:自动筛选 照片名称:在Excel中字符替换 照片名称:在Excel中直接编辑“宏” 照片名称:在Excel中为导入外部数据 照片名称:在Excel中行列快速转换 照片名称: ...

  8. c常用函数-strcpy和strncpy

    strcpy和strncpy strcpy在脚本开发中经常用到,例如处理参数等,它的作用是把一个字符串复制到另一个字符串中. strncpy的作用是把一个字符串中的指定长度复制到另一个字符串中,如果指 ...

  9. kafka全部数据清空

    kafka全部数据清空的步骤为: 停止每台机器上的kafka: 删除kafka存储目录(server.properties文件log.dirs配置,默认为“/tmp/kafka-logs”)全部top ...

  10. 使用LaTeX输入矩阵

    当前各种文本编辑器支持的LaTeX数学公式库大多基于KaTeX,或者在Web中用MathJax的比较多,下面给出一种在Web中输入矩阵的例子 $$\left[ \begin{array}{cccc}a ...