lighthouse/beacon_node/store/src
Michael Sproul 2f456ff9eb Fix regression in DB write atomicity (#3931)
## Issue Addressed

Fix a bug introduced by #3696. The bug is not expected to occur frequently, so releasing this PR is non-urgent.

## Proposed Changes

* Add a variant to `StoreOp` that allows a raw KV operation to be passed around.
* Return to using `self.store.do_atomically` rather than `self.store.hot_db.do_atomically`. This streamlines the write back into a single call and makes our auto-revert work again.
* Prevent `import_block_update_shuffling_cache` from failing block import. This is an outstanding bug from before v3.4.0 which may have contributed to some random unexplained database corruption.

## Additional Info

In #3696 I split the database write into two calls, one to convert the `StoreOp`s to `KeyValueStoreOp`s and one to write them. This had the unfortunate side-effect of damaging our atomicity guarantees in case of a write error. If the first call failed, we would be left with the block in fork choice but not on-disk (or the snapshot cache), which would prevent us from processing any descendant blocks. On `unstable` the first call is very unlikely to fail unless the disk is full, but on `tree-states` the conversion is more involved and a user reported database corruption after it failed in a way that should have been recoverable.

Additionally, as @emhane observed, #3696 also inadvertently removed the import of the new block into the block cache. Although this seems like it could have negatively impacted performance, there are several mitigating factors:

- For regular block processing we should almost always load the parent block (and state) from the snapshot cache.
- We often load blinded blocks, which bypass the block cache anyway.
- Metrics show no noticeable increase in the block cache miss rate with v3.4.0.

However, I expect the block cache _will_ be useful again in `tree-states`, so it is restored to use by this PR.
2023-02-13 03:32:01 +00:00
..
impls Separate execution payloads in the DB (#3157) 2022-05-12 00:42:17 +00:00
chunk_writer.rs Implement checkpoint sync (#2244) 2021-09-22 00:37:28 +00:00
chunked_iter.rs Add configurable block replayer (#2863) 2021-12-21 06:30:52 +00:00
chunked_vector.rs Clippy lints for rust 1.66 (#3810) 2022-12-16 04:04:00 +00:00
config.rs Refined payload pruning (#3587) 2022-09-19 07:58:49 +00:00
errors.rs Separate execution payloads in the DB (#3157) 2022-05-12 00:42:17 +00:00
forwards_iter.rs Add configurable block replayer (#2863) 2021-12-21 06:30:52 +00:00
garbage_collection.rs Compact database on finalization (#1871) 2020-11-09 07:02:21 +00:00
hot_cold_store.rs Fix regression in DB write atomicity (#3931) 2023-02-13 03:32:01 +00:00
impls.rs Separate execution payloads in the DB (#3157) 2022-05-12 00:42:17 +00:00
iter.rs Fix lints for Rust 1.63 (#3459) 2022-08-12 00:56:39 +00:00
leveldb_store.rs Separate execution payloads in the DB (#3157) 2022-05-12 00:42:17 +00:00
lib.rs Fix regression in DB write atomicity (#3931) 2023-02-13 03:32:01 +00:00
memory_store.rs Initial Commit of Retrospective OTB Verification (#3372) 2022-07-30 00:22:38 +00:00
metadata.rs Deposit Cache Finalization & Fast WS Sync (#2915) 2022-10-30 04:04:24 +00:00
metrics.rs Implement slasher (#1567) 2020-11-23 03:43:22 +00:00
partial_beacon_state.rs Initial merge changes 2021-12-02 14:26:50 +11:00
reconstruct.rs Consensus context with proposer index caching (#3604) 2022-10-15 22:25:54 +00:00