anthropics / anthropics/buffa

default_value_ref allocates a DynamicMessage and clones the pool Arc on every get() of an unset message field

Abierto
#435 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Rust
Estrellas
883
Forks
88
Merge medio
3 d 19 h
PR fusionados (30 d)
42

Descripción

`default_value_ref` in `buffa-descriptor/src/reflect/dynamic.rs` answers `get()` on an unset singular *message* field by building a value on every call:

```rust
FieldKind::Singular(SingularKind::Message(midx)) => ValueRef::Message(ReflectCow::Owned(
alloc::boxed::Box::new(DynamicMessage::new(Arc::clone(pool), midx)),
)),
```

so each read of an unset message-typed field costs a heap allocation, an `Arc` clone of the pool (an atomic RMW on a line shared across threads — see the companion issue on the pool's count line), and the matching drop, where the list and map arms of the same function hand out `'static` empties for free. A reflective reader that probes optional sub-messages (`has`-then-`get` patterns, or readers that treat unset as the empty message per proto3 semantics) pays this per field per message per request.

Options that keep `get()`'s signature:

- Cache one empty `DynamicMessage` per `MessageIndex` in the pool (built lazily, e.g. a `OnceLock>` slot per message, or a side `Vec` filled at pool build) and return `ValueRef::Message(ReflectCow::Borrowed(&empty))`. The empty message's own `pool` field is the one wrinkle — an empty message never dereferences it for field storage, so it could hold a `Weak` or the pool could store the empties without a back-reference; whichever fits the existing invariants.
- Or return a dedicated `ValueRef::EmptyMessage(MessageIndex)`-style variant and let `ReflectMessage` consumers treat it as the default instance, avoiding the self-referential question altogether at the cost of a new variant.

The first keeps every caller working unchanged.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.