Skip to content

Commit 8f0a0e0

Browse files
readyset-adapter: SHOW READYSET STATUS shows enabled feature flags
Add a row to the output of SHOW READYSET STATUS that lists the enabled core dataflow feature flags. Release-Note-Core: `SHOW READYSET STATUS` now lists the enabled feature flags like post-lookups, topk, and straddled-joins. Fixes: REA-4766 Change-Id: I12de7e9ba6b11f2fba5b3a606921a45b78446b18 Reviewed-on: https://gerrit.readyset.name/c/readyset/+/10335 Reviewed-by: Johnathan Davis <jcd@readyset.io> Tested-by: Buildkite CI
1 parent 163ea05 commit 8f0a0e0

File tree

6 files changed

+65
-3
lines changed

6 files changed

+65
-3
lines changed

readyset-adapter/src/status_reporter.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub struct ReadySetStatus {
2222
pub upstream_reachable: Option<bool>,
2323
pub connection_count: usize,
2424
pub persistent_stats: Option<PersistentStats>,
25+
pub enabled_features: Vec<String>,
2526
}
2627

2728
impl ReadySetStatus {
@@ -73,6 +74,15 @@ impl ReadySetStatus {
7374
}
7475
}
7576

77+
if self.enabled_features.is_empty() {
78+
status.push(("Enabled Features".to_string(), "None".to_string()));
79+
} else {
80+
status.push((
81+
"Enabled Features".to_string(),
82+
self.enabled_features.join(", "),
83+
));
84+
}
85+
7686
QueryResult::MetaVariables(status.into_iter().map(MetaVariable::from).collect())
7787
}
7888
}
@@ -110,12 +120,14 @@ where
110120
rs_handle: Option<ReadySetHandle>,
111121
connections: Arc<SkipSet<SocketAddr>>,
112122
authority: Arc<Authority>,
123+
enabled_features: Vec<String>,
113124
) -> Self {
114125
let inner = Arc::new(Mutex::new(ReadySetStatusReporterInner {
115126
upstream: upstream_config.into(),
116127
rs_handle,
117128
connections,
118129
authority,
130+
enabled_features,
119131
}));
120132
Self { inner }
121133
}
@@ -138,6 +150,8 @@ struct ReadySetStatusReporterInner<U> {
138150
pub(crate) connections: Arc<SkipSet<SocketAddr>>,
139151
/// A shared handle to the Authority, used for reading persistent_stats for /readyset_status
140152
pub(crate) authority: Arc<Authority>,
153+
/// Enabled features to display in status
154+
pub(crate) enabled_features: Vec<String>,
141155
}
142156

143157
impl<U> ReadySetStatusReporterInner<U>
@@ -156,6 +170,7 @@ where
156170
upstream_reachable: self.upstream_reachable().await,
157171
connection_count: self.connections.len(),
158172
persistent_stats,
173+
enabled_features: self.enabled_features.clone(),
159174
}
160175
}
161176

readyset-client-test-helpers/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ impl TestBuilder {
416416
Some(rh),
417417
Default::default(),
418418
authority.clone(),
419+
Vec::new(),
419420
);
420421
let backend = backend_builder
421422
.dialect(A::DIALECT)

readyset-logictest/src/runner.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,7 @@ impl TestScript {
702702
Some(rh),
703703
Default::default(),
704704
authority.clone(),
705+
Vec::new(),
705706
);
706707
BackendBuilder::new()
707708
.require_authentication(false)

