一、 大赛基本信息
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的开发包。
扫码加入大赛官方钉钉答疑群