Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,123 changes: 1,719 additions & 1,404 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["src/cluster_mgr", "src/devtools", "src/rest_api"]
members = ["src/cluster_mgr"]

resolver = "2"

Expand Down
3 changes: 1 addition & 2 deletions scripts/build-release-tarball.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,12 @@ mkdir -p "${PKG_DIR}/bin" "${OUTPUT_DIR}"

pushd "${WORKSPACE_DIR}" >/dev/null

cargo build --package cluster_mgr --package rest_api --release
cargo build --package cluster_mgr --release

"${WORKSPACE_DIR}/version.sh" >"${PKG_DIR}/version" 2>/dev/null || true
cp -r "${WORKSPACE_DIR}/src/cluster_mgr/config" "${PKG_DIR}/"
cp -r "${WORKSPACE_DIR}/tests" "${PKG_DIR}/"
cp "${TARGET_DIR}/release/cluster_mgr" "${PKG_DIR}/bin/"
cp "${TARGET_DIR}/release/rest_api" "${PKG_DIR}/bin/"
ln -sfn cluster_mgr "${PKG_DIR}/bin/eloqctl"

tar -czf "${OUTPUT_DIR}/${TARBALL}" -C "${PKG_DIR}" .
Expand Down
8 changes: 0 additions & 8 deletions src/cluster_mgr/config/deployment_sqlite.sql
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,6 @@ create table if not exists t_snapshot_info
dest_user varchar(100) not null,
primary key (cluster_name, snapshot_ts)
);
create table if not exists t_proxy
(
proxy_name varchar(200) not null primary key,
proxy_config text not null,
proxy_host_list text not null,
create_timestamp timestamp not null DEFAULT CURRENT_TIMESTAMP,
update_timestamp timestamp not null DEFAULT CURRENT_TIMESTAMP
);
create table if not exists t_topology_tx
(
cluster_name varchar(200) not null,
Expand Down
218 changes: 4 additions & 214 deletions src/cluster_mgr/src/cli/cmd_base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ use crate::cli::task::upload::upload_task_builder::{
build_task_instance, get_source_host, upload_tasks, UploadTaskBuilderType,
};
use crate::cli::util::{cpu_arch, file_pg_bar, os_id, os_major_version};
use crate::cli::BackupCommand;
use crate::cli::{
download_dir, upload_dir, MonitorCommand, SubCommand, UpdateMonitorComponent, HOME_DIR,
};
use crate::cli::{BackupCommand, ProxyCommand};
use crate::config::config_base::{DeployConfig, UploadFile, VersionRow};
use crate::config::config_base::{
ALERTMANAGER_FILE_KEY, GRAFANA_FILE_KEY, NODE_EXPORTER_FILE_KEY, PROMETHEUSALERT_FILE_KEY,
Expand All @@ -30,7 +30,6 @@ use crate::config::monitor::{
Alertmanager, Exporter, Grafana, Monitor, Prometheus, ALERTMANAGER_WEBHOOK_ADAPTER_DEFAULT_URL,
ALERTMANAGER_WEBHOOK_ADAPTER_PORT,
};
use crate::config::proxy_config_base::ProxyConfig;
use crate::config::storage_service_config::{
DataStoreServiceBackend, DataStoreServiceMode, RocksDB, RocksLocal, StorageService,
};
Expand All @@ -40,10 +39,7 @@ use crate::config::{
use crate::github_release::{
fetch_eloqkv_releases, find_eloqkv_asset, find_product_asset, list_versions_from_releases,
};
use crate::state::proxy_operation::{ProxyEntity, ProxyOperation};
use crate::state::state_base::{QueryCondition, StateOperation};
use crate::state::state_mgr::{StateMgr, PROXY_STATE, STATE_MGR};
use crate::StateValue;
use crate::state::state_mgr::{StateMgr, STATE_MGR};
use anyhow::{anyhow, bail, Result};
use futures::StreamExt;
use itertools::Itertools;
Expand Down Expand Up @@ -1173,9 +1169,7 @@ impl CmdExecutor {
quiet: bool,
verbose: bool,
) -> Result<()> {
let Config::Cluster(cfg) = config.clone() else {
unreachable!();
};
let Config::Cluster(cfg) = config.clone();

let download_only = match &cmd {
SubCommand::Update { download_only, .. } => *download_only,
Expand Down Expand Up @@ -1384,40 +1378,6 @@ impl CmdExecutor {
}
}
}
Config::Proxy(proxy_config) => {
proxy_config.connection.auth.check_keypair()?;
match cmd.clone() {
SubCommand::Proxy { .. } => {
let task_mgr = self.task_mgr.clone();
let outfile = if quiet {
let f = fs::OpenOptions::new()
.create(true)
.truncate(true)
.open(self.home.join("operation-result"))?;
Some(f)
} else {
None
};

let recv_rs_and_print_join = tokio::task::spawn(async move {
task_mgr
.write_task_result(outfile, verbose)
.await
.expect("write operation result failed");
});

let rs = self
.task_mgr
.run_tasks(cmd.clone(), Config::Proxy(proxy_config.clone()))
.await?;
recv_rs_and_print_join.await?;
info!(r#"all tasks complete. task_size={}"#, rs.len());

self.finishing(cmd, Config::Proxy(proxy_config)).await?;
}
_ => unreachable!(),
}
}
}

Ok(())
Expand All @@ -1433,47 +1393,6 @@ impl CmdExecutor {
Ok(())
}

async fn save_proxy_config(&self, config: &ProxyConfig, upsert: bool) -> Result<()> {
println!("save_proxy_config for ProxyConfig");
let proxy_operation = self
.state_mgr
.get_state_operation::<ProxyOperation>(PROXY_STATE);

let proxy_name = config.proxy_service.proxy_name.clone();
let proxy_entity = proxy_operation
.load(|| -> Option<QueryCondition> {
Some(QueryCondition {
cond_text: "proxy_name = $1".to_string(),
bind_values: vec![StateValue::Varchar(proxy_name.to_string())],
})
})
.await?;
if !proxy_entity.is_empty() && !upsert {
bail!("Proxy {proxy_name} already exists");
}
// Extract and concatenate hosts
let all_hosts = config
.proxy_service
.proxy_addrs
.iter()
.map(|addr| addr.split(':').next().unwrap())
.collect::<Vec<&str>>()
.join(";");
let config_string = config.to_yaml();
info!("ProxyConfig saved: proxy_name={proxy_name} @ {all_hosts}");
let default_timestamp = chrono::DateTime::default();
proxy_operation
.put(ProxyEntity {
proxy_name: proxy_name.to_string(),
proxy_config: config_string,
proxy_host_list: all_hosts,
create_timestamp: default_timestamp,
update_timestamp: default_timestamp,
})
.await?;
Ok(())
}

fn validate_metrics_config(config: &DeployConfig) -> Result<()> {
if let Some(monitor) = &config.deployment.monitor {
let has_eloq = monitor.eloq_metrics.is_some();
Expand Down Expand Up @@ -2043,36 +1962,6 @@ impl CmdExecutor {

Ok(Config::Cluster(config))
}
SubCommand::Proxy { command } => {
match &command {
ProxyCommand::Start { config } => {
// Load and handle the Start command with the provided config
let mut proxy_config = ProxyConfig::load(Some(config.to_string()))?;
self.resolve_proxy_version(&mut proxy_config);
self.save_proxy_config(&proxy_config, true).await?;
Ok(Config::Proxy(proxy_config))
}
ProxyCommand::Stop { proxy_name } => {
let proxy_config = self
.state_mgr
.load_proxy_from_state(Some(proxy_name.clone()))
.await?
.ok_or(anyhow!("proxy config not found"))?;
Ok(Config::Proxy(proxy_config))
}
ProxyCommand::List { proxy_name } => {
let proxy_config = self
.state_mgr
.load_proxy_from_state(proxy_name.clone())
.await?
.ok_or_else(|| anyhow!("proxy config not found"))?;
Ok(Config::Proxy(proxy_config))
}
ProxyCommand::Add { .. } | ProxyCommand::Remove { .. } => {
todo!()
}
}
}

_ => Err(anyhow!("unexpected command: {cmd:?}")),
}
Expand Down Expand Up @@ -2195,7 +2084,6 @@ impl CmdExecutor {
self.save_deployment_config(&deploy_config, true).await?;
Config::Cluster(deploy_config)
}
Config::Proxy(proxy_config) => Config::Proxy(proxy_config),
},
None => self.get_config(cmd.clone()).await?,
};
Expand Down Expand Up @@ -2322,46 +2210,11 @@ impl CmdExecutor {
}
}
}
Config::Proxy(proxy_config) => {
proxy_config.connection.auth.check_keypair()?;
match cmd.clone() {
SubCommand::Proxy { .. } => {
let task_mgr = self.task_mgr.clone();
let outfile = if quiet {
let f = fs::OpenOptions::new()
.create(true)
.truncate(true)
.open(self.home.join("task-result"))?;
Some(f)
} else {
None
};

let recv_rs_and_print_join = tokio::task::spawn(async move {
task_mgr
.write_task_result(outfile, verbose)
.await
.expect("write task result failed");
});

// Generate and run tasks
let rs = self
.task_mgr
.run_tasks(cmd.clone(), Config::Proxy(proxy_config.clone()))
.await?;
recv_rs_and_print_join.await?;
info!(r#"all tasks complete. task_size={}"#, rs.len());

// Using cluster_config again without moving it
self.finishing(cmd, Config::Proxy(proxy_config)).await?;
}
_ => unreachable!(),
}
}
}

