1#![doc(html_root_url = "https://docs.rs/krabka-raft/1.1.0")]
58
59mod config;
60mod connection_limiter;
61mod controller;
62mod error;
63pub mod event_queue;
64pub mod handshake;
65pub mod kraft;
66mod network;
67mod observed_stream;
68pub mod reconfig;
69pub mod voter_requests;
70mod voter_wire;
71#[cfg(feature = "scenarios")]
76pub use krabka_kraft_core::sim as scenarios;
77mod server;
78mod snapshot;
79#[cfg(test)]
80mod test_support;
81mod types;
82mod wire;
83
84pub use {
85 config::{
86 BootstrapMode, ControllerAdminRequest, ControllerAdminResponse, ControllerAdminRouteFuture,
87 ControllerAdminRouter, ControllerApiVersion, ControllerConfig, ControllerFetchMissLimit,
88 DEFAULT_METADATA_LOG_SEGMENT_ROLL_INTERVAL, DEFAULT_METADATA_LOG_SEGMENT_SIZE,
89 DEFAULT_METADATA_MAX_IDLE_INTERVAL, DEFAULT_METADATA_MAX_RETENTION,
90 DEFAULT_METADATA_MAX_RETENTION_SIZE, KAFKA_4_3_1_APIS, LATEST_PRODUCTION_METADATA_VERSION,
91 ListenerLimits, METADATA_PARTITION_DIR, MIN_METADATA_LOG_SEGMENT_SIZE, MetadataLogConfig,
92 MetadataRaftCommandQueueCapacity, MetadataRaftFetchMax, RaftShardRouter,
93 RegistrationAdmission, RegistrationAdmissionFuture, ReleasedApi, ShardRouteFuture,
94 UnstableApiVersions, UnstableFeatureVersions, kafka_4_3_1_api, kafka_4_3_1_max,
95 metadata_partition_dir, supported_feature_range, supported_feature_ranges,
96 },
97 connection_limiter::{
98 AcceptingListener, ConnectionGuard, ConnectionLimit, ConnectionLimiter, ConnectionLimits,
99 ConnectionQuotaSettings, ConnectionQuotas, IpOverrides, MAX_CONNECTION_CREATION_RATE,
100 MAX_CONNECTIONS, MAX_CONNECTIONS_PER_IP, MAX_CONNECTIONS_PER_IP_OVERRIDES,
101 },
102 controller::{
103 Controller, ControllerHandle, QuorumState, QuorumStateSnapshot, SnapshotRange,
104 SnapshotSlice, metadata_log_nonempty,
105 },
106 error::{MetadataReplayError, PersistedFormatError, RaftError},
107 event_queue::{EventQueueRecorder, NoEventQueueRecorder},
108 handshake::{
109 AllowAllGrants, ClusterGrants, ClusterOperation, ControllerApiVersions, HandshakeStream,
110 RaftConnection, RaftHandshakeError, RaftListenerHandshake,
111 },
112 kraft::{
113 MetadataFetchSlice,
114 controller::{control_batch_image_records, decode_committed_value, is_kip835_noop},
115 },
116 network::{OutboundDialer, PlaintextDialer},
117 observed_stream::{ObservedStream, StreamObserver},
118 reconfig::{AddVoter, ReconfigOutcome, RemoveVoter, UpdateVoter},
119 server::{
120 api_versions_max_version, describe_quorum::describe_quorum, fetch_error_response,
121 finalized_feature_keys, is_valid_api_versions_request, is_valid_client_info,
122 supported_feature_key, supported_feature_keys, unsupported_version_response,
123 },
124 types::{
125 AppData, AppDataResponse, DelegationTokenMutation, Node, NodeId, OffsetReservation,
126 SubmitChangeResult,
127 },
128};
129
130pub fn serialize_metadata_snapshot(
135 image: &krabka_metadata::MetadataImage,
136 last_contained_log_timestamp: i64,
137) -> Result<bytes::Bytes, RaftError> {
138 snapshot::SnapshotWriter::serialize(image, last_contained_log_timestamp)
139}
140
141pub fn serialize_bootstrap_snapshot(
153 kraft_version: u16,
154 voters: &krabka_metadata::VoterSet,
155 records: &[krabka_metadata::MetadataRecord],
156 last_contained_log_timestamp: i64,
157) -> Result<bytes::Bytes, RaftError> {
158 snapshot::SnapshotWriter::serialize_bootstrap(
159 &snapshot::SnapshotControlState {
160 kraft_version,
161 voters: voters.clone(),
162 },
163 records,
164 last_contained_log_timestamp,
165 )
166}
167
168pub fn deserialize_metadata_snapshot(
177 bytes: &[u8],
178) -> Result<Vec<krabka_metadata::MetadataRecord>, RaftError> {
179 Ok(snapshot::SnapshotReader::read(bytes)?.metadata_records)
180}
181
182pub fn deserialize_metadata_snapshot_image(
193 bytes: &[u8],
194) -> Result<Vec<krabka_metadata::MetadataRecord>, RaftError> {
195 let snapshot = snapshot::SnapshotReader::read(bytes)?;
196 let controls = snapshot.control_state.into_iter().flat_map(|controls| {
197 [
198 krabka_metadata::MetadataRecord::V1KRaftVersion(krabka_metadata::KRaftVersionRecord {
199 kraft_version: controls.kraft_version,
200 }),
201 krabka_metadata::MetadataRecord::V1Voters(krabka_metadata::VotersRecord {
202 voters: controls.voters,
203 }),
204 ]
205 });
206 Ok(controls.chain(snapshot.metadata_records).collect())
207}
208
209pub fn metadata_snapshot_last_contained_log_timestamp(bytes: &[u8]) -> Result<i64, RaftError> {
215 snapshot::SnapshotReader::last_contained_log_timestamp(bytes)
216}
217pub use wire::{
218 API_KEY_DELEGATION_TOKEN_MUTATION, API_KEY_METADATA_FETCH, API_KEY_SUBMIT_CHANGE,
219 KrabkaMetadataFetchRequest, KrabkaMetadataFetchResponse, KrabkaSubmitChangeRequest,
220 KrabkaSubmitChangeResponse, PRIVATE_BASELINE_VERSION, PRIVATE_CLUSTER_AUTHORIZATION_FAILED,
221 PRIVATE_UNSUPPORTED_VERSION, SUBMIT_CHANGE_UNCOMMITTED_TAIL, private_api_highest_version,
222 private_request_version,
223};