Oceanbase比赛的最后一天是挺梦幻的,中午还是5秒2,晚上就冲上了2秒3。

比赛结束的前一天晚上,吃完晚饭已经8点多了,离比赛结束还有不到24小时。而我们只有18名,我知道接下来得争分夺秒了,目前的名次肯定是不够看的。

从晚上11点发现tpcc的问题,看了一波obd的报错,缩小了问题范围,是虚拟表的内容不对,可能牵扯到all_merge_info的那几张表,但不知道如何解决,怀疑是有几张表的重定向没有还原。我们一遍又一遍查gen_meta_tenant_id的调用地方,就这样不知不觉到了凌晨3点,又到了5点还没解决。我实在撑不住睡觉了,睡前想着如果庞哥能搞定就好了。我记得那晚寝室灯也没关,就那么睡着了。8点醒了发现庞哥7点发了一个消息,“tpcc问题解决了,去睡40分钟”,庞哥熬了一晚上把问题解决了,把所有重定向到sys租户的表基本上还原,肝一肝出了奇迹。这下并行没问题了。1号的思路终于在比赛结束前6小时实现了。

早上起来看到庞哥还没睡,真是神人。起床来继续创造奇迹,一个上午尝试把refresh放到后台执行,到中午12点发现无果。此时,离比赛结束还剩6个小时了,而我们的最新成绩是5秒2,排名16的样子,相比6号进步了800ms,但是还不够啊,唉,点了一份大米先生外卖,直接肝。

不知怎么发现,主线程只需睡1500ms,这样还是有几率通过的,而到下午4点,已经尝试缩短到300ms了,因为sysbench在本地有几率过,特别是把后台的vscode和clangd都关了,有3成的几率能通过sysbench,所以,线上一定能过!已经破罐子破摔了,毕竟没有多少可以失去的了,输了不亏,赢了血赚。

一边改代码一边拍桌子,从来就没有这么兴奋过。

这几天,首先是restart起不来,花了好几天时间解决,应该是all_server还是哪张表的start_service_time一直等于0,感觉是后台卡在start的一步里,但是看了好几天代码,没发现端倪。总之,我猜测和建表顺序有关系,因为从9号到10号,使用的是庞哥的sys表先建的方法,还原成串行建表以后,最先最古老的代码是一定能跑的,甚至没有考虑到建表失败的重试,可见ob对自己的信心。从那以后,几乎所有hash not exist问题都不存在了,虽然串行比较耗时,大约在2.7秒左右,但是小问题基本上消失了。

最后一天下午,我们发现,deploy已经能到3.6s,这是1500ms的睡眠的条件下,少睡1秒应该能过,但sysbench大约在31秒,胜算很低,怎么缩短一秒,只能在建表这里挤一挤,恢复成并行建表逻辑,差距不大,但好像有一丢丢的提升,最后的最后,把refresh和set baseline schema version注释掉,因为6秒的那次提交能过,那么说明不刷新schema也是可以的。最后的俩小时,已经把日志级别去除了追求极限,已经没有时间排查问题,只有不断尝试(重试)。事实上到下午5点,我们还是半小时提交一发,还剩3发提交。

3秒2的那次,已经很超出预期了,提升了2s,从20吊车尾到稳了前十。多刷几次也不过2.9s第七名。最后一小时,抱着死马当活马医的态度,创建了4个分支,尝试sleep时间从500ms到300ms不等,卡评测机器的极限。我们没有优化点了,只有把手上的牌全部提交,哪怕成绩作废。就像是海战里打完所有弹药的巡洋舰,能开回去好歹是个全员二等功。

比赛结束的时候很平静,看着6点到了也过了,心想这比赛再长,也让我们走到了终点,大家也不用费尽心思找优化点了,不用时刻盯着排行榜,来哥也不用凌晨重启服务器了。

我和庞哥去龙湖吃鸡汤饭,出校门的路上突然就很困,从前一天上午到现在,好像一直坐在电脑前看log解决问题,时间在飞速流逝,不知不觉就第二天了,突然一下就比赛结束了,昨天晚上到现在,没时间顾及其他事情,也没怎么休息,看来是该睡了,看着评测结果全是红,一边复盘一边想着我这一天做了什么。5点半的倒数几次提交,基本上都挂了。看来健壮性确实不行,只跑出一次3秒2,没有提升。鸡汤饭快吃完了,关键的来了,庞哥在手机上看到2.3s的成绩,一瞬间还以为眼花,一看已经6点40,估计成绩作废了,我开了一下排行榜,成绩居然变了?!what the fuck?没想到在截止时间前的提交还计数?这下不得不起飞了,我也不知道5点51我抱着什么心态交的这一发,估计是看着那个版本sleep的300ms有希望过,那只有1成胜算,我也不知道最后一刻的评测机抱着什么心态跑完的,给了个2222ms的成绩,也不知道测评榜怎么还变化了,在比赛结束后还在滚动。也不知道成绩是否有效,所以,耐心等待最终官方成绩吧。

