2022 OceanBase 数据库大赛FAQ

一、 大赛基本信息

1、大赛报名链接:OceanBase 社区

2、《从0到1数据库内核实战教程》视频学习:OceanBase 社区

3、初赛赛题+提测平台链接(查看赛题和提交代码):OceanBase 社区

4、初赛提测平台使用说明:训练营使用说明

5、MiniOB GitHub 使用说明:https://oceanbase.github.io/miniob/game/github-introduction.html

6、初赛代码GitHub:GitHub - oceanbase/miniob: MiniOB is a compact database that assists developers in understanding the fundamental workings of a database. (分支: miniob_test );

二、 常见 FAQ

为什么我报名了大赛,官网却看不到我的报名信息,显示我未报名?

答:报名信息只有当时报名的那个同学的帐号才能看到信息,只需确认队长/队友在报名的时候填写了你的信息即为报名成功。个人帐号未看到自己的报名信息也不用紧张,最后是以队长提交的报名信息为准。

临时想要换队伍,可以换么?如何换?
答:换队友时间截止到10月25日,请大家10月25日前务必确认好队友,过后不允许更换。

修改报名信息流程:点击大赛报名链接——登录社区官网帐号——点击【报名信息】

——点击右下角的【编辑】——进行报名信息的修改即可。

大赛报名链接:OceanBase 社区

目前还没有队友,官方能否帮助寻找队友?

答:可以的。可以添加小助手微信(微信号:OBCE666),邀请你进组队群。

为什么会导致 拉取测试时目录创建失败?

答:官网注册用户名字含特殊字符(如空格、\、/、:、*、?、"、<、>、|等),将导致拉取测试时目录创建失败。可以在oceanbase官网中修改自己的名称,不包含特殊字符,然后重新提交测试即可。

typecast的时候float转string需要遵循浮点数输出规则吗?就是1.234是转换为"1.23"还是"1.234"

答:为了方便,统一将浮点数转换为保留两位小数的字符串,并且去掉多余的’0’和’.’,参考函数 std::string double2string(double v);

本地运行正常,但是训练营上提示程序运行着就没有自己的输出了,类似于下图

答:极有可能程序在运行时发生异常coredump。建议使用release模式编译,然后使用ASAN工具检查内存问题。ASAN 工具使用方法可以参考 使用 ASAN 测试 MiniOB 内存问题

代码写多了,basic 用例失败了

答:basic 测试用例中带了一些简单的事务用例,比如事务未提交时,强停observer,再启动observer,未提交的事务数据不应该出现。

两次提交相同的代码,但是结果不同

答:很正常。程序每次执行结果不同,极有可能是存在BUG的,比如某些变量未初始化、函数没有写返回值,就会出现一些“随机性”的事件。建议编写代码时,严格遵守一些规范,将BUG扼杀在摇篮中。

Windows系统使用Docker开发MiniOB,启动observer时提示 can not bind server socket

答:先说解决方案。创建目录/root/test,然后在/root/test中进行一系列测试:

mkdir -p /root/test
cd /root/test
/root/miniob/build/bin/observer -s miniob.sock -f /root/miniob/etc/observer.ini

原因:
在Windows系统上启动docker,如果使用-v参数来影射本地目录与Docker镜像目录的话,比如 docker run -v $PWD/miniob:/root/miniob --name miniob oceanbase/miniob,那么在进入/root/miniob/build目录后,所创建的文件都是在Windows文件系统上的。而miniob 创建的miniob.sock,是一个unix socket,在Windows的文件系统(可能是NTFS)上不支持。

请问我这样算成功了嘛?为什么有分数,又显示执行失败?


答:提测之后所有题都会跑一遍,显示成功的,说明实现了这道题的功能,可以获得这道题相应的得分,失败的就说明没有完成这些题功能的实现,不得分。

public repo not allowed,clone repo failed
2023年开始,比赛中不允许使用 public 仓库,即公共仓库提交测试,必须改为私有(private仓库)。大家可以参考 MiniOB GitHub 在训练营中的使用说明

题目描述与实际提测情况不符
比如update-select题目中,update val=(select xxxx) where id=1; 如果子查询返回的值个数超过1个通常我们都要返回失败,但是在MySQL中,由于where id=1返回的数据量是0,所以此语句返回成功,但是不实际更新数据。
总结:以实际MySQL表现为准。

浮点数处理异常
由于MySQL中对float字段的精度处理非常差,会遇到a < a的情况,比如 insert into t values(29.14);但是select * from t where id < 29.14;可以得到29.14这个数据。
另外还有比较长的浮点数,比如10356.23,在MySQL中会保存为10356.2,无法与miniob的要求保持一致,而且比较难找到一种规则。
如果同学们遇到上面的情况,可以在群内与我们沟通,来调整case,避免这种情况的发生。

failed to receive response from observer. reason=Failed to receive from server. poll return POLLHUP=16 or POLLERR=str(event & select.POLLERR), sql=
没有收到服务端的回复。测试程序会使用poll来探测服务端发来的消息,这里在探测时返回了异常,说明服务端通讯出现了异常。

训练营的提示信息是什么意思?


训练营测试时,会向服务端发起SQL 请求,同时期望收到回复。每个SQL都会有期望的正确回复,与实际上收到的选手提测代码的回复。如果两者不一致,就认为case不通过,同时以"- " 前缀表示我们期望收到的正确答案,而 "+ " 表示收到的选手提测答案。

SQL DEBUG无法使用

经过测试,SQL DEBUG有BUG,需要同学们拉取patch到自己的代码:

https://github.com/oceanbase/miniob/pull/298

后续提交测试就可以看到了。

直接在Linux上下载patch文件的方法:

wget https://github.com/oceanbase/miniob/pull/298.patch

编译执行到一半卡住不动了

看起来是并发编译消耗的资源太多,把build.sh中-j参数删除,重新编译即可。

oceanbase 部署失败

忽略那个错误,直接使用obclient连接即可:

客户端只能接受不超过4096字符的输入
在系统上安装readline开发包,然后重新编译。
在ubuntu上,是安装 libreadline-dev ,其它系统需要安装对应的包,即readline的开发包。

               扫码加入大赛官方钉钉答疑群

欢迎大家有问题随时在评论区进行交流讨论

如果大家发现测试用例有问题, 欢迎直接提交pull request 直接修改测试用例, 也可以直接和官方工作人员直接沟通.

年底重大项目要来了啊

:stuck_out_tongue_winking_eye: :heart_eyes: :heart_eyes: