Skip to content
This repository was archived by the owner on Sep 21, 2024. It is now read-only.

Commit a6f07cd

Browse files
committed
feat: Introduce EphemeralStorage, allowing storages to create temporary
Stores.
1 parent e41696d commit a6f07cd

File tree

34 files changed

+1241
-121
lines changed

34 files changed

+1241
-121
lines changed

.github/workflows/run_test_suite.yaml

+17-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
export MallocScribble=1
3737
swift build --sanitize=address
3838
swift test --sanitize=address
39-
39+
4040
run-linting-linux:
4141
runs-on: ubuntu-latest
4242
strategy:
@@ -88,9 +88,9 @@ jobs:
8888
rustup toolchain install ${{matrix.toolchain}}
8989
- name: 'Install environment packages (Windows)'
9090
if: ${{ matrix.platform == 'windows-latest' }}
91+
shell: sh
9192
run: |
9293
choco install -y cmake protoc openssl
93-
shell: sh
9494
- name: 'Install environment packages (Linux)'
9595
if: ${{ matrix.platform == 'ubuntu-latest' }}
9696
run: |
@@ -121,6 +121,21 @@ jobs:
121121
FEATURES="--features ${{matrix.features}}"
122122
fi
123123
124+
# Increase stack size on Windows tests; (non-main) threads are spawned with 2MB
125+
# default stack size, which `orb_can_render_peers_in_the_sphere_address_book`
126+
# uses (at time of writing) slightly more than 2MB. While we could set the thread
127+
# stack size at runtime (via tokio's `thread_stack_size`), it appears to not solve the
128+
# problem, possibly due to the harness thread overflowing (e.g. a non-main thread that
129+
# we can't configure within the test). In lieu of that, set RUST_MIN_STACK to increase
130+
# the stack sizes of threads created by tokio within tests, as well as the test harness
131+
# threads themselves.
132+
#
133+
# While our main thread isn't under fire here, notating this for future use:
134+
# https://users.rust-lang.org/t/stack-overflow-when-compiling-on-windows-10/50818/8
135+
if [ "${{matrix.platform}}" = "windows-latest" ]; then
136+
export RUST_MIN_STACK=4000000
137+
fi
138+
124139
cargo +${{ matrix.toolchain }} nextest run $FEATURES --retries 5 --color always 2>&1 | tee test-results/log
125140
env:
126141
NOOSPHERE_LOG: academic

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/noosphere-common/src/task.rs

+14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use futures::future::join_all;
1313
#[cfg(not(target_arch = "wasm32"))]
1414
use tokio::task::JoinSet;
1515

16+
use crate::ConditionalSend;
17+
1618
#[cfg(target_arch = "wasm32")]
1719
/// Spawn a future by scheduling it with the local executor. The returned
1820
/// future will be pending until the spawned future completes.
@@ -43,6 +45,18 @@ where
4345
Ok(tokio::spawn(future).await?)
4446
}
4547

48+
/// Spawns a [ConditionalSend] future without requiring `await`.
49+
/// The future will immediately start processing.
50+
pub fn spawn_no_wait<F>(future: F)
51+
where
52+
F: Future<Output = ()> + ConditionalSend + 'static,
53+
{
54+
#[cfg(target_arch = "wasm32")]
55+
wasm_bindgen_futures::spawn_local(future);
56+
#[cfg(not(target_arch = "wasm32"))]
57+
tokio::task::spawn(future);
58+
}
59+
4660
/// An aggregator of async work that can be used to observe the moment when all
4761
/// the aggregated work is completed. It is similar to tokio's [JoinSet], but is
4862
/// relatively constrained and also works on `wasm32-unknown-unknown`. Unlike

