#三更半页 1/3 page,chunk,pagereference,pageInfo,bytebuffer,storage……一堆组合起来,有一个大概的框架:数据是如何读起出来的。 数据库是如何管理数据的?如何查找。 page构成了chunk,page由区分了nodepage和leafpage类型的区别。btreestorage维护的就是这样的page对象结构。 多线程可以安全读取page的逻辑还没get到 传说中的存储引擎有个模糊的样子了#三更半页 1/3 一共维护了26种数据类型的Value。进行数据交换时,涉及到readValue和writeValue方法调用。封装到了TransferInputStream(读起Value)和 TransferOutputStream(发送)中。 在flush方法中完成实际的发送动作:构造out,写header协议,encode数据内容,flush进行发送。#三更半页 1/3 接近十天都上不来,大佬中wb还在吐槽。今天更新自己的仓库,ssl遇到类似问题,改http方式配上proxy解决。权限控制的比较严谨,现在可以使用token的方式,类似SSO方案,也更安全一些。 网络模块又重构了一遍,永无止境。新代码现在看起来可以跟上思路,细节还需要配合完整的上下文进行理解。#三更半页 1/3 目前还没涉及的领域:事务引擎中的checkPointService,redo log用法与逻辑。存储引擎,执行逻辑这些都多少有些印象。 这些模块现在也算都混个眼熟#三更半页 1/3 事务引擎代码读起来有点不好理解。慢慢来。#三更半页 1/3 事务引擎初始化的时候会初始化logservice, redo log的执行方法redo 动作依赖从日志都出来的内容— 内容格式还没搞清楚,如何写入的? bytebuffer 读取 varlong ?需要借助gpt按行分析解释一下了。 进度缓慢。#三更半页 1/3 大佬开始“精修”主代码,模块重构,“十全十美”的十大模块。 打包构建产出物也移到主module里;启动代码再次重构。 跟踪启动逻辑又过了一遍启动逻辑,这次只花了11分钟启动完成。常读常新,这次读的时候明显感觉思路清晰很多了。移除了mysql的插件之后,本地测试环境的历史数据重新初始化db的时候会报错。删除数据文件之后恢复正常(预计)。 报错日志对分析代码逻辑有帮助。记录再次备案 PS: 不能超过5000字符。 https://pastebin.com/hurUR2KC#三更半页 1/3 跟踪调度器的run方法时发现线程一直在切换。才意识到实际上有多个调度器在工作。 jps 查看 java都有哪些进程; jstack pid 可以看到该进程中所有的线程的堆栈状态。 主线程启动后会在这里将所有的调度线程启动。start的是这里的SchedulerThread#三更半页 1/3 检查点服务作用是?看起来是手动维护内存中的数据。运行时系统的状态还没有完整的框架。 的确并发控制是核心,多线程再加上全链路异步化。复杂度有点hold不住暂时。 redoLog里这些bytebuff的操作现在也没搞清楚含义,比如: 这里写变长编码long数据的方法—— public static void writeVarLong(ByteBuffer buff, long x) { while ((x & ~0x7f) != 0) { buff.put((byte) (0x80 | (x & 0x7f))); x >>>= 7; } buff.put((byte) x); } GPT解释了一遍,依然理解困难😓