tycho_core/storage/
mod.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use tycho_storage::StorageContext;
5use tycho_storage::kv::ApplyMigrations;
6
7pub use self::block::{
8    ArchiveId, BlockDataEntryKey, BlockGcStats, BlockStorage, BlockStorageConfig,
9    MaybeExistingHandle, PackageEntryKey, PartialBlockId, StoreBlockResult,
10};
11pub use self::block_connection::{BlockConnection, BlockConnectionStorage};
12pub(crate) use self::block_handle::BlockDataGuard;
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::{CoreDb, CoreDbExt, CoreTables};
22pub use self::node_state::{NodeStateStorage, NodeSyncState};
23pub use self::persistent_state::{
24    BriefBocHeader, PersistentStateInfo, PersistentStateKind, PersistentStateStorage,
25    QueueDiffReader, QueueStateReader, QueueStateWriter, ShardStateReader, ShardStateWriter,
26};
27pub use self::shard_state::{
28    ShardStateStorage, ShardStateStorageError, ShardStateStorageMetrics, StoreStateHint,
29};
30
31pub mod tables;
32
33mod block;
34mod block_connection;
35mod block_handle;
36mod config;
37mod db;
38mod node_state;
39mod persistent_state;
40mod shard_state;
41
42mod util {
43    pub use self::slot_subscriptions::*;
44    pub use self::stored_value::*;
45
46    mod slot_subscriptions;
47    mod stored_value;
48}
49
50const BASE_DB_SUBDIR: &str = "base";
51
52#[derive(Clone)]
53#[repr(transparent)]
54pub struct CoreStorage {
55    inner: Arc<Inner>,
56}
57
58impl CoreStorage {
59    pub async fn open(ctx: StorageContext, config: CoreStorageConfig) -> Result<Self> {
60        let db: CoreDb = ctx.open_preconfigured(BASE_DB_SUBDIR)?;
61        db.normalize_version()?;
62        db.apply_migrations().await?;
63
64        let blocks_storage_config = BlockStorageConfig {
65            archive_chunk_size: config.archive_chunk_size,
66            blocks_cache: config.blocks_cache,
67            split_block_tasks: config.split_block_tasks,
68        };
69        let block_handle_storage = Arc::new(BlockHandleStorage::new(db.clone()));
70        let block_connection_storage = Arc::new(BlockConnectionStorage::new(db.clone()));
71        let block_storage = Arc::new(BlockStorage::new(
72            db.clone(),
73            blocks_storage_config,
74            block_handle_storage.clone(),
75            block_connection_storage.clone(),
76            config.archive_chunk_size,
77        ));
78        let shard_state_storage = ShardStateStorage::new(
79            db.clone(),
80            block_handle_storage.clone(),
81            block_storage.clone(),
82            ctx.temp_files().clone(),
83            config.cells_cache_size,
84        )?;
85        let persistent_state_storage = PersistentStateStorage::new(
86            db.clone(),
87            ctx.files_dir(),
88            block_handle_storage.clone(),
89            block_storage.clone(),
90            shard_state_storage.clone(),
91        )?;
92
93        persistent_state_storage.preload().await?;
94
95        let node_state_storage = NodeStateStorage::new(db.clone());
96
97        block_storage.finish_block_data().await?;
98        block_storage.preload_archive_ids().await?;
99
100        Ok(Self {
101            inner: Arc::new(Inner {
102                ctx,
103                db,
104                config,
105                block_handle_storage,
106                block_storage,
107                shard_state_storage,
108                persistent_state_storage,
109                block_connection_storage,
110                node_state_storage,
111            }),
112        })
113    }
114
115    pub fn context(&self) -> &StorageContext {
116        &self.inner.ctx
117    }
118
119    pub fn db(&self) -> &CoreDb {
120        &self.inner.db
121    }
122
123    pub fn config(&self) -> &CoreStorageConfig {
124        &self.inner.config
125    }
126
127    pub fn persistent_state_storage(&self) -> &PersistentStateStorage {
128        &self.inner.persistent_state_storage
129    }
130
131    pub fn block_handle_storage(&self) -> &BlockHandleStorage {
132        &self.inner.block_handle_storage
133    }
134
135    pub fn block_storage(&self) -> &BlockStorage {
136        &self.inner.block_storage
137    }
138
139    pub fn block_connection_storage(&self) -> &BlockConnectionStorage {
140        &self.inner.block_connection_storage
141    }
142
143    pub fn shard_state_storage(&self) -> &ShardStateStorage {
144        &self.inner.shard_state_storage
145    }
146
147    pub fn node_state(&self) -> &NodeStateStorage {
148        &self.inner.node_state_storage
149    }
150}
151
152struct Inner {
153    ctx: StorageContext,
154    db: CoreDb,
155    config: CoreStorageConfig,
156
157    block_handle_storage: Arc<BlockHandleStorage>,
158    block_connection_storage: Arc<BlockConnectionStorage>,
159    block_storage: Arc<BlockStorage>,
160    shard_state_storage: Arc<ShardStateStorage>,
161    node_state_storage: NodeStateStorage,
162    persistent_state_storage: PersistentStateStorage,
163}