drop migration lock emergency helper command
This commit is contained in:
parent
bcf7f9183d
commit
ee35c15ff4
@ -29,7 +29,7 @@ use log::{debug, error, info, warn};
|
|||||||
use metered::{metered, ErrorCount, HitCount, ResponseTime, Throughput};
|
use metered::{metered, ErrorCount, HitCount, ResponseTime, Throughput};
|
||||||
use migration::sea_orm::{self, ConnectionTrait, Database, DatabaseConnection};
|
use migration::sea_orm::{self, ConnectionTrait, Database, DatabaseConnection};
|
||||||
use migration::sea_query::table::ColumnDef;
|
use migration::sea_query::table::ColumnDef;
|
||||||
use migration::{Alias, Migrator, MigratorTrait, Table};
|
use migration::{Alias, DbErr, Migrator, MigratorTrait, Table};
|
||||||
use moka::future::Cache;
|
use moka::future::Cache;
|
||||||
use redis_rate_limiter::{DeadpoolRuntime, RedisConfig, RedisPool, RedisRateLimiter};
|
use redis_rate_limiter::{DeadpoolRuntime, RedisConfig, RedisPool, RedisRateLimiter};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
@ -149,12 +149,11 @@ pub async fn flatten_handles<T>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connect to the database and run migrations
|
pub async fn get_db(
|
||||||
pub async fn get_migrated_db(
|
|
||||||
db_url: String,
|
db_url: String,
|
||||||
min_connections: u32,
|
min_connections: u32,
|
||||||
max_connections: u32,
|
max_connections: u32,
|
||||||
) -> anyhow::Result<DatabaseConnection> {
|
) -> Result<DatabaseConnection, DbErr> {
|
||||||
// TODO: scrub credentials and then include the db_url in logs
|
// TODO: scrub credentials and then include the db_url in logs
|
||||||
info!("Connecting to db");
|
info!("Connecting to db");
|
||||||
|
|
||||||
@ -169,19 +168,35 @@ pub async fn get_migrated_db(
|
|||||||
.sqlx_logging(false);
|
.sqlx_logging(false);
|
||||||
// .sqlx_logging_level(log::LevelFilter::Info);
|
// .sqlx_logging_level(log::LevelFilter::Info);
|
||||||
|
|
||||||
let db_conn = Database::connect(db_opt).await?;
|
Database::connect(db_opt).await
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn drop_migration_lock(db_conn: &DatabaseConnection) -> Result<(), DbErr> {
|
||||||
let db_backend = db_conn.get_database_backend();
|
let db_backend = db_conn.get_database_backend();
|
||||||
|
|
||||||
let migration_lock_table_ref = Alias::new("migration_lock");
|
let drop_lock_statment = db_backend.build(Table::drop().table(Alias::new("migration_lock")));
|
||||||
|
|
||||||
|
db_conn.execute(drop_lock_statment).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Connect to the database and run migrations
|
||||||
|
pub async fn get_migrated_db(
|
||||||
|
db_url: String,
|
||||||
|
min_connections: u32,
|
||||||
|
max_connections: u32,
|
||||||
|
) -> anyhow::Result<DatabaseConnection> {
|
||||||
|
let db_conn = get_db(db_url, min_connections, max_connections).await?;
|
||||||
|
|
||||||
|
let db_backend = db_conn.get_database_backend();
|
||||||
|
|
||||||
// TODO: put the timestamp into this?
|
// TODO: put the timestamp into this?
|
||||||
let create_lock_statment = db_backend.build(
|
let create_lock_statment = db_backend.build(
|
||||||
Table::create()
|
Table::create()
|
||||||
.table(migration_lock_table_ref.clone())
|
.table(Alias::new("migration_lock"))
|
||||||
.col(ColumnDef::new(Alias::new("locked")).boolean().default(true)),
|
.col(ColumnDef::new(Alias::new("locked")).boolean().default(true)),
|
||||||
);
|
);
|
||||||
let drop_lock_statment = db_backend.build(Table::drop().table(migration_lock_table_ref));
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if Migrator::get_pending_migrations(&db_conn).await?.is_empty() {
|
if Migrator::get_pending_migrations(&db_conn).await?.is_empty() {
|
||||||
@ -207,7 +222,7 @@ pub async fn get_migrated_db(
|
|||||||
let migration_result = Migrator::up(&db_conn, None).await;
|
let migration_result = Migrator::up(&db_conn, None).await;
|
||||||
|
|
||||||
// drop the distributed lock
|
// drop the distributed lock
|
||||||
db_conn.execute(drop_lock_statment).await?;
|
drop_migration_lock(&db_conn).await?;
|
||||||
|
|
||||||
// return if migrations erred
|
// return if migrations erred
|
||||||
migration_result?;
|
migration_result?;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
mod check_config;
|
mod check_config;
|
||||||
|
mod clear_migration_lock;
|
||||||
mod create_user;
|
mod create_user;
|
||||||
|
|
||||||
use argh::FromArgs;
|
use argh::FromArgs;
|
||||||
use web3_proxy::app::get_migrated_db;
|
use web3_proxy::app::{get_db, get_migrated_db};
|
||||||
|
|
||||||
#[derive(Debug, FromArgs)]
|
#[derive(Debug, FromArgs)]
|
||||||
/// Command line interface for admins to interact with web3_proxy
|
/// Command line interface for admins to interact with web3_proxy
|
||||||
@ -24,6 +25,7 @@ pub struct TopConfig {
|
|||||||
enum SubCommand {
|
enum SubCommand {
|
||||||
CreateUser(create_user::CreateUserSubCommand),
|
CreateUser(create_user::CreateUserSubCommand),
|
||||||
CheckConfig(check_config::CheckConfigSubCommand),
|
CheckConfig(check_config::CheckConfigSubCommand),
|
||||||
|
DropMigrationLock(clear_migration_lock::DropMigrationLockSubCommand),
|
||||||
// TODO: sub command to downgrade migrations?
|
// TODO: sub command to downgrade migrations?
|
||||||
// TODO: sub command to add new api keys to an existing user?
|
// TODO: sub command to add new api keys to an existing user?
|
||||||
}
|
}
|
||||||
@ -51,5 +53,10 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
x.main(&db_conn).await
|
x.main(&db_conn).await
|
||||||
}
|
}
|
||||||
SubCommand::CheckConfig(x) => x.main().await,
|
SubCommand::CheckConfig(x) => x.main().await,
|
||||||
|
SubCommand::DropMigrationLock(x) => {
|
||||||
|
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
|
||||||
|
|
||||||
|
x.main(&db_conn).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user