Q先生的世界

面朝大海,春暖花开

经典项目源码分析|CoreDNS 代码结构总览:入口、插件链、请求流与 dnsserver 骨架

CoreDNS 真正难的地方,不是插件多,而是你要先看清它怎样把 Corefile、插件注册和请求执行拼成同一个运行时

从源码分析视角系统梳理 CoreDNS 的代码结构,重点分析 main 入口、coremain、plugin.cfg、生成代码、dnsserver、插件注册、ServeDNS 请求流以及理解源码时的阅读顺序。

经典存储对比|LMDB 与 BoltDB:它们如何利用 mmap,以及为什么一个更偏 COW、一个更强调页式事务

两者都爱 mmap,但真正决定气质差异的,不是 mmap 本身,而是它们如何组织提交、回收和读写视图

系统对比 LMDB 与 BoltDB 的核心设计,重点分析它们如何利用 mmap、怎样组织读写事务、为何都依赖 copy-on-write 却呈现出不同工程气质,以及各自的优势、代价与适用场景。

经典系统排障|FUSE 调试与排障:getattr 风暴、缓存、并发、权限与 macOS/Linux 差异

FUSE 真正难的地方通常不是把 demo 跑起来,而是为什么它跑起来以后和你想得完全不一样

围绕 Go FUSE 文件系统的真实调试问题,系统拆解 getattr 风暴、缓存语义、并发访问、权限模型以及 macOS/Linux 差异,并给出可执行的排障思路。

经典系统实践|把 Go 文件系统接到 FUSE:真正挂载起来,并走通 ls/cat/touch 全链路

当 toy filesystem 真能被 mount 以后,inode、目录项和路径查找就不再只是你代码里的概念了

在最小 Go 文件系统和 WAL 续篇的基础上,继续通过 FUSE 把文件系统真正挂载起来,讲清 syscall、FUSE 回调和本地存储引擎之间的完整链路,并演示 ls、cat、touch 的工作流。

经典系统实践|给 Go 文件系统加上最小 WAL / Journal:事务边界、Redo Log 与崩溃恢复

一旦一个逻辑操作要修改多个物理位置,日志几乎就是迟早的事

在前一篇最小 Go 文件系统的基础上,继续实现一版最小可理解 WAL / journal,讲清事务边界、日志格式、commit 语义、恢复流程与 Go 代码骨架。

经典系统实践|用 Go 实现一个最小可理解文件系统:Superblock、inode、Bitmap 与目录树

不要一上来就盯 ext4,先自己写一个能 mount 到脑子里的最小文件系统

从对象存储研发工程师视角,用 Go 实现一个最小可理解文件系统,系统讲清 superblock、inode、bitmap、directory、path walk、write path 与崩溃一致性。

BoltDB 源码分析(三):提交、freelist 与崩溃恢复

沿着 Commit() 调用链,分析 BoltDB 如何回收旧页、写出脏页、切换 meta,以及它的崩溃一致性边界。

BoltDB 源码分析(二):B+Tree、Bucket 与 Cursor

深入拆解 page、node、Bucket、Cursor 的组织方式,看 BoltDB 如何把 mmap 上的页结构变成可遍历、可修改的 B+Tree。

使用VIM作为Go开发的IDE

前言

一个好的IDE之于一个程序员,正如一个趁手的兵器之于一个战士。 至于说,什么IDE是最好的IDE,我相信这比“鸡蛋应该从哪头开始打开”这个问题更难,为了不因此引发战争,我们还是暂时先搁置这样的问题吧。 VIM是一款小巧的编辑神器,其迅捷如飞地效率和敏如脱兔地丝滑早已深入人心,如果在开发Go时,能够使用VIM作为IDE,想必也是极好的。


BoltDB 源码分析(一):事务、mmap 与文件格式

从 Open、meta page、mmap、读写事务与 MVCC 入口出发,建立理解 BoltDB 源码的整体框架。