IoTDB 源码调试必备!快速掌握 debug 方法

入门必备!iotdb 源码debug方法!

想要深入了解一个组件,阅读调试源码是不可或缺的一步!本文是基于乔嘉林大佬早期的博文迈出加入 Apache IoTDB 社区的第一步!(订阅邮件、调试代码拓展而来,因为大佬发文时iotdb版本较低为0.xx版本,而新版本架构及源码都作了很多调整,所以整理了最新版本V1.3.1的源码调试方法,供大家参考。

原创文字,IoTDB 社区可进行使用与传播

本地调试

1.拉取源码:

git clone https://github.com/apache/iotdb.git

2.切换到你所使用的版本

比如你正在使用iotdb最新开源版本v1.3.1,那么就直接切换到tags/v1.3.1,并新建分支,或者在git 命令行执行

git checkout -b my_v1.3.1 v1.3.1

3.编译打包源码

执行mvn clean package -DskipTests 进行整个源码编译

编译打包后target/generated-sources/会自动标记为项目源码

注: idea某些版本会有bug不会自动标记,此时引用了thrift和antlr 的模块的类都会飘红

这里是idea的bug,可以参考 这篇文章 执行 File –> Invalidate Caches/Restart,或者直接手动标记iotdb-protocol模块以及iotdb-core/antlr模块将generate-sources阶段生成的${project.build.directory}/generated-sources/thrift${project.build.directory}/generated-sources/antlr4 目录标记为项目源码,之后就可以运行项目啦。

4.开始调试

a.启动ConfigNode

首先我们以debug模式启动confignode,入口为org.apache.iotdb.confignode.service.ConfigNode#main

然后在org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2处打上断点

b.启动DataNode

再以debug模式 启动org.apache.iotdb.db.service.DataNode#main

此时会遇到报错

这是因为confignode源码指定了默认Running mode而在datanode源码中未指定默认的Running mode

我们必须显示的传入,所以我们点击 Edit Configuration,传入参数指定Running mode为 -s

然后再次启动即可成功启动

c.启动Cli

最后我们启动客户端org.apache.iotdb.cli.Cli 并执行sql show cluster details

此时会自动跳转到datanode服务进程的 debugger 里我们之前打了断点的org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2,就可以一点一点查看一个sql的完整执行流程了。_

远程调试

由于平常开发大多在windows或mac环境,部署时使用的一般是linux,个别情况下的兼容问题可能是致命的,且非常难以排查,所以远程DEBUG更能反映出真实业务环境下可能出现的问题,本文以最新版本v1.3.1 iotdb 1c1d单机版为例介绍idea 远程debug 一次sql执行过程的方式。

1. 修改配置文件

首先我们修改common配置文件中查询超时时间
vim $IOTDB_HOME/conf/iotdb-common.properties

# 防止查询超时错误
#query_timeout_threshold=60000
query_timeout_threshold=6000000 

然后执行命令修改datanode启动脚本

vim $IOTDB_HOME/sbin/start-datanode.sh

添加变量

REMOTE_DEBUG=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5791"

然后在launch_service方法中增加

    iotdb_parms="$iotdb_parms ${REMOTE_DEBUG}"

2. 重启iotdb

$IOTDB_HOME/sbin/stop-standalone.sh 
$IOTDB_HOME/sbin/start-standalone.sh 

3. idea配置远程debug

在idea上设置iotdb所在的host和监听的port以及希望debug的模块(这里我们选择根模块,也可选择单一模块),如下:


然后启动远程debug,就可以开开心心的进行远程debug了_

此时在服务器iotdb客户端命令行中输入执行sql

可以看到也是同样的进入了org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl#executeStatementV2


附:iotdb中的一些基础概念

名词 类型 解释
ConfigNode 节点角色 配置节点,管理集群节点信息、分区信息,监控集群状态、控制负载均衡
DataNode 节点角色 数据节点,管理数据、元数据
Database 元数据 数据库,不同数据库的数据物理隔离
DeviceId 设备名 元数据树中从 root 到倒数第二级的全路径表示一个设备名
SeriesSlot 元数据分区 每个 Database 包含多个元数据分区,根据设备名进行分区
SchemaRegion 一组元数据分区 多个 SeriesSlot 的集合
SchemaRegionGroup 逻辑概念 包含元数据副本数个 SchemaRegion,管理相同的元数据,互为备份
DataRegion 一组数据分区 IoTDB 以数据分区(DataRegion)为单位对元数据和数据进行管理,从序列和时间两个维度进行数据划分。
DataRegionGroup 逻辑概念 包含数据副本数个 DataRegion,管理相同的数据,互为备份

希望这篇博文能帮助大家更好地理解 IoTDB 源码调试过程。如有问题,欢迎留言讨论!

作者:老塔_cq

物联沃分享整理
物联沃-IOTWORD物联网 » IoTDB 源码调试必备!快速掌握 debug 方法

发表回复