# 주제: "모든 advanced capability 가 통과하는 단일 게이트" 를 5개 capability 리프 중 2개만 통과한다 # revision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 # severity: P2 # ---- 선언 ---- # GrpcAdvancedModuleGuard.java:7-12 (클래스 javadoc) # "The single gate every advanced capability passes through. # Three conditions, checked in this order because each explains a different refusal: the flag is # not set, the grade cannot start at all, or production has not separately approved an # experimental capability. Collapsing them into one boolean produces a 'not enabled' message for # three situations with three different remedies." # src/grpc-advanced/CLAUDE.md:35-37 # "property key는 ca-skeleton.grpc.advanced..enabled이고 **전부 기본 off**다. # GrpcAdvancedModuleGuard가 세 조건(flag 미설정 / grade가 시작 불가 / production 승인 없음)을 # 구분해서 거부하며, 세 경우의 조치가 다르므로 메시지도 다르다." # ---- 선언된 capability 13개 (GrpcAdvancedCapability) ---- CLIENT_STREAMING ADVANCED_STABLE (streaming 리프) BIDI_STREAMING ADVANCED_STABLE (streaming) MANUAL_FLOW_CONTROL ADVANCED_STABLE (streaming) HEDGING EXPERIMENTAL (resilience) CUSTOM_RESOLVER ADVANCED_STABLE (resilience) CUSTOM_LOAD_BALANCER EXPERIMENTAL (resilience) XDS EXPERIMENTAL (resilience) GRPC_WEB ADVANCED_STABLE (compat) SERVLET_COMPAT ADVANCED_STABLE (compat) INTEGRATION_BRIDGE ADVANCED_STABLE (compat) REACTOR ADVANCED_STABLE (compat) KOTLIN ADVANCED_STABLE (compat) CHANNEL_DIAGNOSTICS ADVANCED_STABLE (diagnostics) # ---- 측정: 게이트를 부르는 곳 ---- # command: git grep -n "GrpcAdvancedModuleGuard|GrpcAdvancedFeatureFlags|GrpcAdvancedCapabilityDisabledException" \ # -- src/grpc-advanced | grep -v "grpc-advanced-bootstrap/" # # src/main 에서 부르는 곳은 **둘뿐**이다: # grpc-advanced-diagnostics/…/GrpcChannelDiagnosticsPolicy.java:46-53 # registerChannelz(flags) -> GrpcAdvancedModuleGuard.available(flags, CHANNEL_DIAGNOSTICS) # registerCsds(flags) -> … && available(flags, XDS) # grpc-advanced-resilience/…/xds/GrpcXdsStartupGuard.java:28-33 # …(profile, flags, applicationDefinesRetries) # if (!GrpcAdvancedModuleGuard.available(flags, XDS)) { … } # # 부르지 않는 리프: # grpc-advanced-streaming (833 LOC, 14 main 파일) — CLIENT_STREAMING/BIDI/MANUAL_FLOW_CONTROL # grpc-advanced-compat (962 LOC, 17 main 파일) — GRPC_WEB/SERVLET/INTEGRATION/REACTOR/KOTLIN # grpc-advanced-edition (326 LOC, 6 main 파일) — (capability enum 에 항목 자체가 없다) # 그리고 resilience 의 HEDGING·CUSTOM_RESOLVER·CUSTOM_LOAD_BALANCER 도 게이트를 거치지 않는다 # (xds 만 거친다). # ---- 의도된 패턴은 두 곳에 존재한다 ---- # GrpcXdsStartupGuard 와 GrpcChannelDiagnosticsPolicy 가 보여주는 형태: # 리프마다 진입점 하나가 flags 를 받아 available(...) 로 자기 capability 를 확인한다. # streaming·compat 에는 그런 진입점이 없다. 각자 자체 게이트를 갖지만 성격이 다르다: # GrpcEdition2024Gate — Edition 채택 가부 (릴리스 분리) # GrpcKotlinCompatibilityGate — Kotlin 어댑터를 supported 로 광고할 수 있는가 (fail-closed) # GrpcWebCompatibilityGate — (compat) # GrpcClientStreamPolicy — 스트림 경계값 (게이트 아님) # 이들은 **capability 별 flag** 를 확인하지 않는다. # ---- 판정 ---- # 13개 capability 가 각자 flag 를 갖고 "전부 기본 off" 로 선언되지만, # 그 flag 를 확인하는 진입점을 가진 것은 CHANNEL_DIAGNOSTICS 와 XDS 둘뿐이다. # 나머지 11개는 flag 를 켜지 않아도 타입을 쓸 수 있다 — 막는 코드가 없다. # # 완화 요인: grpc-advanced 블록 전체가 배포되지 않고(EVD-325), 이 리프들은 정책·계약 타입이라 # 호출하는 host 가 없다. flag 확인이 그 host 의 배선 지점에 놓일 계획일 수 있다. # 그러나 그 계획을 서술한 문장이 없고, javadoc 은 현재형으로 "single gate every advanced # capability passes through" 라고 쓴다. # ---- 각 리프 테스트 수 (EVD-325 재확인) ---- grpc-advanced-bootstrap tests=17 grpc-advanced-edition tests=13 grpc-advanced-streaming tests=30 grpc-advanced-resilience tests=31 grpc-advanced-compat tests=27 grpc-advanced-diagnostics tests=11