rust/noosphere-core/src/authority/author.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ mod tests {
179179
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
180180
async fn it_gives_read_only_access_when_there_is_no_authorization() -> Result<()> {
181181
let author = Author::anonymous();
182-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
182+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
183183

184184
let (sphere, _, _) = Sphere::generate("did:key:foo", &mut db).await?;
185185

@@ -201,7 +201,7 @@ mod tests {
201201
async fn it_gives_read_write_access_if_the_key_is_authorized() -> Result<()> {
202202
let owner_key = generate_ed25519_key();
203203
let owner_did = Did(owner_key.get_did().await.unwrap());
204-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
204+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
205205

206206
let (sphere, authorization, _) = Sphere::generate(&owner_did, &mut db).await.unwrap();
207207

@@ -227,7 +227,7 @@ mod tests {
227227
async fn it_gives_read_write_access_to_the_root_sphere_credential() -> Result<()> {
228228
let owner_key = generate_ed25519_key();
229229
let owner_did = Did(owner_key.get_did().await.unwrap());
230-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
230+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
231231

232232
let (sphere, authorization, mnemonic) =
233233
Sphere::generate(&owner_did, &mut db).await.unwrap();
@@ -256,7 +256,7 @@ mod tests {
256256
async fn it_can_find_itself_in_an_authorization_lineage() -> Result<()> {
257257
let owner_key = generate_ed25519_key();
258258
let owner_did = Did(owner_key.get_did().await.unwrap());
259-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
259+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
260260

261261
let (sphere, authorization, _) = Sphere::generate(&owner_did, &mut db).await.unwrap();
262262

rust/noosphere-core/src/context/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ mod tests {
393393
let mut records: Vec<LinkRecord> = vec![];
394394
let owner_key = generate_ed25519_key();
395395
let owner_did = owner_key.get_did().await?;
396-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
396+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
397397
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;
398398
let ucan_proof = proof.as_ucan(&db).await?;
399399
let sphere_identity = sphere.get_identity().await?;

rust/noosphere-core/src/data/address.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ mod tests {
403403
let sphere_identity = Did::from(sphere_key.get_did().await?);
404404
let link = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
405405
let cid_link: Link<MemoIpld> = link.parse()?;
406-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
406+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
407407

408408
let record = from_issuer(&sphere_key, &sphere_identity, &cid_link, None).await?;
409409

@@ -422,7 +422,7 @@ mod tests {
422422
let sphere_identity = Did::from(sphere_key.get_did().await?);
423423
let link = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
424424
let cid_link: Cid = link.parse()?;
425-
let mut store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
425+
let mut store = SphereDb::new(MemoryStorage::default()).await.unwrap();
426426

427427
// First verify that `owner` cannot publish for `sphere`
428428
// without delegation.
@@ -486,7 +486,7 @@ mod tests {
486486
let sphere_key = generate_ed25519_key();
487487
let sphere_identity = Did::from(sphere_key.get_did().await?);
488488
let cid_address = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
489-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
489+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
490490

491491
expect_failure(
492492
"fails when expect `fact` is missing",
@@ -676,7 +676,7 @@ mod tests {
676676
let delegatee_key = generate_ed25519_key();
677677
let delegatee_did = delegatee_key.get_did().await?;
678678

679-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
679+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
680680
let mut ucan_store = UcanStore(db.clone());
681681

682682
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;

rust/noosphere-core/src/data/sphere.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ mod tests {
7878
let identity_credential = generate_ed25519_key();
7979
let identity = Did(identity_credential.get_did().await?);
8080

81-
let mut store = SphereDb::new(&MemoryStorage::default()).await?;
81+
let mut store = SphereDb::new(MemoryStorage::default()).await?;
8282

8383
let sphere = SphereIpld::new(&identity, &mut store).await?;
8484

@@ -127,7 +127,7 @@ mod tests {
127127
let identity = Did(identity_credential.get_did().await?);
128128
let authorized = Did(authorized_credential.get_did().await?);
129129

130-
let mut store = SphereDb::new(&MemoryStorage::default()).await?;
130+
let mut store = SphereDb::new(MemoryStorage::default()).await?;
131131

132132
let sphere = SphereIpld::new(&identity, &mut store).await?;
133133

rust/noosphere-core/src/helpers/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub async fn simulated_sphere_context(
3939
Some(db) => db,
4040
None => {
4141
let storage_provider = TrackingStorage::wrap(MemoryStorage::default());
42-
SphereDb::new(&storage_provider).await?
42+
SphereDb::new(storage_provider).await?
4343
}
4444
};
4545

rust/noosphere-core/src/helpers/link.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ where
1616
{
1717
let owner_key = generate_ed25519_key();
1818
let owner_did = owner_key.get_did().await?;
19-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
19+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
2020

2121
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;
2222
let ucan_proof = proof.as_ucan(&db).await?;

rust/noosphere-into/examples/notes-to-html/implementation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use ucan::crypto::KeyMaterial;
2727

2828
pub async fn main() -> Result<()> {
2929
let storage_provider = MemoryStorage::default();
30-
let mut db = SphereDb::new(&storage_provider).await.unwrap();
30+
let mut db = SphereDb::new(storage_provider).await.unwrap();
3131

3232
let owner_key: SphereContextKey = Arc::new(Box::new(generate_ed25519_key()));
3333
let owner_did = owner_key.get_did().await?;

rust/noosphere-ipfs/src/storage.rs

+15-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use anyhow::Result;
33
use async_trait::async_trait;
44
use cid::Cid;
55
use noosphere_common::ConditionalSync;
6-
use noosphere_storage::{BlockStore, Storage};
6+
use noosphere_storage::{BlockStore, EphemeralStorage, EphemeralStore, Storage};
77
use std::sync::Arc;
88
use tokio::sync::RwLock;
99

@@ -45,7 +45,6 @@ where
4545
C: IpfsClient + ConditionalSync,
4646
{
4747
type BlockStore = IpfsStore<S::BlockStore, C>;
48-
4948
type KeyValueStore = S::KeyValueStore;
5049

5150
async fn get_block_store(&self, name: &str) -> Result<Self::BlockStore> {
@@ -58,6 +57,20 @@ where
5857
}
5958
}
6059

60+
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
61+
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
62+
impl<S, C> EphemeralStorage for IpfsStorage<S, C>
63+
where
64+
S: Storage + EphemeralStorage + ConditionalSync,
65+
C: IpfsClient + ConditionalSync,
66+
{
67+
type EphemeralStoreType = <S as EphemeralStorage>::EphemeralStoreType;
68+
69+
async fn get_ephemeral_store(&self) -> Result<EphemeralStore<Self::EphemeralStoreType>> {
70+
self.local_storage.get_ephemeral_store().await
71+
}
72+
}
73+
6174
/// An implementation of [BlockStore] that wraps some other implementation of
6275
/// same. It forwards most behavior to its wrapped implementation, except when
6376
/// reading blocks. In that case, if a block cannot be found locally, it will

rust/noosphere-ns/src/builder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use libp2p::kad::KademliaConfig;
2323
/// #[tokio::main(flavor = "multi_thread")]
2424
/// async fn main() {
2525
/// let key_material = generate_ed25519_key();
26-
/// let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
26+
/// let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
2727
///
2828
/// let ns = NameSystemBuilder::default()
2929
/// .ucan_store(store)
@@ -190,7 +190,7 @@ mod tests {
190190
let keypair = key_material.to_dht_keypair()?;
191191
PeerId::from(keypair.public())
192192
};
193-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
193+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
194194
let bootstrap_peers: Vec<Multiaddr> = vec![
195195
"/ip4/127.0.0.50/tcp/33333/p2p/12D3KooWH8WgH9mgbMXrKX4veokUznvEn6Ycwg4qaGNi83nLkoUK"
196196
.parse()?,

rust/noosphere-ns/src/dht_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ pub mod test {
133133
// Now test another node connecting.
134134
let (_other_ns, other_peer_id) = {
135135
let key_material = generate_ed25519_key();
136-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
136+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
137137
let ns = NameSystemBuilder::default()
138138
.ucan_store(store)
139139
.key_material(&key_material)

rust/noosphere-ns/src/name_system.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ mod test {
172172
async fn before_name_resolver_tests() -> Result<NameSystem> {
173173
let ns = {
174174
let key_material = generate_ed25519_key();
175-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
175+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
176176
let ns = NameSystemBuilder::default()
177177
.ucan_store(store)
178178
.key_material(&key_material)
@@ -205,7 +205,7 @@ mod test {
205205
async fn before_each() -> Result<(DataPlaceholder, Arc<Mutex<NameSystem>>)> {
206206
let (bootstrap, bootstrap_address) = {
207207
let key_material = generate_ed25519_key();
208-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
208+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
209209
let ns = NameSystemBuilder::default()
210210
.ucan_store(store)
211211
.key_material(&key_material)
@@ -221,7 +221,7 @@ mod test {
221221

222222
let ns = {
223223
let key_material = generate_ed25519_key();
224-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
224+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
225225
let ns = NameSystemBuilder::default()
226226
.ucan_store(store)
227227
.key_material(&key_material)

rust/noosphere-ns/src/server/client.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ mod test {
146146
async fn before_each() -> Result<(DataPlaceholder, Arc<Mutex<HttpClient>>)> {
147147
let (bootstrap, bootstrap_address) = {
148148
let key_material = generate_ed25519_key();
149-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
149+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
150150
let ns = NameSystemBuilder::default()
151151
.ucan_store(store)
152152
.key_material(&key_material)
@@ -164,7 +164,7 @@ mod test {
164164
let api_port = api_listener.local_addr().unwrap().port();
165165
let api_url = Url::parse(&format!("http://127.0.0.1:{}", api_port))?;
166166
let key_material = generate_ed25519_key();
167-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
167+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
168168

169169
let ns = NameSystemBuilder::default()
170170
.ucan_store(store)

rust/noosphere-ns/tests/ns_test.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ async fn test_name_system_peer_propagation() -> Result<()> {
7575
initialize_tracing(None);
7676
// Create two NameSystems, where `ns_1` is publishing for `sphere_1`
7777
// and `ns_2` is publishing for `sphere_2`.
78-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
78+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
7979
let network = NameSystemNetwork::generate(3, Some(db.clone())).await?;
8080
let sphere_1_cid_1 = derive_cid::<DagCborCodec>(b"00000000");
8181
let sphere_1_cid_2 = derive_cid::<DagCborCodec>(b"11111111");
@@ -172,7 +172,7 @@ async fn test_name_system_peer_propagation() -> Result<()> {
172172
#[tokio::test]
173173
async fn test_name_system_validation() -> Result<()> {
174174
initialize_tracing(None);
175-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
175+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
176176
let network = NameSystemNetwork::generate(2, Some(db.clone())).await?;
177177

178178
let ns_1 = network.get(1).unwrap();

rust/noosphere-storage/Cargo.toml

+4-5
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,27 @@ readme = "README.md"
2121
anyhow = { workspace = true }
2222
async-trait = "~0.1"
2323
async-stream = { workspace = true }
24+
futures = { workspace = true }
2425
tokio-stream = { workspace = true }
2526
cid = { workspace = true }
2627
noosphere-common = { version = "0.1.2", path = "../noosphere-common" }
2728
tracing = "~0.1"
2829
ucan = { workspace = true }
2930
libipld-core = { workspace = true }
3031
libipld-cbor = { workspace = true }
32+
rand = { workspace = true }
3133
serde = { workspace = true }
3234
base64 = { workspace = true }
3335
url = { version = "^2" }
3436

3537
[dev-dependencies]
36-
witty-phrase-generator = "~0.2"
3738
wasm-bindgen-test = { workspace = true }
38-
rand = { workspace = true }
3939
noosphere-core-dev = { path = "../noosphere-core", features = ["helpers"], package = "noosphere-core" }
4040
noosphere-common = { path = "../noosphere-common", features = ["helpers"] }
4141
instant = { workspace = true }
4242

43-
[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
44-
tempfile = { workspace = true }
45-
4643
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
44+
tempfile = { workspace = true }
4745
sled = "~0.34"
4846
tokio = { workspace = true, features = ["full"] }
4947
rocksdb = { version = "0.21.0", optional = true }
@@ -52,6 +50,7 @@ rocksdb = { version = "0.21.0", optional = true }
5250
tokio = { workspace = true, features = ["sync", "macros"] }
5351
wasm-bindgen = { workspace = true, features = ["serde-serialize"] }
5452
wasm-bindgen-futures = { workspace = true }
53+
witty-phrase-generator = "~0.2"
5554
serde-wasm-bindgen = { workspace = true }
5655
js-sys = { workspace = true }
5756
rexie = { version = "~0.5" }

rust/noosphere-storage/examples/bench/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ impl BenchmarkStorage {
179179
}
180180

181181
pub async fn sphere_db(&self) -> Result<SphereDb<ActiveStorageType>> {
182-
SphereDb::new(&self.storage).await
182+
SphereDb::new(self.storage.clone()).await
183183
}
184184

185185
pub async fn as_stats(&mut self) -> Result<PerformanceStats> {

0 commit comments

Comments
 (0)