miniob比赛实录

参加比赛 OceanBase 社区,初赛阶段基于 miniob,在此记录全过程。

环境准备

安装docker

为了防止 c 盘爆红,创建软链接,将 dockerimages 迁移到D盘。windows10 docker 安装在D盘_凉晓风的博客-CSDN博客_docker安装在d盘 我这里在迁移images的时候使用的也是软链接的方法,路径为:C:\Users\%username%\AppData\Local\Docker

之后打开docker报错,参考 安装docker报错Hardware assisted virtualization and data execution protection must be enabled in the BIOS_松松哥、的博客-CSDN博客_virtualization and data execution protection enabl ,解决了,其中需要多次重启才能生效。

换源,docker设置里docker engine,最后添加

1
2
3
"registry-mirrors": [
"https://9cpn8tt6.mirror.aliyuncs.com"
]

拉取镜像并运行

oceanbase/miniob - Docker Image | Docker Hub官方拉取,cmd执行

1
docker pull oceanbase/miniob:1.0.1

docker images 栏可以找到拉取的镜像,run,设置参数,启动时可以配置共享文件夹。

run 的时候展开 Optional settingsVolumes 是设置共享文件夹的,配置示例如下:

1
2
Host path: D:\work
Container path: /shared
  • 主机路径文件夹需要存在,直接复制路径即可
  • 容器内路径需不存在,前面要有斜杠,示例会在容器的根目录下创建,进入主机默认root目录,需要通过cd ..回到根目录查看

编译运行miniob

看官网OceanBase 社区 视频,《MiniOB上手操作指南》,由于拉取的镜像已经配置了依赖,不需要编译安装前面的依赖,直接到后半部分编译miniob

由于我多次尝试(因为一直报错,编译运行踩坑),已经熟练的让人心疼,在此默写一下。

编译

miniob的项目文件夹下:

1
2
3
4
mkdir build
cd build
cmake ..
make -j

其中cmake .. 可以改为 cmake .. -DDEBUG-ON,这样是编译debug模式

运行

build目录下,启动observer

1
./bin/observer -f ../etc/observer.ini

出现 successfully load …即表示成功启动,详情见踩坑:运行observe卡住

新开终端,同样在build目录下,启动obclient

1
./bin/obclient

可以输入help;查看帮助,注意help后面有个分号,支持部分基本的sql语法。

编译运行踩坑

找不到jsoncpp.so.25

从官网拉取的镜像运行observe的时候会报错,找不到jsoncpp.so.25,费了九牛二虎之力,一开始怀疑是不是从官网拉取的镜像没有安装依赖,反复确认官网上清楚写了已经包含依赖,而且找系统的lib是可以看到别的依赖的,就是找不到jsoncpp.so.25,于是各处寻找这个链接库。

从一篇博客linux添加库后出现 error while loading shared libraries: libjson.so_sail0323的博客-CSDN博客中看到,很多so会放在/usr/local/lib,找了一下发现没有,灵光一现打开lib64看了一下,真的有!根据这篇博客的说明,修改/etc/ld.so.conf,添加一行/usr/local/lib64,保存后退出,ldconfig更新配置。

运行observe卡住

解决了上面的问题,运行observe的时候,卡在successfully load …,然后就一直没有动静了。

最初仍然怀疑是官网拉取的镜像没有安装依赖,再次多次反复确认。决定把官网上的三个镜像都拉下来试试,发现latest1.0.1应该是同一个,1.0.0版本没有找不到jsoncpp.so.25的报错,但是同样会卡在successfully load …,然而官网给的演示视频是可以输出一大堆东西,最后有一个成功连接service

尝试了很久决定先去吃饭,给它一个小时时间,回来后很惊讶的发现,成功了!!!异常高兴,大喊大叫,手舞足蹈,平复心情,定睛一看,幻视了,只看到了success,仍然卡在successfully load …

网上寻求解决方案,看到一位老哥,在别人有关miniob的博客下评论卡在successfully load …,不止一个地方,然而没有回应,我不是孤单一个人。

正当我准备放弃docker,考虑转向虚拟机自己配置环境,看到了有日志文件,想着看看日志文件兴许能找到哪里出错了,是不是没有依赖的问题。打开一看,日志文件和演示视频里面的输出几乎(因为没仔细看)一模一样,于是准备observer在这里放着,去打开obclient试一下,成功了!!!这次是真的。

破案了,猜测可能是docker里命令行没有捕捉到这些输出?或是不能成功显示输出?导致了我的界面和演示视频里的不一样,以为自己的卡住了,其实服务已经成功启动。

创建上传docker镜像

因为自己淋过雨,所以想给别人撑把伞

