Skip to content

Commit cf424f8

Browse files
committed
Disable log-server role by default to fix v1.0.x compatibility
This change disables the log-server role by default to avoid breaking. Additionally, if log-server role is enabled, log-server will not start unless the binary is built with `-F replicated-loglet` to protect the public release from starting the server. This change is necessary to maintain compatibility with v1.0.x. This change also attempts to detect the presence of log-store and asks the user to remove it manually. We don't remove it automatically to avoid accidental data wipes if accidental rollbacks took place from future versions back to this.
1 parent be0b332 commit cf424f8

File tree

4 files changed

+46
-4
lines changed

4 files changed

+46
-4
lines changed

crates/node/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ publish = false
1010
[features]
1111
default = []
1212
memory-loglet = ["restate-bifrost/memory-loglet"]
13+
replicated-loglet = ["restate-bifrost/replicated-loglet"]
1314
options_schema = [
1415
"dep:schemars",
1516
"restate-admin/options_schema",
@@ -18,7 +19,7 @@ options_schema = [
1819

1920
[dependencies]
2021
restate-admin = { workspace = true, features = ["servers"] }
21-
restate-bifrost = { workspace = true, features = ["replicated-loglet"] }
22+
restate-bifrost = { workspace = true }
2223
restate-core = { workspace = true }
2324
restate-errors = { workspace = true }
2425
restate-log-server = { workspace = true }

crates/node/src/lib.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use restate_core::{
2626
spawn_metadata_manager, MetadataBuilder, MetadataKind, MetadataManager, TargetVersion,
2727
};
2828
use restate_core::{task_center, TaskKind};
29+
#[cfg(feature = "replicated-loglet")]
2930
use restate_log_server::LogServerService;
3031
use restate_metadata_store::local::LocalMetadataStoreService;
3132
use restate_metadata_store::MetadataStoreClient;
@@ -108,6 +109,7 @@ pub struct Node {
108109
metadata_store_role: Option<LocalMetadataStoreService>,
109110
admin_role: Option<AdminRole>,
110111
worker_role: Option<WorkerRole>,
112+
#[cfg(feature = "replicated-loglet")]
111113
log_server: Option<LogServerService>,
112114
server: NetworkServer,
113115
}
@@ -164,6 +166,7 @@ impl Node {
164166

165167
// Setup bifrost
166168
// replicated-loglet
169+
#[cfg(feature = "replicated-loglet")]
167170
let replicated_loglet_factory = restate_bifrost::providers::replicated_loglet::Factory::new(
168171
updateable_config
169172
.clone()
@@ -175,12 +178,18 @@ impl Node {
175178
&mut router_builder,
176179
);
177180
let bifrost_svc = BifrostService::new(tc.clone(), metadata.clone())
178-
.enable_local_loglet(&updateable_config)
179-
.with_factory(replicated_loglet_factory);
181+
.enable_local_loglet(&updateable_config);
182+
183+
#[cfg(feature = "replicated-loglet")]
184+
let bifrost_svc = bifrost_svc.with_factory(replicated_loglet_factory);
180185

181186
#[cfg(feature = "memory-loglet")]
182187
let bifrost_svc = bifrost_svc.enable_in_memory_loglet();
183188

189+
#[cfg(not(feature = "replicated-loglet"))]
190+
warn_if_log_store_left_artifacts(&config);
191+
192+
#[cfg(feature = "replicated-loglet")]
184193
let log_server = if config.has_role(Role::LogServer) {
185194
Some(
186195
LogServerService::create(
@@ -260,6 +269,7 @@ impl Node {
260269
metadata_store_client,
261270
admin_role,
262271
worker_role,
272+
#[cfg(feature = "replicated-loglet")]
263273
log_server,
264274
server,
265275
})
@@ -375,6 +385,7 @@ impl Node {
375385
tc.run_in_scope("bifrost-init", None, self.bifrost.start())
376386
.await?;
377387

388+
#[cfg(feature = "replicated-loglet")]
378389
if let Some(log_server) = self.log_server {
379390
tc.spawn(
380391
TaskKind::SystemBoot,
@@ -608,3 +619,12 @@ impl Node {
608619
.await
609620
}
610621
}
622+
623+
#[cfg(not(feature = "replicated-loglet"))]
624+
fn warn_if_log_store_left_artifacts(config: &Configuration) {
625+
if config.log_server.data_dir().exists() {
626+
tracing::warn!("Log server data directory '{}' exists, \
627+
but log-server is not implemented in this version of restate-server. \
628+
This may indicate that the log-server role was previously enabled and the data directory was not cleaned up. If this was created by v1.1.1 of restate-server, please remove this directory to avoid potential future conflicts.", config.log_server.data_dir().display());
629+
}
630+
}

crates/types/src/config/common.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,13 @@ impl CommonOptions {
304304
impl Default for CommonOptions {
305305
fn default() -> Self {
306306
Self {
307-
roles: EnumSet::all(),
307+
// todo (asoli): Remove this when:
308+
// a. The safe rollback version supports log-server (at least supports parsing the
309+
// config with the log-server role)
310+
// b. When log-server becomes enabled by default.
311+
//
312+
// see "roles_compat_test" test below.
313+
roles: EnumSet::all() - Role::LogServer,
308314
node_name: None,
309315
force_node_id: None,
310316
cluster_name: "localcluster".to_owned(),
@@ -542,3 +548,17 @@ impl Default for TracingOptions {
542548
}
543549
}
544550
}
551+
#[cfg(test)]
552+
mod tests {
553+
use crate::nodes_config::Role;
554+
555+
use super::CommonOptions;
556+
557+
#[test]
558+
fn roles_compat_test() {
559+
let opts = CommonOptions::default();
560+
// make sure we don't add log-server by default until previous version can parse nodes
561+
// configuration with this role.
562+
assert!(!opts.roles.contains(Role::LogServer));
563+
}
564+
}

server/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ options_schema = [
2727
"restate-types/schemars",
2828
]
2929
memory-loglet = ["restate-node/memory-loglet"]
30+
replicated-loglet = ["restate-node/replicated-loglet"]
3031

3132
[dependencies]
3233
restate-admin = { workspace = true }

0 commit comments

Comments
 (0)