From 3cb557700e401e876914547c42ffefbe14619042 Mon Sep 17 00:00:00 2001
From: Svyatoslav Nikolsky <svyatonik@gmail.com>
Date: Wed, 7 Aug 2019 21:48:39 +0300
Subject: [PATCH] remove leaves tracking from lignt backend (#3311)

---
 substrate/core/client/db/src/light.rs | 70 ++-------------------------
 1 file changed, 4 insertions(+), 66 deletions(-)

diff --git a/substrate/core/client/db/src/light.rs b/substrate/core/client/db/src/light.rs
index 4ce0d0498c2..3e60e9e7a1c 100644
--- a/substrate/core/client/db/src/light.rs
+++ b/substrate/core/client/db/src/light.rs
@@ -26,7 +26,6 @@ use client::backend::{AuxStore, NewBlockState};
 use client::blockchain::{BlockStatus, Cache as BlockchainCache,
 	HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo};
 use client::cht;
-use client::leaves::{LeafSet, FinalizationDisplaced};
 use client::error::{Error as ClientError, Result as ClientResult};
 use client::light::blockchain::Storage as LightBlockchainStorage;
 use codec::{Decode, Encode};
@@ -54,11 +53,10 @@ const HEADER_CHT_PREFIX: u8 = 0;
 const CHANGES_TRIE_CHT_PREFIX: u8 = 1;
 
 /// Light blockchain storage. Stores most recent headers + CHTs for older headers.
-/// Locks order: meta, leaves, cache.
+/// Locks order: meta, cache.
 pub struct LightStorage<Block: BlockT> {
 	db: Arc<dyn KeyValueDB>,
 	meta: RwLock<Meta<NumberFor<Block>, Block::Hash>>,
-	leaves: RwLock<LeafSet<Block::Hash, NumberFor<Block>>>,
 	cache: Arc<DbCacheSync<Block>>,
 }
 
@@ -96,7 +94,6 @@ impl<Block> LightStorage<Block>
 
 	fn from_kvdb(db: Arc<dyn KeyValueDB>) -> ClientResult<Self> {
 		let meta = read_meta::<Block>(&*db, columns::META, columns::HEADER)?;
-		let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?;
 		let cache = DbCache::new(
 			db.clone(),
 			columns::KEY_LOOKUP,
@@ -110,7 +107,6 @@ impl<Block> LightStorage<Block>
 			db,
 			meta: RwLock::new(meta),
 			cache: Arc::new(DbCacheSync(RwLock::new(cache))),
-			leaves: RwLock::new(leaves),
 		})
 	}
 
@@ -264,7 +260,6 @@ impl<Block: BlockT> LightStorage<Block> {
 		transaction: &mut DBTransaction,
 		header: &Block::Header,
 		hash: Block::Hash,
-		displaced: &mut Option<FinalizationDisplaced<Block::Hash, NumberFor<Block>>>,
 	) -> ClientResult<()> {
 		let meta = self.meta.read();
 		if &meta.finalized_hash != header.parent_hash() {
@@ -338,12 +333,6 @@ impl<Block: BlockT> LightStorage<Block> {
 			}
 		}
 
-		let new_displaced = self.leaves.write().finalize_height(header.number().clone());
-		match displaced {
-			x @ &mut None => *x = Some(new_displaced),
-			&mut Some(ref mut displaced) => displaced.merge(new_displaced),
-		}
-
 		Ok(())
 	}
 
