[Fix] Bound Iota storage, relay and transport resources
This commit is contained in:
parent
46078cbc4a
commit
e19c3c3d12
19 changed files with 609 additions and 48 deletions
50
iota-storage/tests/asset_quota.rs
Normal file
50
iota-storage/tests/asset_quota.rs
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
use iota_storage::util::{config_util, db, user_assets};
|
||||
use sha2::{Digest, Sha256};
|
||||
use std::sync::Arc;
|
||||
|
||||
#[test]
|
||||
fn upload_quota_reserves_and_releases_capacity() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let directory = tempfile::tempdir()?;
|
||||
iota_util::file_util::configure_storage_directory(directory.path().into());
|
||||
db::initialize_database()?;
|
||||
let mut config = config_util::IotaConfig::default();
|
||||
config.storage_limits.max_asset_bytes = 5;
|
||||
config.storage_limits.max_user_asset_bytes = 8;
|
||||
config.storage_limits.max_active_asset_uploads_per_user = 2;
|
||||
config.storage_limits.min_free_asset_storage_bytes = 0;
|
||||
config_util::CONFIG.store(Arc::new(config));
|
||||
|
||||
let hash = Sha256::digest(b"data");
|
||||
assert!(user_assets::start(42, "oversize", "a", 6, &hash, "text/plain").is_err());
|
||||
user_assets::start(42, "first", "a", 4, &hash, "text/plain")?;
|
||||
user_assets::start(42, "second", "b", 4, &hash, "text/plain")?;
|
||||
assert!(user_assets::start(42, "third", "c", 1, &hash, "text/plain").is_err());
|
||||
assert!(user_assets::abort(42, "second")?);
|
||||
user_assets::start(42, "third", "c", 1, &hash, "text/plain")?;
|
||||
user_assets::append(42, "first", 0, b"data")?;
|
||||
user_assets::commit(42, "first")?;
|
||||
assert!(user_assets::start(42, "fourth", "d", 4, &hash, "text/plain").is_err());
|
||||
assert!(user_assets::abort(42, "third")?);
|
||||
user_assets::start(42, "fourth", "d", 4, &hash, "text/plain")?;
|
||||
|
||||
let barrier = Arc::new(std::sync::Barrier::new(2));
|
||||
let attempts: Vec<_> = ["concurrent-a", "concurrent-b"]
|
||||
.into_iter()
|
||||
.map(|upload_id| {
|
||||
let barrier = barrier.clone();
|
||||
std::thread::spawn(move || {
|
||||
barrier.wait();
|
||||
user_assets::start(77, upload_id, upload_id, 5, &hash, "text/plain").is_ok()
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
assert_eq!(
|
||||
attempts
|
||||
.into_iter()
|
||||
.filter_map(|handle| handle.join().ok())
|
||||
.filter(|ok| *ok)
|
||||
.count(),
|
||||
1
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
Loading…
Reference in a new issue