storage.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. use rstd::vec::Vec;
  2. use srml_support::traits::Randomness;
  3. use crate::{ActorId, Runtime};
  4. /// Provides random storage provider id. We use it when assign the content to the storage provider.
  5. pub struct StorageProviderHelper;
  6. impl storage::data_directory::StorageProviderHelper<Runtime> for StorageProviderHelper {
  7. fn get_random_storage_provider() -> Result<ActorId, &'static str> {
  8. let ids = crate::StorageBureaucracy::get_all_worker_ids();
  9. let live_ids: Vec<ActorId> = ids
  10. .into_iter()
  11. .filter(|id| !<service_discovery::Module<Runtime>>::is_account_info_expired(id))
  12. .collect();
  13. if live_ids.is_empty() {
  14. Err("No valid storage provider found.")
  15. } else {
  16. let index = Self::random_index(live_ids.len());
  17. Ok(live_ids[index])
  18. }
  19. }
  20. }
  21. impl StorageProviderHelper {
  22. fn random_index(upper_bound: usize) -> usize {
  23. let seed = crate::RandomnessCollectiveFlip::random_seed();
  24. let mut rand: u64 = 0;
  25. for offset in 0..8 {
  26. rand += (seed.as_ref()[offset] as u64) << offset;
  27. }
  28. (rand as usize) % upper_bound
  29. }
  30. }