blob: a3306730c6659e23929ceb5409a880120b82a521 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
async_trait::async_trait,
fidl_fuchsia_io as fio,
fuchsia_zircon::Status,
storage_stress_test_utils::{data::FileFactory, io::Directory},
stress_test::actor::{Actor, ActorError},
tracing::info,
};
// Performs operations on blobs expected to exist on disk
pub struct BlobActor {
// Factory used to generate blobs of specific size and compressibility
pub factory: FileFactory,
// Blobfs root directory
pub root_dir: Directory,
}
impl BlobActor {
pub fn new(factory: FileFactory, root_dir: Directory) -> Self {
Self { factory, root_dir }
}
async fn create_blob(&mut self) -> Result<(), Status> {
// Create the root hash for the blob
let data_bytes = self.factory.generate_bytes();
let tree = fuchsia_merkle::from_slice(&data_bytes);
let merkle_root_hash = tree.root().to_string();
// Write the file to disk
let file = self
.root_dir
.open_file(
&merkle_root_hash,
fio::OpenFlags::CREATE
| fio::OpenFlags::CREATE_IF_ABSENT
| fio::OpenFlags::RIGHT_WRITABLE,
)
.await?;
file.truncate(data_bytes.len() as u64).await?;
file.write(&data_bytes).await?;
file.close().await
}
}
#[async_trait]
impl Actor for BlobActor {
async fn perform(&mut self) -> Result<(), ActorError> {
match self.create_blob().await {
Ok(()) => Ok(()),
Err(Status::NO_SPACE) => Ok(()),
// Any other error is assumed to come from an intentional crash.
// The environment verifies that an intentional crash occurred
// and will panic if that is not the case.
Err(s) => {
info!("Blob actor got status: {}", s);
Err(ActorError::ResetEnvironment)
}
}
}
}