From 61b3f2be3687cdd43b74be5be76be0aeaaccbbd3 Mon Sep 17 00:00:00 2001 From: Simon Paitrault Date: Tue, 24 Oct 2023 15:24:51 +0200 Subject: [PATCH] chore: improve doc for topos-tce-storage Signed-off-by: Simon Paitrault --- crates/topos-tce-storage/README.md | 67 +++++++++++++++++ .../topos-tce-storage/assets/store-dark.png | Bin 0 -> 57252 bytes .../topos-tce-storage/assets/store-light.png | Bin 0 -> 49352 bytes crates/topos-tce-storage/src/lib.rs | 71 ++++++++++++++++++ crates/topos/tests/config.rs | 6 ++ scripts/check_readme.sh | 1 + 6 files changed, 145 insertions(+) create mode 100644 crates/topos-tce-storage/README.md create mode 100644 crates/topos-tce-storage/assets/store-dark.png create mode 100644 crates/topos-tce-storage/assets/store-light.png diff --git a/crates/topos-tce-storage/README.md b/crates/topos-tce-storage/README.md new file mode 100644 index 000000000..77bc827a1 --- /dev/null +++ b/crates/topos-tce-storage/README.md @@ -0,0 +1,67 @@ +# topos-tce-storage + +The library provides the storage layer for the Topos TCE. +It is responsible for storing and retrieving the certificates, managing the +pending certificates pool and the certificate status, storing the different +metadata related to the protocol and the internal state of the TCE. + +The storage layer is implemented using RocksDB. +The library is exposing multiple store that are used by the TCE. + + +### Architecture + +The storage layer is composed of multiple stores that are used by the TCE. +Each store is describe in detail in its own module. + +As an overview, the storage layer is composed of the following stores: + + + + Text changing depending on mode. Light: 'So light!' Dark: 'So dark!' + + +### Usage + +Each store represents a different kind of capabilities, but they all act and need the same kind +of configuration in order to work. + +For instance, the [`EpochValidatorsStore`](struct@epoch::EpochValidatorsStore) only needs a [`PathBuf`](struct@std::path::PathBuf) +argument to be instantiated where [`FullNodeStore`](struct@fullnode::FullNodeStore) needs a little bit more arguments. + +The underlying mechanisms of how data is stored is fairly simple, it relies a lot on [`rocksdb`] and will +be describe below. + +As an example, in order to create a new [`EpochValidatorsStore`](struct@epoch::EpochValidatorsStore) you need to provide a +path where the [`rocksdb`] database will be placed: + +```rust +use epoch::EpochValidatorsStore; +path.push("epoch"); +let store: Arc = EpochValidatorsStore::new(path).unwrap(); +``` + +### Special Considerations + +When using the storage layer, you need to be aware of the following: +- The storage layer is using [`rocksdb`] as a backend, which means that the data is stored on disk. +- The storage layer is using [`Arc`](struct@std::sync::Arc) to share the stores between threads. +- The storage layer is using [`async_trait`](https://docs.rs/async-trait/0.1.51/async_trait/) to expose methods that need to manage locks. (see [`WriteStore`](trait@store::WriteStore)) +- Some functions are using [`DBBatch`](struct@rocks::db_column::DBBatch) to batch multiple writes in one transaction. But not all functions are using it. + +### Design Philosophy + +The choice of using [`rocksdb`] as a backend was made because it is a well known and battle tested database. +It is also very fast and efficient when it comes to write and read data. However, it is not the best when it comes +to compose or filter data. This is why we have multiple store that are used for different purposes. + +For complex queries, another database like [`PostgreSQL`](https://www.postgresql.org/) or [`CockroachDB`](https://www.cockroachlabs.com/) could be used as a Storage for projections. +The source of truth would still be [`rocksdb`] but the projections would be stored in a relational database. Allowing for more complex queries. + +As mention above, the different stores are using [`Arc`](struct@std::sync::Arc), allowing a single store to be instantiated once +and then shared between threads. This is very useful when it comes to the [`FullNodeStore`](struct@fullnode::FullNodeStore) as it is used in various places. + +It also means that the store is immutable, which is a good thing when it comes to concurrency. +The burden of managing the locks is handled by the [`async_trait`](https://docs.rs/async-trait/0.1.51/async_trait/) crate when using the [`WriteStore`](trait@store::WriteStore). +The rest of the mutation on the data are handled by [`rocksdb`] itself. + diff --git a/crates/topos-tce-storage/assets/store-dark.png b/crates/topos-tce-storage/assets/store-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c95fd52e163e0d6d50d4ab65c0ad60f46b154993 GIT binary patch literal 57252 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 Mn_8K?HM$f1AC253K>z>% literal 0 HcmV?d00001 diff --git a/crates/topos-tce-storage/assets/store-light.png b/crates/topos-tce-storage/assets/store-light.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0ab5f6f8c94e92c8e646030b58d70f68f27971 GIT binary patch literal 49352 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 literal 0 HcmV?d00001 diff --git a/crates/topos-tce-storage/src/lib.rs b/crates/topos-tce-storage/src/lib.rs index 6d17603a7..5facc3625 100644 --- a/crates/topos-tce-storage/src/lib.rs +++ b/crates/topos-tce-storage/src/lib.rs @@ -1,3 +1,74 @@ +//! The library provides the storage layer for the Topos TCE. +//! It is responsible for storing and retrieving the certificates, managing the +//! pending certificates pool and the certificate status, storing the different +//! metadata related to the protocol and the internal state of the TCE. +//! +//! The storage layer is implemented using RocksDB. +//! The library is exposing multiple store that are used by the TCE. +//! +//! +//! ## Architecture +//! +//! The storage layer is composed of multiple stores that are used by the TCE. +//! Each store is describe in detail in its own module. +//! +//! As an overview, the storage layer is composed of the following stores: +//! +//! +//! +//! Text changing depending on mode. Light: 'So light!' Dark: 'So dark!' +//! +//! +//! ## Usage +//! +//! Each store represents a different kind of capabilities, but they all act and need the same kind +//! of configuration in order to work. +//! +//! For instance, the [`EpochValidatorsStore`](struct@epoch::EpochValidatorsStore) only needs a [`PathBuf`](struct@std::path::PathBuf) +//! argument to be instantiated where [`FullNodeStore`](struct@fullnode::FullNodeStore) needs a little bit more arguments. +//! +//! The underlying mechanisms of how data is stored is fairly simple, it relies a lot on [`rocksdb`] and will +//! be describe below. +//! +//! As an example, in order to create a new [`EpochValidatorsStore`](struct@epoch::EpochValidatorsStore) you need to provide a +//! path where the [`rocksdb`] database will be placed: +//! +//! ``` +//! # use topos_tce_storage::epoch; +//! use epoch::EpochValidatorsStore; +//! # use std::str::FromStr; +//! # use std::path::PathBuf; +//! # use std::sync::Arc; +//! # let mut path = PathBuf::from_str(env!("CARGO_MANIFEST_DIR")).unwrap(); +//! # path.push("./../../target/tmp/"); +//! path.push("epoch"); +//! let store: Arc = EpochValidatorsStore::new(path).unwrap(); +//! ``` +//! +//! ## Special Considerations +//! +//! When using the storage layer, you need to be aware of the following: +//! - The storage layer is using [`rocksdb`] as a backend, which means that the data is stored on disk. +//! - The storage layer is using [`Arc`](struct@std::sync::Arc) to share the stores between threads. +//! - The storage layer is using [`async_trait`](https://docs.rs/async-trait/0.1.51/async_trait/) to expose methods that need to manage locks. (see [`WriteStore`](trait@store::WriteStore)) +//! - Some functions are using [`DBBatch`](struct@rocks::db_column::DBBatch) to batch multiple writes in one transaction. But not all functions are using it. +//! +//! ## Design Philosophy +//! +//! The choice of using [`rocksdb`] as a backend was made because it is a well known and battle tested database. +//! It is also very fast and efficient when it comes to write and read data. However, it is not the best when it comes +//! to compose or filter data. This is why we have multiple store that are used for different purposes. +//! +//! For complex queries, another database like [`PostgreSQL`](https://www.postgresql.org/) or [`CockroachDB`](https://www.cockroachlabs.com/) could be used as a Storage for projections. +//! The source of truth would still be [`rocksdb`] but the projections would be stored in a relational database. Allowing for more complex queries. +//! +//! As mention above, the different stores are using [`Arc`](struct@std::sync::Arc), allowing a single store to be instantiated once +//! and then shared between threads. This is very useful when it comes to the [`FullNodeStore`](struct@fullnode::FullNodeStore) as it is used in various places. +//! +//! It also means that the store is immutable, which is a good thing when it comes to concurrency. +//! The burden of managing the locks is handled by the [`async_trait`](https://docs.rs/async-trait/0.1.51/async_trait/) crate when using the [`WriteStore`](trait@store::WriteStore). +//! The rest of the mutation on the data are handled by [`rocksdb`] itself. +//! use errors::InternalStorageError; use rocks::iterator::ColumnIterator; use serde::{Deserialize, Serialize}; diff --git a/crates/topos/tests/config.rs b/crates/topos/tests/config.rs index e0dd1acaa..744cfa98f 100644 --- a/crates/topos/tests/config.rs +++ b/crates/topos/tests/config.rs @@ -1,6 +1,8 @@ use assert_cmd::prelude::*; +use rstest::rstest; use std::path::PathBuf; use std::process::Command; +use std::time::Duration; use topos::install_polygon_edge; async fn polygon_edge_path(path: &str) -> String { @@ -23,7 +25,9 @@ async fn polygon_edge_path(path: &str) -> String { installation_path.to_str().unwrap().to_string() } +#[rstest] #[tokio::test] +#[timeout(Duration::from_secs(5))] async fn test_handle_command_init() -> Result<(), Box> { let temporary_test_folder = "/tmp/topos/handle_command_init"; let path = polygon_edge_path(temporary_test_folder).await; @@ -86,7 +90,9 @@ fn test_nothing_written_if_failure() -> Result<(), Box> { Ok(()) } +#[rstest] #[tokio::test] +#[timeout(Duration::from_secs(5))] async fn test_handle_command_init_with_custom_name() -> Result<(), Box> { let temporary_test_folder = "/tmp/topos/test_handle_command_init_with_custom_name"; let node_name = "TEST_NODE"; diff --git a/scripts/check_readme.sh b/scripts/check_readme.sh index 9ab3ff37a..6d7e76463 100755 --- a/scripts/check_readme.sh +++ b/scripts/check_readme.sh @@ -13,3 +13,4 @@ function check { } check crates/topos-tce-broadcast +check crates/topos-tce-storage