Skip to content

feat(statedb): add active-state rebase pipeline#3971

Merged
jolestar merged 4 commits intomainfrom
feat/statedb-rebase-pr
Mar 17, 2026
Merged

feat(statedb): add active-state rebase pipeline#3971
jolestar merged 4 commits intomainfrom
feat/statedb-rebase-pr

Conversation

@jolestar
Copy link
Contributor

Summary

  • add statedb rebase-export and statedb rebase-build commands for active-state rebase
  • rebuild slim databases from canonical chain state after on-chain reset hooks are executed
  • preserve reset empty-shell objects instead of dropping them during export
  • include the rollout document for the Phase 1 reset + rebase sequence

Testing

  • cargo test -p rooch test_rebase_export_and_build_roundtrip -- --nocapture
  • local end-to-end validation on the integration branch: reset 3 stores -> rebase-export -> rebase-build -> start rebuilt node -> execute a normal Rooch write transaction successfully

@jolestar jolestar requested a review from Mine77 as a code owner March 17, 2026 08:13
Copilot AI review requested due to automatic review settings March 17, 2026 08:13
@vercel
Copy link

vercel bot commented Mar 17, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
rooch-portal-v2.1 Ready Ready Preview, Comment Mar 17, 2026 9:41am
test-portal Ready Ready Preview, Comment Mar 17, 2026 9:41am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
rooch Ignored Ignored Preview Mar 17, 2026 9:41am

Request Review

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces an “active-state rebase” pipeline for Rooch statedb operations, adding operator-facing CLI commands to export a recursive logical object tree and rebuild a slimmed database, along with several mainnet ops/design rollout documents to guide the reset + rebase sequence.

Changes:

  • Added statedb rebase-export and statedb rebase-build commands (with a roundtrip unit test) to export recursive object records and rebuild state + indexer.
  • Added a consolidated set of dev-guide documents covering snapshot limitations, state slimming scope, rebase redesign, and GCP cost reduction.
  • Wired the new rebase commands into the statedb command module.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
docs/dev-guide/mainnet_state_slimming_master_plan_20260316.md Consolidated execution plan tying together snapshot, slimming, rebase, and cost goals.
docs/dev-guide/mainnet_snapshot_resume_plan.md Snapshot resume runbook (draft) for operational continuity.
docs/dev-guide/mainnet_snapshot_refactor_handoff_20260312.md Handoff note describing snapshot bottlenecks and refactor starting points.
docs/dev-guide/mainnet_snapshot_ops_log_20260227.md Ops log documenting the snapshot migration steps and disk decommission.
docs/dev-guide/mainnet_header_only_state_slimming_plan_20260312.md Defines the header-only “slim node” scope and what state domains can be dropped.
docs/dev-guide/mainnet_active_state_rebase_redesign_20260313.md Redesign notes on why export/import must be recursive + metadata/boot constraints.
docs/dev-guide/mainnet_active_state_rebase_plan_20260313.md Original rebase plan describing the high-level approach and tradeoffs.
docs/dev-guide/gcp_cost_reduction_plan_20260316.md Cost analysis and execution plan targeting major storage-driven reductions.
crates/rooch/src/commands/statedb/mod.rs Registers new RebaseExport/RebaseBuild subcommands for the CLI.
crates/rooch/src/commands/statedb/commands/rebase.rs Implements recursive export, rebuild flow, checkpointing, and indexer rebuild + test.
crates/rooch/src/commands/statedb/commands/mod.rs Exposes the new rebase command module.

You can also share your feedback on Copilot code review. Take the survey.

let end = H256::from_slice(&[0xFFu8; 32]);

node_store.delete_range_nodes(start, end, true)?;
node_store.delete_nodes_with_flush(vec![end], true)?;
Comment on lines +335 to +341
let rebuilt_indexer_tx_order = std::cmp::max(1, manifest.cutover_tx_order);
let rebuilt_indexer_objects = rebuild_indexer_from_state(
&rooch_db.moveos_store,
&rooch_db.indexer_store,
ObjectMeta::root_metadata(rebuilt_root, rebuilt_global_size),
rebuilt_indexer_tx_order,
self.indexer_batch_size,
Comment on lines +441 to +491
let object_id = object_state.metadata.id.clone();
let mut cursor = None;
let mut fields = Vec::new();

loop {
let page = resolver.list_fields(&object_id, cursor, page_size)?;
if page.is_empty() {
break;
}

for (field_key, mut child_state) in page.iter().cloned() {
if child_state.metadata.has_fields() {
let child_has_fields = export_object_record_recursive(
resolver,
&child_state,
page_size,
writer,
stats,
)?;
if !child_has_fields {
child_state.metadata.size = 0;
child_state.metadata.state_root = None;
}
}

fields.push(RebaseFieldRecord {
field_key: field_key.to_string(),
object_state: child_state.to_string(),
});
}

cursor = page.last().map(|(field_key, _)| *field_key);
if page.len() < page_size {
break;
}
}

if fields.is_empty() {
return Ok(false);
}

let record = RebaseObjectRecord {
object_id: object_id.to_string(),
fields,
};
serde_json::to_writer(&mut *writer, &record)?;
writer.write_all(b"\n")?;

stats.object_records += 1;
stats.field_entries += record.fields.len() as u64;
Ok(true)
Comment on lines +364 to +369
(Some(store_dir), None, chain_id) => {
let (root, moveos_store, rooch_store) =
open_stores_from_store_dir(&store_dir, readonly)?;
let chain_id = chain_id.unwrap_or_else(|| BuiltinChainID::Local.into());
Ok((root, moveos_store, rooch_store, chain_id))
}
Comment on lines +232 to +241
let manifest: RebaseManifest = serde_json::from_reader(File::open(&manifest_path)?)?;
ensure!(
manifest.artifact_version == REBASE_ARTIFACT_VERSION,
"unsupported artifact version: {}",
manifest.artifact_version
);

let (output_store_dir, output_indexer_dir) =
derive_output_paths(&self.output_data_dir, &self.chain_id);
ensure!(
Comment on lines +301 to +302
4. boot slim read node
5. validate account / asset / module / object reads
@jolestar jolestar merged commit 9bd3345 into main Mar 17, 2026
19 of 28 checks passed
@jolestar jolestar deleted the feat/statedb-rebase-pr branch March 17, 2026 11:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants