Skip to content

Commit

Permalink
fix revert_block (paritytech#3)
Browse files Browse the repository at this point in the history
* use sub_command to get <num>
* remove best in revert
  • Loading branch information
Aton authored Dec 29, 2018
1 parent 2c8c967 commit c9f509f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
2 changes: 1 addition & 1 deletion core/cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ where
} else if let Some(sub_matches) = matches.subcommand_matches("revert") {
revert_chain::<F>(
get_db_path_for_subcommand(matches, sub_matches)?,
matches,
sub_matches,
spec
)?;
return Ok(Action::ExecutedInternally);
Expand Down
36 changes: 27 additions & 9 deletions core/client/db/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,9 @@ impl<Block> client::backend::Backend<Block, Blake2Hasher> for Backend<Block> whe
fn revert(&self, n: NumberFor<Block>) -> Result<NumberFor<Block>, client::error::Error> {
use client::blockchain::HeaderBackend;
let mut best = self.blockchain.info()?.best_number;
// if the best is lower to n(less then 256), just use best number in case overflow
let n = if best < n { best } else { n };

for c in 0 .. n.as_() {
if best == As::sa(0) {
return Ok(As::sa(c))
Expand All @@ -862,18 +865,33 @@ impl<Block> client::backend::Backend<Block, Blake2Hasher> for Backend<Block> whe
match self.storage.state_db.revert_one() {
Some(commit) => {
apply_state_commit(&mut transaction, commit);
let _removed = best.clone();
best -= As::sa(1);
let header = self.blockchain.header(BlockId::Number(best))?.ok_or_else(

let removed = self.blockchain.header(BlockId::Number(best))?.ok_or_else(
|| client::error::ErrorKind::UnknownBlock(
format!("Error reverting to {}. Block header not found.", best)))?;
format!("Error reverting to {}. Block hash not found.", best)))?;

let lookup_key = ::utils::number_and_hash_to_lookup_key(header.number().clone(), header.hash().clone());
transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key);
transaction.delete(columns::KEY_LOOKUP, header.hash().as_ref());
best -= As::sa(1); // prev block
let hash = self.blockchain.hash(best)?.ok_or_else(
|| client::error::ErrorKind::UnknownBlock(
format!("Error reverting to {}. Block hash not found.", best)))?;
let key = ::utils::number_and_hash_to_lookup_key(best.clone(), hash.clone());
transaction.put(columns::META, meta_keys::BEST_BLOCK, &key);
transaction.delete(columns::KEY_LOOKUP, removed.hash().as_ref());
self.storage.db.write(transaction).map_err(db_err)?;
self.blockchain.update_meta(header.hash().clone(), best.clone(), true, false);
self.blockchain.leaves.write().revert(header.hash().clone(), header.number().clone(), header.parent_hash().clone());
self.blockchain.update_meta(hash, best, true, false);
self.blockchain.leaves.write().revert(removed.hash().clone(), removed.number().clone(), removed.parent_hash().clone());
// let _removed = best.clone();
// best -= As::sa(1);
// let header = self.blockchain.header(BlockId::Number(best))?.ok_or_else(
// || client::error::ErrorKind::UnknownBlock(
// format!("Error reverting to {}. Block header not found.", best)))?;
//
// let lookup_key = ::utils::number_and_hash_to_lookup_key(header.number().clone(), header.hash().clone());
// transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key);
// transaction.delete(columns::KEY_LOOKUP, header.hash().as_ref());
// self.storage.db.write(transaction).map_err(db_err)?;
// self.blockchain.update_meta(header.hash().clone(), best.clone(), true, false);
// self.blockchain.leaves.write().revert(header.hash().clone(), header.number().clone(), header.parent_hash().clone());
}
None => return Ok(As::sa(c))
}
Expand Down

0 comments on commit c9f509f

Please sign in to comment.