Skip to content

Commit 2a24a1c

Browse files
mizchiclaude
andcommitted
docs: add knowledge base with DO storage limit and route ambiguity findings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent ee72b18 commit 2a24a1c

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

docs/knowledge.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Knowledge Base
2+
3+
運用・開発で得た知見をまとめる。
4+
5+
## Cloudflare Durable Object の storage 制限
6+
7+
**発生日**: 2026-02-23
8+
**症状**: `bit relay sync push` が HTTP 500 (Cloudflare error 1101) を返す
9+
**原因**: `RelayRoom` DO の `storage.put()` でスナップショットが 128 KiB/value 制限を超過
10+
11+
### 背景
12+
13+
`RelayRoom` DO はリクエストごとにメモリ上の全状態(メッセージ + 鍵 + nonce)を単一キーにシリアライズして永続化していた。
14+
15+
```
16+
snapshot = messages (最大1000件 × 最大64KB) + keys + nonces
17+
```
18+
19+
ベンチマークやテストデータの蓄積でスナップショットが肥大化し、`storage.put()` が例外を投げた。try-catch がなかったため Worker 全体が 500 を返していた。
20+
21+
### 暫定対処
22+
23+
- `storage.put()` / `storage.get()` を try-catch でラップ
24+
- persistence は best-effort とし、失敗してもリクエストは成功を返す
25+
26+
### 根本対策(TODO)
27+
28+
スナップショットの分割永続化を実装する:
29+
30+
1. **keys/nonces は必須永続化**: TOFU の鍵レジストリと nonce は DO 再起動後も維持が必要。これだけなら 128 KiB に収まる
31+
2. **messages は揮発性でよい**: メッセージはクライアントが poll で取得するもの。DO 再起動で消えても、クライアントは next cursor から再取得するだけ
32+
3. **分割案**:
33+
- `relay_keys_v1`: keys_by_sender + nonces_by_sender
34+
- `relay_rooms_v1:{room}`: room ごとのメッセージ(上限制御付き)
35+
- または messages の永続化自体をやめる
36+
37+
### Cloudflare DO storage の制約まとめ
38+
39+
| 制約 ||
40+
|------|-----|
41+
| 1 value あたりの最大サイズ | 128 KiB |
42+
| 1 key あたりの最大サイズ | 2 KiB |
43+
| 1 リクエストあたりの put/get 回数 | 制限なし(ただし課金対象) |
44+
| DO インスタンスのメモリ | 128 MB |
45+
46+
## Git ルートの named/random セッション曖昧性
47+
48+
**発生日**: 2026-02-23
49+
**症状**: `bit clone relay+https://.../AbCdEfGh` が 404 を返す
50+
**原因**: `/git/AbCdEfGh/info/refs` が named session パターン `/git/<owner>/<repo>/<path>` に先にマッチし、セッション ID が `AbCdEfGh/info` として解釈されていた
51+
52+
### 対処
53+
54+
named match と random match の両方を評価し、named が 404 なら random にフォールバックするよう修正。
55+
56+
### 教訓
57+
58+
URL パターンが重複する場合、片方のマッチだけで確定させず、フォールバックを設けること。Deno 版は `gitServeSessions.has()` でメモリ内チェックしていたため問題なかったが、CF 版は DO が存在チェックなしに生成されるためフォールバックが必要だった。

0 commit comments

Comments
 (0)