@@ -399,7 +388,6 @@ impl<Block> LightBlockchainStorage<Block> for LightStorage<Block>
 		leaf_state: NewBlockState,
 		aux_ops: Vec<(Vec<u8>, Option<Vec<u8>>)>,
 	) -> ClientResult<()> {
-		let mut finalization_displaced_leaves = None;
 		let mut transaction = DBTransaction::new();
 
 		let hash = header.hash();
@@ -445,14 +433,10 @@ impl<Block> LightBlockchainStorage<Block> for LightStorage<Block>
 				&mut transaction,
 				&header,
 				hash,
-				&mut finalization_displaced_leaves,
 			)?;
 		}
 
 		{
-			let mut leaves = self.leaves.write();
-			let displaced_leaf = leaves.import(hash, number, parent_hash);
-
 			let mut cache = self.cache.0.write();
 			let cache_ops = cache.transaction(&mut transaction)
 				.on_block_insert(
@@ -464,23 +448,7 @@ impl<Block> LightBlockchainStorage<Block> for LightStorage<Block>
 				.into_ops();
 
 			debug!("Light DB Commit {:?} ({})", hash, number);
-			let write_result = self.db.write(transaction).map_err(db_err);
-			if let Err(e) = write_result {
-				let mut leaves = self.leaves.write();
-				let mut undo = leaves.undo();
-
-				// revert leaves set update if there was one.
-				if let Some(displaced_leaf) = displaced_leaf {
-					undo.undo_import(displaced_leaf);
-				}
-
-				if let Some(finalization_displaced) = finalization_displaced_leaves {
-					undo.undo_finalization(finalization_displaced);
-				}
-
-				return Err(e);
-			}
-
+			self.db.write(transaction).map_err(db_err)?;
 			cache.commit(cache_ops);
 		}
 
@@ -522,11 +490,10 @@ impl<Block> LightBlockchainStorage<Block> for LightStorage<Block>
 
 	fn finalize_header(&self, id: BlockId<Block>) -> ClientResult<()> {
 		if let Some(header) = self.header(id)? {
-			let mut displaced = None;
 			let mut transaction = DBTransaction::new();
 			let hash = header.hash();
 			let number = *header.number();
-			self.note_finalized(&mut transaction, &header, hash.clone(), &mut displaced)?;
+			self.note_finalized(&mut transaction, &header, hash.clone())?;
 			{
 				let mut cache = self.cache.0.write();
 				let cache_ops = cache.transaction(&mut transaction)
@@ -536,12 +503,7 @@ impl<Block> LightBlockchainStorage<Block> for LightStorage<Block>
 					)?
 					.into_ops();
 
-				if let Err(e) = self.db.write(transaction).map_err(db_err) {
-					if let Some(displaced) = displaced {
-						self.leaves.write().undo().undo_finalization(displaced);
-					}
-					return Err(e);
-				}
+				self.db.write(transaction).map_err(db_err)?;
 				cache.commit(cache_ops);
 			}
 			self.update_meta(hash, header.number().clone(), false, true);
@@ -1066,30 +1028,6 @@ pub(crate) mod tests {
 		assert_eq!(db.get_aux(&[3]).unwrap(), Some(vec![103]));
 	}
 
-	#[test]
-	fn test_leaves_pruned_on_finality() {
-		let db = LightStorage::<Block>::new_test();
-		let block0 = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0));
-
-		let block1_a = insert_block(&db, HashMap::new(), || default_header(&block0, 1));
-		let block1_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [1; 32].into()));
-		let block1_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block0, 1, [2; 32].into()));
-
-		assert_eq!(db.leaves.read().hashes(), vec![block1_a, block1_b, block1_c]);
-
-		let block2_a = insert_block(&db, HashMap::new(), || default_header(&block1_a, 2));
-		let block2_b = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [1; 32].into()));
-		let block2_c = insert_block(&db, HashMap::new(), || header_with_extrinsics_root(&block1_b, 2, [2; 32].into()));
-
-		assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c, block1_c]);
-
-		db.finalize_header(BlockId::hash(block1_a)).unwrap();
-		db.finalize_header(BlockId::hash(block2_a)).unwrap();
-
-		// leaves at same height stay. Leaves at lower heights pruned.
-		assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]);
-	}
-
 	#[test]
 	fn cache_can_be_initialized_after_genesis_inserted() {
 		let db = LightStorage::<Block>::new_test();
-- 
GitLab