check if the slashing protection database is locked before creating keys (#1949)
## Issue Addressed Closes #1790 ## Proposed Changes Make a new method that creates an empty transaction with `TransactionBehavior::Exclusive` to check whether the slashing protection is locked. Call this method before attempting to create or import new validator keystores. ## Additional Info N/A Co-authored-by: realbigsean <seananderson33@gmail.com>
This commit is contained in:
parent
6f890c398e
commit
a171fb8843
@ -192,6 +192,14 @@ pub fn cli_run<T: EthSpec>(
|
|||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
// Create an empty transaction and drops it. Used to test if the database is locked.
|
||||||
|
slashing_protection.test_transaction().map_err(|e| {
|
||||||
|
format!(
|
||||||
|
"Cannot create keys while the validator client is running: {:?}",
|
||||||
|
e
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
for i in 0..n {
|
for i in 0..n {
|
||||||
let voting_password = random_password();
|
let voting_password = random_password();
|
||||||
let withdrawal_password = random_password();
|
let withdrawal_password = random_password();
|
||||||
|
@ -86,6 +86,14 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
|
|||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
// Create an empty transaction and drop it. Used to test if the database is locked.
|
||||||
|
slashing_protection.test_transaction().map_err(|e| {
|
||||||
|
format!(
|
||||||
|
"Cannot import keys while the validator client is running: {:?}",
|
||||||
|
e
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
eprintln!("validator-dir path: {:?}", validator_dir);
|
eprintln!("validator-dir path: {:?}", validator_dir);
|
||||||
// Collect the paths for the keystores that should be imported.
|
// Collect the paths for the keystores that should be imported.
|
||||||
let keystore_paths = match (keystore, keystores_dir) {
|
let keystore_paths = match (keystore, keystores_dir) {
|
||||||
|
@ -136,6 +136,13 @@ impl SlashingDatabase {
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
fn set_db_file_permissions(file: &File) -> Result<(), NotSafe> {}
|
fn set_db_file_permissions(file: &File) -> Result<(), NotSafe> {}
|
||||||
|
|
||||||
|
/// Creates an empty transaction and drops it. Used to test whether the database is locked.
|
||||||
|
pub fn test_transaction(&self) -> Result<(), NotSafe> {
|
||||||
|
let mut conn = self.conn_pool.get()?;
|
||||||
|
Transaction::new(&mut conn, TransactionBehavior::Exclusive)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Register a validator with the slashing protection database.
|
/// Register a validator with the slashing protection database.
|
||||||
///
|
///
|
||||||
/// This allows the validator to record their signatures in the database, and check
|
/// This allows the validator to record their signatures in the database, and check
|
||||||
@ -803,4 +810,14 @@ mod tests {
|
|||||||
let db2 = SlashingDatabase::open(&file).unwrap();
|
let db2 = SlashingDatabase::open(&file).unwrap();
|
||||||
check(&db2);
|
check(&db2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_transaction_failure() {
|
||||||
|
let dir = tempdir().unwrap();
|
||||||
|
let file = dir.path().join("db.sqlite");
|
||||||
|
let _db1 = SlashingDatabase::create(&file).unwrap();
|
||||||
|
|
||||||
|
let db2 = SlashingDatabase::open(&file).unwrap();
|
||||||
|
db2.test_transaction().unwrap_err();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user