readyset-mysql/tests/integration.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,7 +1911,7 @@ async fn show_readyset_status() {
19111911

19121912
// NOTE: If this readyset extension has changed, verify the new behavior is correct then update
19131913
// the expected values below
1914-
assert_eq!(ret.len(), 8);
1914+
assert_eq!(ret.len(), 9);
19151915
let row = ret.remove(0);
19161916
assert_eq!(row.get::<String, _>(0).unwrap(), "Database Connection");
19171917
assert_eq!(row.get::<String, _>(1).unwrap(), "Connected");
@@ -1945,6 +1945,9 @@ async fn show_readyset_status() {
19451945
let row = ret.remove(0);
19461946
assert_eq!(row.get::<String, _>(0).unwrap(), "Last started replication");
19471947
assert!(valid_timestamp(row.get::<String, _>(1).unwrap()));
1948+
let row = ret.remove(0);
1949+
assert_eq!(row.get::<String, _>(0).unwrap(), "Enabled Features");
1950+
assert_eq!(row.get::<String, _>(1).unwrap(), "None");
19481951
readyset_maintenance_mode(&mut conn).await;
19491952
shutdown_tx.shutdown().await;
19501953
}
@@ -1955,7 +1958,7 @@ async fn readyset_maintenance_mode(conn: &mut Conn) {
19551958
.unwrap();
19561959
sleep().await;
19571960
let ret: Vec<Row> = conn.query("SHOW READYSET STATUS;").await.unwrap();
1958-
assert_eq!(ret.len(), 8);
1961+
assert_eq!(ret.len(), 9);
19591962
// find the row with "Status"
19601963
let row = ret
19611964
.iter()
@@ -1970,7 +1973,7 @@ async fn readyset_maintenance_mode(conn: &mut Conn) {
19701973
.unwrap();
19711974
sleep().await;
19721975
let ret: Vec<Row> = conn.query("SHOW READYSET STATUS;").await.unwrap();
1973-
assert_eq!(ret.len(), 8);
1976+
assert_eq!(ret.len(), 9);
19741977
let row = ret
19751978
.iter()
19761979
.find(|r| r.get::<String, _>(0).unwrap() == "Status")

readyset-server/src/lib.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,32 @@ impl WorkerOptions {
760760

761761
None
762762
}
763+
764+
/// Get a list of enabled feature flags for status display
765+
pub fn enabled_features(&self) -> Vec<String> {
766+
let mut enabled = Vec::new();
767+
768+
if self.feature_materialization_persistence {
769+
enabled.push("Materialization Persistence".to_string());
770+
}
771+
if self.feature_mixed_comparisons {
772+
enabled.push("Mixed Comparisons".to_string());
773+
}
774+
if self.feature_pagination {
775+
enabled.push("Pagination".to_string());
776+
}
777+
if self.feature_post_lookup {
778+
enabled.push("Post-Lookup".to_string());
779+
}
780+
if self.feature_straddled_joins {
781+
enabled.push("Straddled Joins".to_string());
782+
}
783+
if self.feature_topk {
784+
enabled.push("Top K".to_string());
785+
}
786+
787+
enabled
788+
}
763789
}
764790

765791
// TODO(justin): Change VolumeId type when we know this fixed size.
@@ -820,4 +846,19 @@ mod tests {
820846
let worker_opts = Wrapper::parse_from(["test", "--storage-dir", storage_dir]).worker_opts;
821847
assert_eq!(Some(PathBuf::from(storage_dir)), worker_opts.storage_dir());
822848
}
849+
850+
#[test]
851+
fn enabled_features_default() {
852+
let worker_opts = Wrapper::parse_from(["test"]).worker_opts;
853+
let enabled = worker_opts.enabled_features();
854+
assert!(enabled.is_empty());
855+
}
856+
857+
#[test]
858+
fn enabled_features_multiple() {
859+
let worker_opts =
860+
Wrapper::parse_from(["test", "--feature-pagination", "--feature-topk"]).worker_opts;
861+
let enabled = worker_opts.enabled_features();
862+
assert_eq!(enabled, vec!["Pagination", "Top K"]);
863+
}
823864
}

readyset/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,7 @@ where
875875
Some(rh.clone()),
876876
connections.clone(),
877877
adapter_authority.clone(),
878+
options.server_worker_options.enabled_features(),
878879
);
879880
let ctrlc = tokio::signal::ctrl_c();
880881
let mut sigterm = {

0 commit comments

Comments
 (0)