tycho_core/storage/
mod.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use tycho_block_util::block::BlockStuff;
5use tycho_storage::StorageContext;
6use tycho_storage::kv::ApplyMigrations;
7
8pub use self::block::{
9    ArchiveId, BlockGcStats, BlockStorage, BlockStorageConfig, MaybeExistingHandle, OpenStats,
10    PackageEntryKey, PartialBlockId, StoreBlockResult,
11};
12pub use self::block_connection::{BlockConnection, BlockConnectionStorage};
13pub use self::block_handle::{
14    BlockFlags, BlockHandle, BlockHandleStorage, BlockMeta, HandleCreationStatus,
15    KeyBlocksDirection, LoadedBlockMeta, NewBlockMeta, WeakBlockHandle,
16};
17pub use self::config::{
18    ArchivesGcConfig, BlocksCacheConfig, BlocksGcConfig, BlocksGcType, CoreStorageConfig,
19    StatesGcConfig,
20};
21pub use self::db::{CellsDb, CoreDb, CoreDbExt, CoreTables};
22use self::gc::CoreStorageGc;
23pub use self::gc::ManualGcTrigger;
24pub use self::node_state::{NodeStateStorage, NodeSyncState};
25pub use self::persistent_state::{
26    BriefBocHeader, PersistentState, PersistentStateInfo, PersistentStateKind,
27    PersistentStateStorage, QueueDiffReader, QueueStateReader, QueueStateWriter, ShardStateReader,
28    ShardStateWriter,
29};
30pub use self::shard_state::{
31    ShardStateStorage, ShardStateStorageError, ShardStateStorageMetrics, StoreStateHint,
32    split_shard_accounts,
33};
34
35pub mod tables;
36
37pub(crate) mod block;
38mod block_connection;
39mod block_handle;
40mod config;
41mod db;
42mod gc;
43mod node_state;
44mod persistent_state;
45mod shard_state;
46mod util;
47
48pub const CORE_DB_SUBDIR: &str = "core";
49pub const CELLS_DB_SUBDIR: &str = "cells";
50
51#[derive(Clone)]
52#[repr(transparent)]
53pub struct CoreStorage {
54    inner: Arc<Inner>,
55}
56
57impl CoreStorage {
58    pub async fn open(ctx: StorageContext, config: CoreStorageConfig) -> Result<Self> {
59        let db: CoreDb = ctx.open_preconfigured(CORE_DB_SUBDIR)?;
60        db.normalize_version()?;
61        db.apply_migrations().await?;
62
63        let cells_db: CellsDb = ctx.open_preconfigured(CELLS_DB_SUBDIR)?;
64        cells_db.normalize_version()?;
65        cells_db.apply_migrations().await?;
66
67        let blocks_storage_config = BlockStorageConfig {
68            blocks_cache: config.blocks_cache,
69            blobs_root: ctx.root_dir().path().join("blobs"),
70            blob_db_config: config.blob_db.clone(),
71        };
72        let block_handle_storage = Arc::new(BlockHandleStorage::new(db.clone()));
73        let block_connection_storage = Arc::new(BlockConnectionStorage::new(db.clone()));
74        let block_storage = BlockStorage::new(
75            db.clone(),
76            blocks_storage_config,
77            block_handle_storage.clone(),
78            block_connection_storage.clone(),
79        )
80        .await?;
81        let block_storage = Arc::new(block_storage);
82        let shard_state_storage = ShardStateStorage::new(
83            cells_db.clone(),
84            block_handle_storage.clone(),
85            block_storage.clone(),
86            ctx.temp_files().clone(),
87            config.cells_cache_size,
88            config.drop_interval,
89        )?;
90        let persistent_state_storage = PersistentStateStorage::new(
91            cells_db.clone(),
92            ctx.files_dir(),
93            block_handle_storage.clone(),
94            block_storage.clone(),
95            shard_state_storage.clone(),
96        )?;
97
98        persistent_state_storage.preload().await?;
99
100        let node_state_storage = NodeStateStorage::new(db.clone());
101
102        let gc = CoreStorageGc::new(
103            &node_state_storage,
104            block_handle_storage.clone(),
105            block_storage.clone(),
106            shard_state_storage.clone(),
107            persistent_state_storage.clone(),
108            &config,
109        );
110
111        Ok(Self {
112            inner: Arc::new(Inner {
113                ctx,
114                db,
115                config,
116                gc,
117                block_handle_storage,
118                block_storage,
119                shard_state_storage,
120                persistent_state_storage,
121                block_connection_storage,
122                node_state_storage,
123            }),
124        })
125    }
126
127    pub fn context(&self) -> &StorageContext {
128        &self.inner.ctx
129    }
130
131    pub fn db(&self) -> &CoreDb {
132        &self.inner.db
133    }
134
135    pub fn config(&self) -> &CoreStorageConfig {
136        &self.inner.config
137    }
138
139    pub fn persistent_state_storage(&self) -> &PersistentStateStorage {
140        &self.inner.persistent_state_storage
141    }
142
143    pub fn block_handle_storage(&self) -> &BlockHandleStorage {
144        &self.inner.block_handle_storage
145    }
146
147    pub fn block_storage(&self) -> &BlockStorage {
148        &self.inner.block_storage
149    }
150
151    pub fn block_connection_storage(&self) -> &BlockConnectionStorage {
152        &self.inner.block_connection_storage
153    }
154
155    pub fn shard_state_storage(&self) -> &ShardStateStorage {
156        &self.inner.shard_state_storage
157    }
158
159    pub fn node_state(&self) -> &NodeStateStorage {
160        &self.inner.node_state_storage
161    }
162
163    pub fn open_stats(&self) -> &OpenStats {
164        self.inner.block_storage.open_stats()
165    }
166
167    pub fn trigger_archives_gc(&self, trigger: ManualGcTrigger) {
168        self.inner.gc.trigger_archives_gc(trigger);
169    }
170
171    pub fn trigger_blocks_gc(&self, trigger: ManualGcTrigger) {
172        self.inner.gc.trigger_blocks_gc(trigger);
173    }
174
175    pub fn trigger_states_gc(&self, trigger: ManualGcTrigger) {
176        self.inner.gc.trigger_states_gc(trigger);
177    }
178
179    pub(crate) fn update_gc_state(&self, is_key_block: bool, block: &BlockStuff) {
180        self.inner.gc.handle_block(is_key_block, block);
181    }
182}
183
184struct Inner {
185    ctx: StorageContext,
186    db: CoreDb,
187    config: CoreStorageConfig,
188    gc: CoreStorageGc,
189
190    block_handle_storage: Arc<BlockHandleStorage>,
191    block_connection_storage: Arc<BlockConnectionStorage>,
192    block_storage: Arc<BlockStorage>,
193    shard_state_storage: Arc<ShardStateStorage>,
194    node_state_storage: NodeStateStorage,
195    persistent_state_storage: PersistentStateStorage,
196}