Skip to content

Commit

Permalink
readyset: Infer default database_type from upstream_db_url
Browse files Browse the repository at this point in the history
Make the database-type argument optional if the upstream_db_url is
present, and infer it from the upstream db url (by parsing it) if it's
not provided. If it *is* provided, check that it matches so we can
provide a nicer error message if it doesn't match.

Fixes: ENG-2935
Fixes: ENG-2897
Change-Id: Iae6e4e0beba0aa8eaff8c18befd60d53fe56da3f
Reviewed-on: https://gerrit.readyset.name/c/readyset/+/4781
Reviewed-by: Dan Wilbanks <dan@readyset.io>
Tested-by: Buildkite CI
  • Loading branch information
glittershark committed Apr 27, 2023
1 parent 32ca537 commit 8ad4482
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 4 deletions.
90 changes: 87 additions & 3 deletions readyset/src/lib.rs
Expand Up @@ -162,9 +162,15 @@ pub struct Options {
#[clap(long, env = "DEPLOYMENT", value_parser = NonEmptyStringValueParser::new())]
deployment: String,

/// Database engine protocol to emulate
#[clap(long, env = "DATABASE_TYPE", value_enum)]
pub database_type: DatabaseType,
/// Database engine protocol to emulate. If omitted, will be inferred from the
/// `upstream-db-url`
#[clap(
long,
env = "DATABASE_TYPE",
value_enum,
required_unless_present("upstream_db_url")
)]
pub database_type: Option<DatabaseType>,

/// Run ReadySet in standalone mode, running a readyset-server instance within this adapter.
#[clap(long, env = "STANDALONE", conflicts_with = "embedded_readers")]
Expand Down Expand Up @@ -381,6 +387,33 @@ pub struct Options {
cleanup: bool,
}

impl Options {
/// Return the configured database type, either explicitly set by the user or inferred from the
/// upstream DB URL
pub fn database_type(&self) -> anyhow::Result<DatabaseType> {
let infer_from_db_url = |db_url: &str| Ok(db_url.parse::<DatabaseURL>()?.database_type());

match (
self.database_type,
&self.server_worker_options.replicator_config.upstream_db_url,
) {
(None, None) => bail!("One of either --database-type or --upstream-db-url is required"),
(None, Some(url)) => infer_from_db_url(url),
(Some(dt), None) => Ok(dt),
(Some(dt), Some(url)) => {
let inferred = infer_from_db_url(url)?;
if dt != inferred {
bail!(
"Provided --database-type {dt} does not match database type {inferred} for \
--upstream-db-url"
);
}
Ok(dt)
}
}
}
}

// Command-line options for running the experimental fallback_cache.
//
// This option struct is intended to be embedded inside of a larger option struct using
Expand Down Expand Up @@ -1363,4 +1396,55 @@ mod tests {
assert_eq!(opts.max_processing_minutes, 15);
assert_eq!(opts.migration_task_interval, 20000);
}

#[test]
fn infer_database_type() {
let opts = Options::parse_from(vec![
"readyset",
"--deployment",
"test",
"--address",
"0.0.0.0:3306",
"--upstream-db-url",
"mysql://root:password@mysql:3306/readyset",
]);
assert_eq!(opts.database_type().unwrap(), DatabaseType::MySQL);

let opts = Options::parse_from(vec![
"readyset",
"--deployment",
"test",
"--address",
"0.0.0.0:3306",
"--upstream-db-url",
"postgresql://root:password@db/readyset",
]);
assert_eq!(opts.database_type().unwrap(), DatabaseType::PostgreSQL);

let opts = Options::parse_from(vec![
"readyset",
"--deployment",
"test",
"--address",
"0.0.0.0:3306",
"--upstream-db-url",
"postgresql://root:password@db/readyset",
"--database-type",
"postgresql",
]);
assert_eq!(opts.database_type().unwrap(), DatabaseType::PostgreSQL);

let opts = Options::parse_from(vec![
"readyset",
"--deployment",
"test",
"--address",
"0.0.0.0:3306",
"--upstream-db-url",
"postgresql://root:password@db/readyset",
"--database-type",
"mysql",
]);
opts.database_type().unwrap_err();
}
}
3 changes: 2 additions & 1 deletion readyset/src/main.rs
Expand Up @@ -8,7 +8,8 @@ use readyset::{NoriaAdapter, Options};

fn main() -> anyhow::Result<()> {
let options = Options::parse();
match options.database_type {

match options.database_type()? {
DatabaseType::MySQL => NoriaAdapter {
description: "MySQL adapter for ReadySet.",
default_address: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 3306),
Expand Down

0 comments on commit 8ad4482

Please sign in to comment.