pub enum MetadataEntry {
CatalogDdl {
payload: Vec<u8>,
},
CatalogDdlAudited {
payload: Vec<u8>,
auth_user_id: String,
auth_user_name: String,
sql_text: String,
},
Batch {
entries: Vec<MetadataEntry>,
},
TopologyChange(TopologyChange),
RoutingChange(RoutingChange),
ClusterVersionBump {
from: u16,
to: u16,
},
DescriptorLeaseGrant(DescriptorLease),
DescriptorLeaseRelease {
node_id: u64,
descriptor_ids: Vec<DescriptorId>,
},
DescriptorDrainStart {
descriptor_id: DescriptorId,
up_to_version: u64,
expires_at: Hlc,
},
DescriptorDrainEnd {
descriptor_id: DescriptorId,
},
CaTrustChange {
add_ca_cert: Option<Vec<u8>>,
remove_ca_fingerprint: Option<[u8; 32]>,
},
}Expand description
An entry in the replicated metadata log.
Every mutation to cluster-wide state — DDL, topology, routing,
descriptor leases, cluster version bumps — is encoded as one of
these variants, proposed against the metadata Raft group, and
applied on every node by a
crate::metadata_group::applier::MetadataApplier.
The CatalogDdl variant is the single wire shape for every DDL
mutation. Its payload is an opaque, host-serialized
nodedb::control::catalog_entry::CatalogEntry value — the
nodedb-cluster crate is deliberately ignorant of the host’s
per-DDL-object struct shapes. This keeps the cluster crate
layering-clean and makes adding new DDL object types on the
host side a zero-wire-change operation.
Variants§
CatalogDdl
Single generic DDL entry carrying an opaque host-side payload.
Produced by every pgwire DDL handler via
nodedb::control::metadata_proposer::propose_catalog_entry.
CatalogDdlAudited
DDL entry with attached audit context. Produced by pgwire DDL
handlers that have the authenticated identity + raw statement
text bound at the call site (every CREATE, ALTER, DROP,
GRANT, REVOKE path). Applied identically to CatalogDdl
on every node; additionally, the production applier fsync-
appends an audit record to the audit segment WAL with the
authenticated user, HLC at commit, descriptor versions before
- after, and the raw SQL — exactly what J.4 requires.
Carries its own payload so legacy proposers (internal lease
and descriptor-drain flows that have no SQL text) can keep
using the plain CatalogDdl variant without synthesizing
fake audit context.
Fields
Batch
Atomic batch of metadata entries proposed by a transactional
DDL session (BEGIN; CREATE ...; CREATE ...; COMMIT;). The
applier unpacks and applies each sub-entry in order at a
single raft log index, so either all commit or none do.
Fields
entries: Vec<MetadataEntry>TopologyChange(TopologyChange)
RoutingChange(RoutingChange)
ClusterVersionBump
DescriptorLeaseGrant(DescriptorLease)
DescriptorLeaseRelease
DescriptorDrainStart
Begin draining leases on a descriptor. While a drain entry
is active, any acquire_descriptor_lease at
version <= up_to_version must be rejected cluster-wide so
the in-flight DDL that bumps the version can make progress.
expires_at is the HLC at which this drain entry is
considered stale and ignored by is_draining checks on
read. Acts as a TTL that prevents a crashed proposer from
leaving an orphaned drain that blocks the cluster forever.
DescriptorDrainEnd
End draining on a descriptor. Emitted explicitly on drain
timeout so the cluster can make progress. On the happy
path (successful Put* apply), the host-side applier
clears drain implicitly — this variant is the escape
hatch for the failure path.
Fields
descriptor_id: DescriptorIdCaTrustChange
Cluster-wide CA trust mutation (L.4). Proposed by
nodedb rotate-ca --stage (to add a new CA) and
nodedb rotate-ca --finalize --remove <fp> (to drop an old
CA). Applied on every node by MetadataCommitApplier: writes
or deletes data_dir/tls/ca.d/<fp_hex>.crt and triggers a
live rebuild of the rustls server + client configs so the
new trust set takes effect without restart.
add_ca_cert and remove_ca_fingerprint are independent:
the --stage form sets add_ca_cert = Some(new_ca_der) +
remove_ca_fingerprint = None; --finalize flips both. A
single entry carrying both performs the cutover atomically
once the operator has confirmed every node has reissued.
Trait Implementations§
Source§impl Clone for MetadataEntry
impl Clone for MetadataEntry
Source§fn clone(&self) -> MetadataEntry
fn clone(&self) -> MetadataEntry
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for MetadataEntry
impl Debug for MetadataEntry
Source§impl<'de> Deserialize<'de> for MetadataEntry
impl<'de> Deserialize<'de> for MetadataEntry
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'__msgpack_de> FromMessagePack<'__msgpack_de> for MetadataEntry
impl<'__msgpack_de> FromMessagePack<'__msgpack_de> for MetadataEntry
Source§impl PartialEq for MetadataEntry
impl PartialEq for MetadataEntry
Source§impl Serialize for MetadataEntry
impl Serialize for MetadataEntry
Source§impl ToMessagePack for MetadataEntry
impl ToMessagePack for MetadataEntry
impl Eq for MetadataEntry
impl StructuralPartialEq for MetadataEntry
Auto Trait Implementations§
impl Freeze for MetadataEntry
impl RefUnwindSafe for MetadataEntry
impl Send for MetadataEntry
impl Sync for MetadataEntry
impl Unpin for MetadataEntry
impl UnsafeUnpin for MetadataEntry
impl UnwindSafe for MetadataEntry
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.