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, 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}