Skip to content

Commit 68ec083

Browse files
committed
Add replica management
1 parent 1c72ac0 commit 68ec083

File tree

5 files changed

+87
-3
lines changed

5 files changed

+87
-3
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ features = {}
4646

4747
[dependencies.typedb-driver]
4848
features = []
49-
rev = "f1bf3d9e327344fe7a67084c13da4eb0fb5ca2be"
49+
rev = "41e42b94ef0bee98d59ae627e46c45acb14a0700"
5050
git = "https://github.com/typedb/typedb-driver"
5151
default-features = false
5252

dependencies/typedb/repositories.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def typedb_driver():
2020
git_repository(
2121
name = "typedb_driver",
2222
remote = "https://github.com/farost/typedb-driver",
23-
commit = "f1bf3d9e327344fe7a67084c13da4eb0fb5ca2be", # sync-marker: do not remove this comment, this is used for sync-dependencies by @typedb_driver
23+
commit = "41e42b94ef0bee98d59ae627e46c45acb14a0700", # sync-marker: do not remove this comment, this is used for sync-dependencies by @typedb_driver
2424
)
2525
# git_repository(
2626
# name = "typedb_driver",

src/main.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use crate::{
4040
},
4141
runtime::BackgroundRuntime,
4242
};
43+
use crate::operations::{replica_deregister, replica_list, replica_primary, replica_register, server_version};
4344

4445
mod cli;
4546
mod completions;
@@ -277,6 +278,9 @@ fn execute_commands(
277278
}
278279

279280
fn entry_repl(driver: Arc<TypeDBDriver>, runtime: BackgroundRuntime) -> Repl<ConsoleContext> {
281+
let server_commands = Subcommand::new("server")
282+
.add(CommandLeaf::new("version", "Retrieve server version.", server_version));
283+
280284
let database_commands = Subcommand::new("database")
281285
.add(CommandLeaf::new("list", "List databases on the server.", database_list))
282286
.add(CommandLeaf::new_with_input(
@@ -350,6 +354,25 @@ fn entry_repl(driver: Arc<TypeDBDriver>, runtime: BackgroundRuntime) -> Repl<Con
350354
user_update_password,
351355
));
352356

357+
let replica_commands = Subcommand::new("replica")
358+
.add(CommandLeaf::new("list", "List replicas.", replica_list))
359+
.add(CommandLeaf::new("primary", "Get current primary replica.", replica_primary))
360+
.add(CommandLeaf::new_with_inputs(
361+
"register",
362+
"Register new replica.",
363+
vec![
364+
CommandInput::new("replica id", get_word, None, None),
365+
CommandInput::new("address", get_word, None, None),
366+
],
367+
replica_register,
368+
))
369+
.add(CommandLeaf::new_with_input(
370+
"deregister",
371+
"Deregister existing replica.",
372+
CommandInput::new("replica id", get_word, None, None),
373+
replica_deregister,
374+
));
375+
353376
let transaction_commands = Subcommand::new("transaction")
354377
.add(CommandLeaf::new_with_input(
355378
"read",
@@ -373,8 +396,10 @@ fn entry_repl(driver: Arc<TypeDBDriver>, runtime: BackgroundRuntime) -> Repl<Con
373396
let history_path = home_dir().unwrap_or_else(|| temp_dir()).join(ENTRY_REPL_HISTORY);
374397

375398
let repl = Repl::new(PROMPT.to_owned(), history_path, false, None)
399+
.add(server_commands)
376400
.add(database_commands)
377401
.add(user_commands)
402+
.add(replica_commands)
378403
.add(transaction_commands);
379404

380405
repl

src/operations.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ use crate::{
2525
transaction_repl, ConsoleContext,
2626
};
2727

28+
pub(crate) fn server_version(context: &mut ConsoleContext, _input: &[String]) -> CommandResult {
29+
let driver = context.driver.clone();
30+
let server_version = context
31+
.background_runtime
32+
.run(async move { driver.server_version().await })
33+
.map_err(|err| Box::new(err) as Box<dyn Error + Send>)?;
34+
println!("{}", server_version);
35+
Ok(())
36+
}
37+
2838
pub(crate) fn database_list(context: &mut ConsoleContext, _input: &[String]) -> CommandResult {
2939
let driver = context.driver.clone();
3040
let databases = context
@@ -186,6 +196,55 @@ pub(crate) fn user_update_password(context: &mut ConsoleContext, input: &[String
186196
Ok(())
187197
}
188198

199+
pub(crate) fn replica_list(context: &mut ConsoleContext, _input: &[String]) -> CommandResult {
200+
let driver = context.driver.clone();
201+
let replicas = driver.replicas();
202+
if replicas.is_empty() {
203+
println!("No replicas are present.");
204+
} else {
205+
for replica in replicas {
206+
println!("{}", replica.address());
207+
}
208+
}
209+
Ok(())
210+
}
211+
212+
pub(crate) fn replica_primary(context: &mut ConsoleContext, _input: &[String]) -> CommandResult {
213+
let driver = context.driver.clone();
214+
let primary_replica = driver.primary_replica();
215+
if let Some(primary_replica) = primary_replica {
216+
println!("{}", primary_replica.address());
217+
} else {
218+
println!("No primary replica is present.");
219+
}
220+
Ok(())
221+
}
222+
223+
pub(crate) fn replica_register(context: &mut ConsoleContext, input: &[String]) -> CommandResult {
224+
let driver = context.driver.clone();
225+
let replica_id: u64 = input[0].parse().map_err(|_| Box::new(ReplError { message: format!("Replica id '{}' must be a number.", input[0]) })
226+
as Box<dyn Error + Send>)?;
227+
let address = input[1].clone();
228+
context
229+
.background_runtime
230+
.run(async move { driver.register_replica(replica_id, address).await })
231+
.map_err(|err| Box::new(err) as Box<dyn Error + Send>)?;
232+
println!("Successfully registered replica.");
233+
Ok(())
234+
}
235+
236+
pub(crate) fn replica_deregister(context: &mut ConsoleContext, input: &[String]) -> CommandResult {
237+
let driver = context.driver.clone();
238+
let replica_id: u64 = input[0].parse().map_err(|_| Box::new(ReplError { message: format!("Replica id '{}' must be a number.", input[0]) })
239+
as Box<dyn Error + Send>)?;
240+
context
241+
.background_runtime
242+
.run(async move { driver.deregister_replica(replica_id).await })
243+
.map_err(|err| Box::new(err) as Box<dyn Error + Send>)?;
244+
println!("Successfully deregistered replica.");
245+
Ok(())
246+
}
247+
189248
pub(crate) fn transaction_read(context: &mut ConsoleContext, input: &[String]) -> CommandResult {
190249
let driver = context.driver.clone();
191250
let db_name = &input[0];

0 commit comments

Comments
 (0)