-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: abci state sync #2413
base: v1.8-dev
Are you sure you want to change the base?
feat: abci state sync #2413
Changes from 6 commits
2d60300
134855b
c00ecbd
420f84c
1512e85
94777c7
caed905
cacdc8c
c686f27
e6bb363
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,10 +1,14 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::abci::app::{ | ||||||||||||||||||||||||||||||||||||||||||||||
BlockExecutionApplication, PlatformApplication, SnapshotFetchingApplication, | ||||||||||||||||||||||||||||||||||||||||||||||
SnapshotManagerApplication, TransactionalApplication, | ||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::abci::handler; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::abci::handler::error::error_into_exception; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::error::execution::ExecutionError; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::error::Error; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::execution::types::block_execution_context::BlockExecutionContext; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::platform_types::platform::Platform; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::platform_types::snapshot::{SnapshotFetchingSession, SnapshotManager}; | ||||||||||||||||||||||||||||||||||||||||||||||
use crate::rpc::core::CoreRPCLike; | ||||||||||||||||||||||||||||||||||||||||||||||
use dpp::version::PlatformVersion; | ||||||||||||||||||||||||||||||||||||||||||||||
use drive::grovedb::Transaction; | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -23,15 +27,29 @@ pub struct FullAbciApplication<'a, C> { | |||||||||||||||||||||||||||||||||||||||||||||
pub transaction: RwLock<Option<Transaction<'a>>>, | ||||||||||||||||||||||||||||||||||||||||||||||
/// The current block execution context | ||||||||||||||||||||||||||||||||||||||||||||||
pub block_execution_context: RwLock<Option<BlockExecutionContext>>, | ||||||||||||||||||||||||||||||||||||||||||||||
/// The State sync session | ||||||||||||||||||||||||||||||||||||||||||||||
pub snapshot_fetching_session: RwLock<Option<SnapshotFetchingSession<'a>>>, | ||||||||||||||||||||||||||||||||||||||||||||||
/// The snapshot manager | ||||||||||||||||||||||||||||||||||||||||||||||
pub snapshot_manager: SnapshotManager, | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
impl<'a, C> FullAbciApplication<'a, C> { | ||||||||||||||||||||||||||||||||||||||||||||||
/// Create new ABCI app | ||||||||||||||||||||||||||||||||||||||||||||||
pub fn new(platform: &'a Platform<C>) -> Self { | ||||||||||||||||||||||||||||||||||||||||||||||
let snapshot_manager = SnapshotManager::new( | ||||||||||||||||||||||||||||||||||||||||||||||
platform | ||||||||||||||||||||||||||||||||||||||||||||||
.config | ||||||||||||||||||||||||||||||||||||||||||||||
.state_sync_config | ||||||||||||||||||||||||||||||||||||||||||||||
.checkpoints_path.clone(), | ||||||||||||||||||||||||||||||||||||||||||||||
platform.config.state_sync_config.max_num_snapshots, | ||||||||||||||||||||||||||||||||||||||||||||||
platform.config.state_sync_config.snapshots_frequency, | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
Self { | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+39
to
+46
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add path validation for checkpoints directory Consider validating that the checkpoints directory exists and is writable before initializing the let snapshot_manager = SnapshotManager::new(
- platform
- .config
- .state_sync_config
- .checkpoints_path.clone(),
+ {
+ let path = platform.config.state_sync_config.checkpoints_path.clone();
+ std::fs::create_dir_all(&path).map_err(|e| {
+ Error::InitializationError(format!(
+ "Failed to create checkpoints directory: {}",
+ e
+ ))
+ })?;
+ path
+ },
platform.config.state_sync_config.max_num_snapshots,
platform.config.state_sync_config.snapshots_frequency,
); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
platform, | ||||||||||||||||||||||||||||||||||||||||||||||
transaction: Default::default(), | ||||||||||||||||||||||||||||||||||||||||||||||
block_execution_context: Default::default(), | ||||||||||||||||||||||||||||||||||||||||||||||
snapshot_fetching_session: Default::default(), | ||||||||||||||||||||||||||||||||||||||||||||||
snapshot_manager, | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -42,6 +60,22 @@ impl<'a, C> PlatformApplication<C> for FullAbciApplication<'a, C> { | |||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
impl<'a, C> SnapshotManagerApplication for FullAbciApplication<'a, C> { | ||||||||||||||||||||||||||||||||||||||||||||||
fn snapshot_manager(&self) -> &SnapshotManager { | ||||||||||||||||||||||||||||||||||||||||||||||
&self.snapshot_manager | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
impl<'a, C> SnapshotFetchingApplication<'a, C> for FullAbciApplication<'a, C> { | ||||||||||||||||||||||||||||||||||||||||||||||
fn snapshot_fetching_session(&self) -> &RwLock<Option<SnapshotFetchingSession<'a>>> { | ||||||||||||||||||||||||||||||||||||||||||||||
&self.snapshot_fetching_session | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
fn platform(&self) -> &'a Platform<C> { | ||||||||||||||||||||||||||||||||||||||||||||||
self.platform | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
impl<'a, C> BlockExecutionApplication for FullAbciApplication<'a, C> { | ||||||||||||||||||||||||||||||||||||||||||||||
fn block_execution_context(&self) -> &RwLock<Option<BlockExecutionContext>> { | ||||||||||||||||||||||||||||||||||||||||||||||
&self.block_execution_context | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -150,4 +184,32 @@ where | |||||||||||||||||||||||||||||||||||||||||||||
) -> Result<proto::ResponseVerifyVoteExtension, proto::ResponseException> { | ||||||||||||||||||||||||||||||||||||||||||||||
handler::verify_vote_extension(self, request).map_err(error_into_exception) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
fn offer_snapshot( | ||||||||||||||||||||||||||||||||||||||||||||||
&self, | ||||||||||||||||||||||||||||||||||||||||||||||
request: proto::RequestOfferSnapshot, | ||||||||||||||||||||||||||||||||||||||||||||||
) -> Result<proto::ResponseOfferSnapshot, proto::ResponseException> { | ||||||||||||||||||||||||||||||||||||||||||||||
handler::offer_snapshot(self, request).map_err(error_into_exception) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
fn apply_snapshot_chunk( | ||||||||||||||||||||||||||||||||||||||||||||||
&self, | ||||||||||||||||||||||||||||||||||||||||||||||
request: proto::RequestApplySnapshotChunk, | ||||||||||||||||||||||||||||||||||||||||||||||
) -> Result<proto::ResponseApplySnapshotChunk, proto::ResponseException> { | ||||||||||||||||||||||||||||||||||||||||||||||
handler::apply_snapshot_chunk(self, request).map_err(error_into_exception) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
fn list_snapshots( | ||||||||||||||||||||||||||||||||||||||||||||||
&self, | ||||||||||||||||||||||||||||||||||||||||||||||
request: proto::RequestListSnapshots, | ||||||||||||||||||||||||||||||||||||||||||||||
) -> Result<proto::ResponseListSnapshots, proto::ResponseException> { | ||||||||||||||||||||||||||||||||||||||||||||||
handler::list_snapshots(self, request).map_err(error_into_exception) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
fn load_snapshot_chunk( | ||||||||||||||||||||||||||||||||||||||||||||||
&self, | ||||||||||||||||||||||||||||||||||||||||||||||
request: proto::RequestLoadSnapshotChunk, | ||||||||||||||||||||||||||||||||||||||||||||||
) -> Result<proto::ResponseLoadSnapshotChunk, proto::ResponseException> { | ||||||||||||||||||||||||||||||||||||||||||||||
handler::load_snapshot_chunk(self, request).map_err(error_into_exception) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
The codebase has a proper default production path (
/var/lib/dash-platform/data
), but it's being overridden by environment files to use temporary storage:.env.mainnet
:DB_PATH=/tmp/db
.env.testnet
:DB_PATH=/tmp/db
This configuration will lead to data loss on system reboot. Update the environment files to use persistent storage paths instead of
/tmp/db
.🔗 Analysis chain
Verify database paths for production environments.
Both
CHECKPOINTS_PATH
andGROVEDB_LATEST_FILE
inherit fromDB_PATH
which is set to/tmp/db
. While this is fine for local development, using/tmp
in production could lead to data loss as it's typically cleared on system reboot.Run this script to check if there are any production environment files with similar configuration:
Also applies to: 19-19
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 702
Script:
Length of output: 2638