2
0
Fork 0
mirror of https://git.asonix.dog/asonix/pict-rs synced 2024-12-22 19:31:35 +00:00

Attempt clean-drop of tmp_dir

This commit is contained in:
asonix 2023-10-07 11:36:49 -05:00
parent 7b5a3020fa
commit 7f5cbc4571
2 changed files with 50 additions and 14 deletions

View file

@ -2196,13 +2196,19 @@ impl PictRsConfiguration {
match repo { match repo {
Repo::Sled(sled_repo) => { Repo::Sled(sled_repo) => {
launch_file_store(tmp_dir, arc_repo, store, client, config, move |sc| { launch_file_store(
sled_extra_config(sc, sled_repo.clone()) tmp_dir.clone(),
}) arc_repo,
store,
client,
config,
move |sc| sled_extra_config(sc, sled_repo.clone()),
)
.await?; .await?;
} }
Repo::Postgres(_) => { Repo::Postgres(_) => {
launch_file_store(tmp_dir, arc_repo, store, client, config, |_| {}).await?; launch_file_store(tmp_dir.clone(), arc_repo, store, client, config, |_| {})
.await?;
} }
} }
} }
@ -2260,19 +2266,33 @@ impl PictRsConfiguration {
match repo { match repo {
Repo::Sled(sled_repo) => { Repo::Sled(sled_repo) => {
launch_object_store(tmp_dir, arc_repo, store, client, config, move |sc| { launch_object_store(
sled_extra_config(sc, sled_repo.clone()) tmp_dir.clone(),
}) arc_repo,
store,
client,
config,
move |sc| sled_extra_config(sc, sled_repo.clone()),
)
.await?; .await?;
} }
Repo::Postgres(_) => { Repo::Postgres(_) => {
launch_object_store(tmp_dir, arc_repo, store, client, config, |_| {}) launch_object_store(
tmp_dir.clone(),
arc_repo,
store,
client,
config,
|_| {},
)
.await?; .await?;
} }
} }
} }
} }
tmp_dir.cleanup().await?;
Ok(()) Ok(())
} }
} }

View file

@ -6,28 +6,44 @@ pub(crate) type ArcTmpDir = Arc<TmpDir>;
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct TmpDir { pub(crate) struct TmpDir {
path: PathBuf, path: Option<PathBuf>,
} }
impl TmpDir { impl TmpDir {
pub(crate) async fn init() -> std::io::Result<Arc<Self>> { pub(crate) async fn init() -> std::io::Result<Arc<Self>> {
let path = std::env::temp_dir().join(Uuid::new_v4().to_string()); let path = std::env::temp_dir().join(Uuid::new_v4().to_string());
tokio::fs::create_dir(&path).await?; tokio::fs::create_dir(&path).await?;
Ok(Arc::new(TmpDir { path })) Ok(Arc::new(TmpDir { path: Some(path) }))
} }
pub(crate) fn tmp_file(&self, ext: Option<&str>) -> PathBuf { pub(crate) fn tmp_file(&self, ext: Option<&str>) -> PathBuf {
if let Some(ext) = ext { if let Some(ext) = ext {
self.path.join(format!("{}{}", Uuid::new_v4(), ext)) self.path
.as_ref()
.expect("tmp path exists")
.join(format!("{}{}", Uuid::new_v4(), ext))
} else { } else {
self.path.join(Uuid::new_v4().to_string()) self.path
.as_ref()
.expect("tmp path exists")
.join(Uuid::new_v4().to_string())
} }
} }
pub(crate) async fn cleanup(self: Arc<Self>) -> std::io::Result<()> {
if let Some(path) = Arc::into_inner(self).and_then(|mut this| this.path.take()) {
tokio::fs::remove_dir_all(path).await?;
}
Ok(())
}
} }
impl Drop for TmpDir { impl Drop for TmpDir {
fn drop(&mut self) { fn drop(&mut self) {
std::fs::remove_dir_all(&self.path).expect("Removed directory"); if let Some(path) = self.path.as_ref() {
std::fs::remove_dir_all(path).expect("Removed directory");
}
} }
} }