Skip to content

Commit a41f868

Browse files
committed
No longer consider retracted txs in db
Previously, optional types are needed to handle retracted txs by distinguishing them from enacted txs. Now, it is removed.
1 parent 88acae6 commit a41f868

File tree

3 files changed

+15
-94
lines changed

3 files changed

+15
-94
lines changed

core/src/blockchain/body_db.rs

Lines changed: 15 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ pub struct BodyDB {
3636
// block cache
3737
body_cache: Mutex<LruCache<BlockHash, Bytes>>,
3838
address_by_hash_cache: RwLock<HashMap<TxHash, TransactionAddress>>,
39-
pending_addresses_by_hash: RwLock<HashMap<TxHash, Option<TransactionAddress>>>,
39+
pending_addresses_by_hash: RwLock<HashMap<TxHash, TransactionAddress>>,
4040

4141
addresses_by_tracker_cache: Mutex<HashMap<Tracker, TransactionAddresses>>,
42-
pending_addresses_by_tracker: Mutex<HashMap<Tracker, Option<TransactionAddresses>>>,
42+
pending_addresses_by_tracker: Mutex<HashMap<Tracker, TransactionAddresses>>,
4343

4444
db: Arc<dyn KeyValueDB>,
4545
}
@@ -90,13 +90,13 @@ impl BodyDB {
9090
pub fn update_best_block(&self, batch: &mut DBTransaction, best_block_changed: &BestBlockChanged) {
9191
let mut pending_addresses_by_hash = self.pending_addresses_by_hash.write();
9292
let mut pending_addresses_by_tracker = self.pending_addresses_by_tracker.lock();
93-
batch.extend_with_option_cache(
93+
batch.extend_with_cache(
9494
db::COL_EXTRA,
9595
&mut *pending_addresses_by_hash,
9696
self.new_transaction_address_entries(best_block_changed),
9797
CacheUpdatePolicy::Overwrite,
9898
);
99-
batch.extend_with_option_cache(
99+
batch.extend_with_cache(
100100
db::COL_EXTRA,
101101
&mut *pending_addresses_by_tracker,
102102
self.new_transaction_addresses_entries(best_block_changed),
@@ -113,33 +113,19 @@ impl BodyDB {
113113
let mut pending_addresses_by_tracker = self.pending_addresses_by_tracker.lock();
114114

115115
let new_txs_by_hash = mem::replace(&mut *pending_addresses_by_hash, HashMap::new());
116-
let (retracted_txs, enacted_txs) =
117-
new_txs_by_hash.into_iter().partition::<HashMap<_, _>, _>(|&(_, ref value)| value.is_none());
118116

119-
address_by_hash_cache
120-
.extend(enacted_txs.into_iter().map(|(k, v)| (k, v.expect("Transactions were partitioned; qed"))));
121-
122-
for hash in retracted_txs.keys() {
123-
address_by_hash_cache.remove(hash);
124-
}
117+
address_by_hash_cache.extend(new_txs_by_hash.into_iter());
125118

126119
let new_txs_by_tracker = mem::replace(&mut *pending_addresses_by_tracker, HashMap::new());
127-
let (removed_transactions, added_transactions) =
128-
new_txs_by_tracker.into_iter().partition::<HashMap<_, _>, _>(|&(_, ref value)| value.is_none());
129-
130-
addresses_by_tracker_cache
131-
.extend(added_transactions.into_iter().map(|(k, v)| (k, v.expect("Transactions were partitioned; qed"))));
132120

133-
for hash in removed_transactions.keys() {
134-
addresses_by_tracker_cache.remove(hash);
135-
}
121+
addresses_by_tracker_cache.extend(new_txs_by_tracker.into_iter());
136122
}
137123

138124
/// This function returns modified transaction addresses.
139125
fn new_transaction_address_entries(
140126
&self,
141127
best_block_changed: &BestBlockChanged,
142-
) -> HashMap<TxHash, Option<TransactionAddress>> {
128+
) -> HashMap<TxHash, TransactionAddress> {
143129
let block = match best_block_changed.best_block() {
144130
Some(block) => block,
145131
None => return HashMap::new(),
@@ -157,7 +143,7 @@ impl BodyDB {
157143
fn new_transaction_addresses_entries(
158144
&self,
159145
best_block_changed: &BestBlockChanged,
160-
) -> HashMap<Tracker, Option<TransactionAddresses>> {
146+
) -> HashMap<Tracker, TransactionAddresses> {
161147
let block_hash = if let Some(best_block_hash) = best_block_changed.new_best_hash() {
162148
best_block_hash
163149
} else {
@@ -168,57 +154,32 @@ impl BodyDB {
168154
None => return HashMap::new(),
169155
};
170156

171-
let (removed, added): (
172-
Box<dyn Iterator<Item = TrackerAndAddress>>,
173-
Box<dyn Iterator<Item = TrackerAndAddress>>,
174-
) = match best_block_changed {
157+
let added: Box<dyn Iterator<Item = TrackerAndAddress>> = match best_block_changed {
175158
BestBlockChanged::CanonChainAppended {
176159
..
177-
} => (
178-
Box::new(::std::iter::empty()),
179-
Box::new(tracker_and_addresses_entries(block_hash, block.transactions())),
180-
),
160+
} => Box::new(tracker_and_addresses_entries(block_hash, block.transactions())),
181161
BestBlockChanged::None => return Default::default(),
182162
};
183163

184164
let mut added_addresses: HashMap<Tracker, TransactionAddresses> = Default::default();
185-
let mut removed_addresses: HashMap<Tracker, TransactionAddresses> = Default::default();
186165
let mut trackers: HashSet<Tracker> = Default::default();
187166
for (tracker, address) in added {
188167
trackers.insert(tracker);
189168
*added_addresses.entry(tracker).or_insert_with(Default::default) += address;
190169
}
191-
for (tracker, address) in removed {
192-
trackers.insert(tracker);
193-
*removed_addresses.entry(tracker).or_insert_with(Default::default) += address;
194-
}
195170
let mut inserted_address: HashMap<Tracker, TransactionAddresses> = Default::default();
196171
for tracker in trackers.into_iter() {
197172
let address: TransactionAddresses = self.db.read(db::COL_EXTRA, &tracker).unwrap_or_default();
198173
inserted_address.insert(tracker, address);
199174
}
200175

201-
for (tracker, removed_address) in removed_addresses.into_iter() {
202-
*inserted_address
203-
.get_mut(&tracker)
204-
.expect("inserted addresses are sum of added_addresses and removed_addresses") -= removed_address;
205-
}
206176
for (tracker, added_address) in added_addresses.into_iter() {
207177
*inserted_address
208178
.get_mut(&tracker)
209179
.expect("inserted addresses are sum of added_addresses and removed_addresses") += added_address;
210180
}
211181

212182
inserted_address
213-
.into_iter()
214-
.map(|(hash, address)| {
215-
if address.is_empty() {
216-
(hash, None)
217-
} else {
218-
(hash, Some(address))
219-
}
220-
})
221-
.collect()
222183
}
223184

224185
/// Create a block body from a block.
@@ -286,15 +247,12 @@ impl BodyProvider for BodyDB {
286247
fn tx_hash_and_address_entries(
287248
block_hash: BlockHash,
288249
tx_hashes: impl IntoIterator<Item = TxHash>,
289-
) -> impl Iterator<Item = (TxHash, Option<TransactionAddress>)> {
250+
) -> impl Iterator<Item = (TxHash, TransactionAddress)> {
290251
tx_hashes.into_iter().enumerate().map(move |(index, tx_hash)| {
291-
(
292-
tx_hash,
293-
Some(TransactionAddress {
294-
block_hash,
295-
index,
296-
}),
297-
)
252+
(tx_hash, TransactionAddress {
253+
block_hash,
254+
index,
255+
})
298256
})
299257
}
300258

core/src/blockchain/extras.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,6 @@ impl TransactionAddresses {
128128
addresses: vec![address],
129129
}
130130
}
131-
132-
pub fn is_empty(&self) -> bool {
133-
self.addresses.is_empty()
134-
}
135131
}
136132

137133
impl IntoIterator for TransactionAddresses {

core/src/db.rs

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -149,39 +149,6 @@ pub trait Writable {
149149
}
150150
}
151151
}
152-
153-
/// Writes and removes the values into the database and updates the cache.
154-
fn extend_with_option_cache<K, T, R>(
155-
&mut self,
156-
col: Option<u32>,
157-
cache: &mut dyn Cache<K, Option<T>>,
158-
values: HashMap<K, Option<T>>,
159-
policy: CacheUpdatePolicy,
160-
) where
161-
K: Key<T, Target = R> + Hash + Eq,
162-
T: rlp::Encodable,
163-
R: Deref<Target = [u8]>, {
164-
match policy {
165-
CacheUpdatePolicy::Overwrite => {
166-
for (key, value) in values {
167-
match value {
168-
Some(ref v) => self.write(col, &key, v),
169-
None => self.delete(col, &key),
170-
}
171-
cache.insert(key, value);
172-
}
173-
}
174-
CacheUpdatePolicy::Remove => {
175-
for (key, value) in values {
176-
match value {
177-
Some(v) => self.write(col, &key, &v),
178-
None => self.delete(col, &key),
179-
}
180-
cache.remove(&key);
181-
}
182-
}
183-
}
184-
}
185152
}
186153

187154
/// Should be used to read values from database.

0 commit comments

Comments
 (0)