| // 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, |
| fs_management::asynchronous::ServingFilesystem, |
| fuchsia_async as fasync, |
| std::time::Duration, |
| storage_stress_test_utils::fvm::FvmInstance, |
| stress_test::actor::{Actor, ActorError}, |
| }; |
| |
| /// An actor that kills the fs instance and destroys the ramdisk |
| pub struct InstanceActor { |
| pub instance: Option<(FvmInstance, ServingFilesystem)>, |
| } |
| |
| impl InstanceActor { |
| pub fn new(fvm: FvmInstance, fs: ServingFilesystem) -> Self { |
| Self { instance: Some((fvm, fs)) } |
| } |
| } |
| |
| #[async_trait] |
| impl Actor for InstanceActor { |
| async fn perform(&mut self) -> Result<(), ActorError> { |
| if let Some((fvm_instance, fs)) = self.instance.take() { |
| // We want to kill the ram-disk before the filesystem so that we test the filesystem in |
| // a simulated power-fail. |
| let path = fvm_instance.ramdisk_path(); |
| std::mem::drop(fvm_instance); |
| // Wait for the device to go away. |
| let mut count = 0; |
| while let Ok(_) = std::fs::metadata(&path) { |
| count += 1; |
| assert!(count < 100); |
| fasync::Timer::new(Duration::from_millis(100)).await; |
| } |
| fs.kill().await.expect("Could not kill fs instance"); |
| } else { |
| panic!("Instance was already killed!") |
| } |
| Err(ActorError::ResetEnvironment) |
| } |
| } |