[1.0 Review] daemon リソース上限の compiled-in 固定と daemon status 報告の凍結 #10
Labels
No labels
priority/P0
priority/P1
priority/P2
release/v0.1.0
status/blocked
status/planned
type/bug
type/design
type/test-gap
type/tracker
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
natsukium/felis#10
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
daemon は複数のリソースに対して上限(ceiling)を持ち、超過時は typed refusal で拒否する。
reference/spec.mdREQ-915 / REQ-1008 等とreference/cli.md「Daemon status」節に上限と観測値の報告が仕様化されているが、上限自体は compiled-in(daemon は config file を読まない)。現状の問題 / 凍結前に決めるべき点
1. compiled-in caps
daemon statusrowsinfo.dimsDEFAULT_MAX_BODY)全て
reference/workspace.md「Cargo configuration」やfelis-daemonの定数で決まる。control-surfaces.md「Diagnostic verbs」で「daemon は config を読まないので caps は報告するだけで tunable にしないのは v1 では十分」と明記。問い: 1.0 でこの「caps は compiled-in、報告のみ」を凍結するか? 運用で 256 sessions では足りないユースケース(CI で大量 spawn)が現れた時に、再ビルド無しで上げられない。1.0 で daemon に config / env での tunable を持たせるなら今しか破壊的に決められない。
代替:
FELIS_DAEMON_SESSIONS=512 felis-daemon serveのような env override。~/.config/felis/daemon.tomlのような daemon config(ただしcontrol-surfaces.mdの「daemon は config を読まない」原則を崩す)。felis daemon set-limitのような IPC verb(ただし daemon が持つ limit を動的に変えるのは複雑)。現行の「報告はするが tunable にしない」は、1つの定数なら正当だが 3つ目の tunable が欲しくなった時点で config file を導入する Revisit trigger として記録されている。1.0 でこの trigger を維持するか、今のうちに env override だけでも足すか。
2.
daemon statusの sampling vs counterdaemon statusは pool と session actor から sampling した瞬間値を報告。hot path に counter を置かない代わりにstatus呼び出し時に actor message を集約する。control-surfaces.mdで「counters は drift したら authoritative に見えて危険」と却下。1.0 でこの sampling 方式を凍結するか、将来の
subscriber_queue_bytesのように頻繁に動く値で sampling の race が問題になるか。3.
image_store_bytesとin_flight_decode_bytesの二重 capt=dの chunked upload はin_flight_decode_bytes(64MiB per session)で、store 自体がimage_store_bytes(256MiB per session)で、それぞれ eviction / refusal の挙動が違う。1.0 でこの二重 cap の値を変える余地は無いか。特にin_flightの 64MiB はt=s(shm)経由なら不要に見えるが、攻撃者がm=1で無限に chunk を送る DoS 耐性のために必要。4. slow-subscriber eviction
現行は出力量(
OutEvent::approx_wire_lenの推定)でSUBSCRIBER_BUFFER_CAPを超えたら cut。backlog.mdに「byte-bounded + write deadline の policy に置き換える案は deferred(観測された必要が無い)」と記載。1.0 で volume-only を凍結するか、deadline 付きに今直すか。提案
reference/spec.mdREQ-915 とreference/cli.md「Daemon status」に「1.0 凍結、tunable にしない理由」を明記し、将来の tunable 追加はexplanation/architecture/control-surfaces.mdの Revisit trigger(「2つ目の tunable が欲しくなったら daemon config を検討」)に委ねる。FELIS_DAEMON_*の naming をFELIS_TERM/FELIS_SOCKETと整合する形で決め、reference/terminal-identity.mdではなくreference/cli.md「Daemon status」の表に「limit の由来(compiled-in vs env)」を追記。daemon statusのlimitが omitted になるケース(ceiling 無し resource)を 1.0 で許すか、将来の row 追加は必ずlimitを持つことを契約にするか決める。判定基準
felis daemon statusの出力を見て、運用者が「なぜ spawn がat_capacityで拒否されたか」をlimitとusedの差で即断できること。sessionscap を 256→512 に上げる時に、wire のAttachFailure::SessionLimitReachedのdetail(count/limit)がそのまま新しい値を運べること。cc @natsukium
Superseded by #14–#16 and #25–#26. These split aggregate admission, bounded queues, payload limits, portable stop/drain, and dimensionally correct status reporting under #12.