tycho_core/storage/
mod.rs1use 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}