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, BlockGcStats, BlockStorage, BlockStorageConfig, MaybeExistingHandle, OpenStats,
9 PackageEntryKey, PartialBlockId, StoreBlockResult,
10};
11pub use self::block_connection::{BlockConnection, BlockConnectionStorage};
12pub use self::block_handle::{
13 BlockFlags, BlockHandle, BlockHandleStorage, BlockMeta, HandleCreationStatus,
14 KeyBlocksDirection, LoadedBlockMeta, NewBlockMeta, WeakBlockHandle,
15};
16pub use self::config::{
17 ArchivesGcConfig, BlocksCacheConfig, BlocksGcConfig, BlocksGcType, CoreStorageConfig,
18 StatesGcConfig,
19};
20pub use self::db::{CellsDb, CoreDb, CoreDbExt, CoreTables};
21pub use self::node_state::{NodeStateStorage, NodeSyncState};
22pub use self::persistent_state::{
23 BriefBocHeader, PersistentStateInfo, PersistentStateKind, PersistentStateStorage,
24 QueueDiffReader, QueueStateReader, QueueStateWriter, ShardStateReader, ShardStateWriter,
25};
26pub use self::shard_state::{
27 ShardStateStorage, ShardStateStorageError, ShardStateStorageMetrics, StoreStateHint,
28};
29
30pub mod tables;
31
32pub(crate) mod block;
33mod block_connection;
34mod block_handle;
35mod config;
36mod db;
37mod node_state;
38mod persistent_state;
39mod shard_state;
40
41mod util {
42 pub use self::slot_subscriptions::*;
43 pub use self::stored_value::*;
44
45 mod slot_subscriptions;
46 mod stored_value;
47}
48
49const CORE_DB_SUBDIR: &str = "core";
50const CELLS_DB_SUBDIR: &str = "cells";
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(CORE_DB_SUBDIR)?;
61 db.normalize_version()?;
62 db.apply_migrations().await?;
63
64 let cells_db: CellsDb = ctx.open_preconfigured(CELLS_DB_SUBDIR)?;
65 cells_db.normalize_version()?;
66 cells_db.apply_migrations().await?;
67
68 let blocks_storage_config = BlockStorageConfig {
69 blocks_cache: config.blocks_cache,
70 blobs_root: ctx.root_dir().path().join("blobs"),
71 blob_db_config: config.blob_db.clone(),
72 };
73 let block_handle_storage = Arc::new(BlockHandleStorage::new(db.clone()));
74 let block_connection_storage = Arc::new(BlockConnectionStorage::new(db.clone()));
75 let block_storage = BlockStorage::new(
76 db.clone(),
77 blocks_storage_config,
78 block_handle_storage.clone(),
79 block_connection_storage.clone(),
80 )
81 .await?;
82 let block_storage = Arc::new(block_storage);
83 let shard_state_storage = ShardStateStorage::new(
84 cells_db.clone(),
85 block_handle_storage.clone(),
86 block_storage.clone(),
87 ctx.temp_files().clone(),
88 config.cells_cache_size,
89 config.drop_interval,
90 )?;
91 let persistent_state_storage = PersistentStateStorage::new(
92 cells_db.clone(),
93 ctx.files_dir(),
94 block_handle_storage.clone(),
95 block_storage.clone(),
96 shard_state_storage.clone(),
97 )?;
98
99 persistent_state_storage.preload().await?;
100
101 let node_state_storage = NodeStateStorage::new(db.clone());
102
103 Ok(Self {
104 inner: Arc::new(Inner {
105 ctx,
106 db,
107 cells_db,
108 config,
109 block_handle_storage,
110 block_storage,
111 shard_state_storage,
112 persistent_state_storage,
113 block_connection_storage,
114 node_state_storage,
115 }),
116 })
117 }
118
119 pub fn context(&self) -> &StorageContext {
120 &self.inner.ctx
121 }
122
123 pub fn db(&self) -> &CoreDb {
124 &self.inner.db
125 }
126
127 pub fn cells_db(&self) -> &CellsDb {
128 &self.inner.cells_db
129 }
130
131 pub fn config(&self) -> &CoreStorageConfig {
132 &self.inner.config
133 }
134
135 pub fn persistent_state_storage(&self) -> &PersistentStateStorage {
136 &self.inner.persistent_state_storage
137 }
138
139 pub fn block_handle_storage(&self) -> &BlockHandleStorage {
140 &self.inner.block_handle_storage
141 }
142
143 pub fn block_storage(&self) -> &BlockStorage {
144 &self.inner.block_storage
145 }
146
147 pub fn block_connection_storage(&self) -> &BlockConnectionStorage {
148 &self.inner.block_connection_storage
149 }
150
151 pub fn shard_state_storage(&self) -> &ShardStateStorage {
152 &self.inner.shard_state_storage
153 }
154
155 pub fn node_state(&self) -> &NodeStateStorage {
156 &self.inner.node_state_storage
157 }
158
159 pub fn open_stats(&self) -> &OpenStats {
160 self.inner.block_storage.open_stats()
161 }
162}
163
164struct Inner {
165 ctx: StorageContext,
166 db: CoreDb,
167 cells_db: CellsDb,
168 config: CoreStorageConfig,
169
170 block_handle_storage: Arc<BlockHandleStorage>,
171 block_connection_storage: Arc<BlockConnectionStorage>,
172 block_storage: Arc<BlockStorage>,
173 shard_state_storage: Arc<ShardStateStorage>,
174 node_state_storage: NodeStateStorage,
175 persistent_state_storage: PersistentStateStorage,
176}