xiaowei-system/skills/software-development/go-learning/references/go-code-patching.md

114 lines
3.3 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Go 代码修改技术要点
> 来源2026-06-09 修复 consolidation cluster_only bug 实战
---
## 1. Go 缩进规范tabs
```
switch expr {
case "a": // 4 tabs
foo() // 5 tabs
case "b", "c": // 4 tabs
bar() // 5 tabs
baz() // 5 tabs
if cond { // 6 tabs
qux() // 7 tabs
}
default:
quux() // 5 tabs
}
```
- **switch 语句本身**T5比包裹它的 func/block 多 4 层)
- **case 标签**T4比 switch 多 1 层)
- **case 第一条语句**T5比 case 多 1 层)
- **case 嵌套 block**:每层 +1 tab
验证实际缩进:`python3 -c "with open('file.go','rb') as f: [print(i+1, len(l)-len(l.lstrip()), l.rstrip()) for i,l in enumerate(f) if b'case' in l or b'switch' in l]"`
---
## 2. patch 工具失效时的字节级修复
当 patch 工具因 tab/space 缩进不匹配而失败时,用 Python 字节级读写:
```python
python3 -c "
with open('/path/to/server.go','rb') as f:
data = f.read()
# 替换6 tabs -> 5 tabs
old = b'\x09\x09\x09\x09\x09\x09graphStore.Prune(0.15)' # 6 tabs
new = b'\x09\x09\x09\x09\x09graphStore.Prune(0.15)' # 5 tabs
count = data.count(old)
print(f'Found: {count}')
if count:
data = data.replace(old, new, 1)
with open('/path/to/server.go','wb') as f:
f.write(data)
print('Fixed!')
"
```
**关键点:**
-`\x09` 表示 tab不要用文字 `\t`(可能有转义问题)
-`rb` 模式读取,保留原始字节
- 替换后立即 `go build ./...` 验证
---
## 3. Binary 部署验证
```bash
# 查看真实 mtimestat 比 find 更可靠)
stat --format='%y' /home/muc/.local/bin/zhiyid
# 对比 git commit 时间
git -C /home/muc/projects/memoryweave log -1 --format="%ci" HEAD
# restart 并验证
systemctl --user restart zhiyid && sleep 2 && systemctl --user status zhiyid
```
⚠️ `find -printf "%T+"` 对普通文件返回正确时间,但对某些文件(如 device node可能返回 Unix epoch 0。
---
## 4. 织忆 Consolidation Pipeline 两种模式
位于 `go/internal/api/routes/consolidation_pipe.go`
| 模式 | 调用 | 包含步骤 |
|------|------|---------|
| `cluster_only` | `consolPipe.Run()` | Rust sidecar聚类+ runGraphMaintenancePageRank |
| `full` | `consolPipe.RunWithMode("full")` | Rust sidecar聚类+decay+quality+ runGraphMaintenancePrune+PageRank |
**调度规则server.go**
- `t_distill``Run()`cluster_only高频 60s
- `t_consolidation` / `t_backtrack``RunWithMode("full")`fullcooldown=48h
- `t_prune` → 单独 `graphStore.Prune(0.15)` 调用Go 层T5 缩进)
- `t_decay` → 单独 decay 逻辑(从 ldb.GetCandidatesForForgetting 读取)
**常见 bug** `consolPipe.Run()` 默认 cluster_onlyconsolidation 触发器实际跑了快速聚类,跳过了 decay/quality 步骤。修复ticker switch 中 `case "consolidation"` 改为 `RunWithMode("full")`
---
## 5. journalctl 调试技巧
```bash
# 只看某 PID 的日志
journalctl --user -u zhiyid -n 100 | grep "$(pgrep -n zhiyid)"
# 按 trigger 过滤
journalctl --user -u zhiyid --no-pager | grep -E "consolidation|Rust sidecar|prune|Decay|Quality"
# 看服务启动日志
journalctl --user -u zhiyid -n 20 --no-pager | grep -v "971305"
```
---
*记录日期2026-06-09*