我把oceanbase/miniob:1.0.1的镜像拉下来,解决了找不到jsoncpp.so.25的问题,并且直接编译了一下,这个版本可以直接成功运行miniob,感觉这个对新入手是很重要的,环境报错真的很搞人。

其实做这件事的主要动机是,和室友组队参加这个比赛,我帮他配环境,重新配一遍的话不如我直接打包镜像发给他。其实也不完全是这个,因为在他上面配一遍肯定比我在自己电脑上配一遍再打包再上传要省劲,也是为了自己可以尝试一下怎么创建上传镜像。往大了说可以让所有看到的人都可以用。

拉取命令:

1
docker pull cherish7812/miniob:1.0

根据教程Docker 容器创建镜像并提交到Docker hub_xinaml的博客-CSDN博客来创建提交了镜像,不在此赘述了。

需要提一下的是,偶然看到,push 的操作可以直接在docker图形化界面里点一下,images里选择镜像,点击三个点的按钮,push to hub

编写调试环境

vscode 连接 docker

寻求一种使用本机vscode连接dockercontainer的使用方法,首先想到的是通过ssh连接,很不妙,最开始花了一天时间研究这个问题,因为我这个的环境比较复杂,首先拉取的镜像是centos系统,不是我之前虚拟机常用的ubuntu系统,apt-get都没有,使用的yum来安装包。其次docker是基于wsl2的,而且不能改回去原来的基于什么什么的,据说基于wsl的性能会更好。

只说遇到最终把我卡住的错误吧,安装ssh后需要重启服务,使用systemctl命令,会报错,提示不支持。查了一下是因为使用了wsl的原因不支持这个命令。查到一个可行的解决方案是使用大佬写的python脚本代替这个命令,但是需要安装python2,感觉太麻烦了,就放弃了。

所以前期只能将就凑乎着使用共享文件夹的方式,也就是本机vscode编辑一下,进入docker里编译运行。最开始也不是不能用,但是后面开始写的时候需要调试,因为代码实在太多了,不知道问题出在哪里。

无奈又尝试vscode连接的办法,又研究了半天ssh怎么连,不断尝试,无果。

最后突然点了一下vscode远程资源管理器里的container选项,直接就出现了docker里的container,一键连接成功!可能是我装了docker插件的缘故,这里直接无需配置就可以连接。

此时悲喜交加,喜是一定的,悲是因为折磨了我两天的问题,居然一键就可以解决,哭哭。

vscode调试miniob

最初并没有想构建调试环境,因为我知道这个会很难。但是写第一题的时候就遇到了问题,由于代码太多,压根不知道在哪一步出错的。只好来构建调试环境了。

根据使用vscode编译、调试miniob源码_夏 克的博客-CSDN博客教程,复制了一下他的launch.jsontasks.json,在此前完全不知道这些是干嘛的,没想到一天之后会如此熟悉。最初遇到的问题是,launch.json里报错:cppdbg无法识别,在容器内安装了c/c++插件,就好啦。

重新运行debug,成功启动,一切仿佛井然有序。可是我发现有些跳不到函数里面,就感觉有些跳转进不去,点击运行下一步,没有跳转,但是也没有出来,不过可以看到局部变量那里变化了。点开了调用堆栈,发现有的调用被折叠了,点击后显示找不到文件。我直接用“转到定义”找到那个文件,打了断点,却不会停在断点处,旁边显示这个断点不会生效。

大致知道了是因为调试器找不到文件对应的位置,搜了很多很多,改了很多很多,折腾了一下午加一晚上,硬刚了六七个小时吧。感觉自己已经把能找到的相关的博客里面的解决办法都试了一遍了,还是不行。其实是因为搜到的大多不是这个问题,一般是无法调试,就是连main都找不到,我这个只有部分可以找到,文件夹层数深了以后就找不到了。

后面不断的看代码,搜一些资料,发现extent “C”,搜了一下说这个是指示要用c来编译这段代码。找不到的那个文件不是一般的文件,我发现一般都是.y.c文件,不是典型的cpp文件,猜测可能跟这个有关系吧。

到了晚上快十一点,想到了一个最笨也最聪明的办法,调试器会指示说,在这个路径下找不到这个文件。而我是知道文件在哪里的,那我就在它找不到的位置创建一个文件,把代码复制过去,就可以正常调试啦。实测这个办法是可行的。有弊端是,如果文件很多需要创建很多,不过我调试一部分创建一部分的文件,也就四五个,还是可以接受的。还有个弊端是,两个文件夹内容同步的问题,改初始的,被复制的也要记得更新。

开始编程

select meta