回去的路上7点多了,停在路口的红绿灯前,等着蓉2驶过路口,街上霓虹闪烁,前几天晚上吃饭回去天还是蓝的,原来成都的天也会这么早黑啊。而现在只想着回寝室快点睡上一觉。

写着写着,发现对比赛的记忆也越来越淡了,不记得为了miniob所熬的几个夜,也不记得没去听的几门课,好像也不记得昨天究竟改了什么代码,让最终跑过了tpcc,跑过了sysbench。比赛时一遍又一遍想着最终的结果怎样怎样,能不能拿到前六和实习,现在回想看来,尽管题目很烂,写的代码也很烂,经常看了一整天log啥都没看出来,但经历很充足很充实,比赛结果还不赖,回顾比赛的感受冲淡了比赛结果本身带来的喜悦。觉得今年下半年多少是做了一些有意思的工作,推掉一些工作来肝oceanbase,取得了一点小小的回报,至少在22岁这年有这件事,感觉活着还是有点意思的。

当然决赛答辩就没什么好说的了,就是上海7日游了。哈哈我发现我真的没什么好说的。明明这么有意思的比赛,写的和流水账一样。

3月27日,今天庞哥说他看视频,发现有个队在采访中说印象最深刻的是我们队,还蛮惊讶的,没想到还有人关心我们这个无名小卒。

决赛答辩

王运来老师一早就提醒我们做答辩PPT,可是懒狗只会等到ddl之前做。叠加期末周,真正新建文件夹,已经到24号了。29号考完最后一门英语,那时候是有点慌的。我们做了什么很棒的东西吗?好像没有吧,只不过把能去掉的部分去掉了,然后就提交了。

上海的冬天和成都一样,都是PM2.5超标的阴霾,我们下午还在宾馆改了一下午PPT。说实话这个PPT做的不怎么样,没有惊艳的流程图,也忘了把我们的优化时间展示清楚,对比人大的同学两晚上做完,一句“最长连续工作时间”,一看就是汇报的高手。

跨年夜在豫园看了灯会,以及去了外滩,见识到什么是人墙,繁华喧嚣。当然肯定没有拍一张前景是我,背景是陆家嘴的照片,那样出了说明你来过外滩没有任何意思。听说没有灯光秀,所以10点多就打道回府了,和bilibili晚会跨年了。

第二天晚上去了张园,第三天去citywalk,第四天突发奇想,跟着马督公的路线走一遍黄浦江,但是没走完,最可惜没上黄埔和南浦大桥。

第五天冲向长兴岛,步行到了岸边,晚上在岛上迷路了,跟着高德导航误入郊野公园,上面是长江大桥,下面是一片荒芜。

人的失败是成功后的。成功意味着你没有失败,这就是失败,路走的太顺了,终有一天会摔倒的。当然如果什么奖都没拿,那更失败了。

答辩那天当然是忐忑的。

首席产品经理阳老师就坐在我前两排,一台ThinkPad,打开评分网页,我用长焦就能看到打了多少分。ob为了决赛打分还做了个评分系统。

顺序抽到倒数好像是16号,意味着从8点坐到下午4点才答辩。那个时候评委估计都听腻了,什么减少选举等待啊,并行建表啊。令我印象深刻的是清华的选手,那什么不是自以为是呢?然后大家都绷不住了。最有意思的方案是赵一平的fuse,按jyy的话说:“如果一个程序没有任何系统调用,那么是否等价于while(1)?”

对于任何一个复杂程序,我们忽略一切细节,从外面观测它,只是一串系统调用而已。那么如果一个程序的系统调用表现和oceanbase自举时的系统调用一样,那么它是否等价于ob呢。

那么它所做的一切io,只要记录下来重新运行就可以了。所有的瓶颈就是io速度。思路很清晰,非常具有创新性。但是具有一些问题,万一含有设备有关信息呢,比如生成一个唯一的uuid,根据cpu或内存数量确定资源;无法响应启动参数,只能制作特定版本安装镜像。要是我就会忽略这些问题,给他创新性打满分。

从比赛的角度来说,大家为了优化启动时间,在允许的边缘做一切可能的试探,并假设其他队也都遵守规则。Bootstrap是一项复杂的过程,可能有无数可以优化的点,也有无数方法去优化它。不同的方法之间可能是正交的,这个部分时间短了,导致另一个部分耗时增长也是正常的。这个过程中,是没有银弹的。第一名已经优化到1.598s了,比我的vscode冷启动还快,vscode的优化原则是确保某台ThinkPad能在1.8秒内启动1。我觉得接下来oceanbase团队也可以定一个目标,每日构建的ob能在2秒内在阳老师同款的ThinkPad上完成Bootstrap。