• 记一次使用elasticsearch遇到bug的探索过程


    背景:

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

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

    过程:

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

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

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

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

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

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

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

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

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

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

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

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

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

    总结:

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

  • 相关阅读:
    [译]WCF RIA Services中的集合(2)
    Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)
    记录来敦煌一周的情况
    Silverlight通过MVVM实现多语言实时切换(含源代码)
    [译]WCF RIA Services中的集合(1)
    Silverlight Client←→Server数据同步备忘代码
    Siverlight5新功能/改进总结
    Expression Blend 5 Preview For Silverlight5 RC已发布
    你应该知道的,那些未在Silverlight5Beta中出现的特性
    .NET数据库编程求索之路1.引子
  • 原文地址:https://www.cnblogs.com/qi-upup/p/13262879.html
Copyright © 2020-2023  润新知