Ok(())
}

async fn finishing(&self, cmd: SubCommand, config: Config) -> Result<()> {
// After all tasks finished
match config {
Expand Down Expand Up @@ -2544,54 +2397,6 @@ impl CmdExecutor {
},
_ => {}
},
Config::Proxy(..) => match cmd {
SubCommand::Proxy { command } => match &command {
ProxyCommand::Start { .. } => {
println!("Launch proxy finished, Enjoy!");
}
ProxyCommand::Stop { .. } => {
println!("Proxy stopped.");
}
ProxyCommand::List { proxy_name } => {
let success_task_entity = STATE_MGR.list_proxy(proxy_name).await?;

let success_task_vec = success_task_entity
.iter()
.map(|proxy_info_entity| {
let proxy_name = &proxy_info_entity.proxy_name;
let proxy_config = &proxy_info_entity.proxy_config;
(proxy_name, proxy_config)
})
.collect_vec();

// Iterate over each proxy configuration
for (proxy_name, proxy_config) in success_task_vec {
// Parse the proxy_config string as YAML
let proxy_config: ProxyConfig = serde_yaml::from_str(proxy_config)
.map_err(|e| {
anyhow!(
"Failed to parse proxy_config for '{}': {}",
proxy_name,
e
)
})?;

// Extract eloqkv_cluster_addr
println!(
"Proxy Name: {}\neloqkv_cluster_addr: {:#?}\n",
proxy_name, proxy_config.proxy_service.eloqkv_cluster_addr
);
}
}
ProxyCommand::Add { cluster_name, .. } => {
println!("Cluster {cluster_name} is added to proxy service.");
}
ProxyCommand::Remove { cluster_name, .. } => {
println!("Cluster {cluster_name} is removed from proxy service.");
}
},
_ => unreachable!(),
},
}
Ok(())
}
Expand Down Expand Up @@ -2680,20 +2485,6 @@ impl CmdExecutor {
Ok(())
}

pub fn resolve_proxy_version(&self, cnf: &mut ProxyConfig) {
let arch = cpu_arch();
let os = self.os_vers();

// Bind the PathBuf to a variable to extend its lifetime
let path_buf = PathBuf::from(CDN);
let prefix = path_buf.as_path().to_str().unwrap();

// Rest of your code remains the same
let url = format!("{prefix}/eloqkv/tools/{arch}/{os}/eloqkv-proxy");
info!("proxy service binary is set: {url}");
cnf.proxy_service.bin_download_url = Some(url);
}

async fn gen_demo_config(&self, cmd: SubCommand) -> Result<Config> {
match cmd {
SubCommand::Demo {
Expand All @@ -2713,7 +2504,6 @@ impl CmdExecutor {
let deploy = &mut config.deployment;
// set storage
match store {
StorageProvider::Dynamodb => unimplemented!(),
StorageProvider::Rocksdb => {
deploy
.storage_service
Expand Down
Loading
Loading