不过上面那些弊端都不重要,因为我发现我根本看不懂这些代码,太多了,还有什么.y文件,好像是做语义分析的,这个文件里面还不能打断点,调试起来贼麻烦。一步步调试,看了一个多小时,大概知道在哪个地方出错了,可是这个文件也太大了,根本不知道改哪里,怎么改,第一题就这么难。

放弃了。

第一题改了一个错误提示,通过了一个测试用例,只差一个测试用例:

1
select *, address from t;

题目说明里面说要实现这种 *,id的例子,不用实现id,*这样的。可是在我调试的过程中发现,这个在语法解析阶段就会被pass,返回sql parse error。那个官方给的学习视频里讲了怎么实现select meta,但是讲的后面那个阶段的,这个在语法阶段就被毙了。乱起八糟的文件格式,是真的不熟悉。在这里卡住了,准备不弄了。

意难平

我还有别的作业,还有别的要学习的内容,肯定不是太闲的。而且这个比赛虽说奖池丰厚(30w+),但是只有前十二名可以拿到,那对于我这个四天没有写出来一道题的人来说肯定是没有希望了。所以我最应该做的事情就是战略性放弃这个内容。

但是想了想,主要还有老师会开会让汇报进度,一个是我数据库实验老师,一个是我数据库理论老师,直接放弃可能给老师留下不好的印象。

还有就是,我超级不服的,为什么一题都写不出来,有个队伍已经把全部的写出来了。

思考再三,最终还是选择follow my heart,我就不信了,再换一题试试!

drop table

这个题目多次被老师提到,课程里面也有专门介绍的视频,源码级别一步一步教着你敲,感觉很不错,希望可以写出来这个建立自信。

半个小时的视频,跟着一步步敲了一个多小时,还挺麻烦,不断的分析代码,找接口,实现资源的释放。其中有两步看出来他是手误,我直接写成了我认为正确的。

终于跟着写完了,看着他(视频里面)开始编译,报错,改错,再编译,再报错,再改错,还好这两个错误是我本来就发现的,我直接写的就是对的。

再然后,他又编译了一次,又报错。只听他深深吸了一口气,说不改了。然后回退到他原来写好的版本上,说运行一下给大家看看效果。好的,效果看完了,可以正常运行。

你问我然后呢?然后他就说“谢谢大家,今天的视频到此结束”。就。。就这?我代码呢,你写错了我可以理解,你倒是改对呀。你改不对我也可以理解,反正你之前写过对的,那你倒是让我看看呀,对的代码一眼没看,视频结束啦。

我跟着他写了一个多小时的代码,收获到的是一堆bug,然后他给我看了看正确的运行结果,就没了。

视频最后还欢迎我进入群交流,我是要进去骂你吗?

彻底伤心了,不在这个比赛上浪费时间了,可以看出来这个视频做的一点都不用心,我就不懂了,为什么错误的写代码过程还要放上来,然后不了了之。

结论就是这个比赛据它自己说是从0开始,其实根本不适合从来没有接触过这个项目的人参加,教程做的不详细,甚至不正确。

官方的docker镜像环境都有问题,录制的教学视频跟着做下来跑不了,及时止损才是明智之举。

然而,老师召集我们开了一次会,发现我居然在十几个队伍里面进度还是比较快的,甚至可以说是名列前茅。只有一个三个研究生本命还是做数据库研究的团队得了120分,还有一个队伍是20分,有五个队伍十分,别的队伍连提交都没有。也就是大部分人(一共14个队伍)基本上要么搭建不了环境,要么不会用git,要么还没开始弄。

仅有提交代码的也是没什么太大希望了,保守了,没有任何希望。

但是老师说那个华科大老师讲义中有源码级别的drop table,我看了一下还真是,瞬间手又痒痒了,又花了一个晚上的时间开搞。

结果这个也没好到哪里,直接抄不行,只有实现,需要在include中加声明(还是王运来(就上面被我骂的那个)教我的),不过这都是小事,有的代码还是会报错,好像是因为这个是之前的版本,很多地方不一样,费了九牛二虎之力,终于可以运行了,提交一下没过。

啊啊啊啊啊,又浪费了一晚上的时间。

追加内容

vscode 快速搜索文件

在写这个miniob的工程的时候就一直需要搜索文件,看录制视频的老师用命令行有快捷搜索的功能,很方便我只能靠人眼搜索。因为vscode在文件列表里面只能搜索已经展开的文件夹,也没有找到全部展开的功能,有时候会全部打开再搜索一下。

放弃这个比赛后,学习别的过程中,偶然发现,按两次shift键会打开文件搜索,可以搜当前工作目录下的所有文件,跟老师那个功能很像,这个在写大的工程项目的时候应该很有用吧。

然而在我手痒没忍住又去做了的时候,发现在container里两次shift调不出来快速搜索,不知道是插件的缘故还是设置的缘故。