feat: reimplemented clean method in actor
parent
042f1ecbd3
commit
bde3b90711
|
@ -98,6 +98,7 @@ impl RepoActor {
|
|||
== Some(0)
|
||||
{
|
||||
let _ = self.sync_repo(repo);
|
||||
let _ = self.clean();
|
||||
}
|
||||
}
|
||||
RepoCommand::SyncRepo(repo) => {
|
||||
|
@ -179,16 +180,8 @@ impl RepoActor {
|
|||
// sea_orm needs its connections to be dropped inside an async context, so we spawn a task
|
||||
// that streams the responses to the synchronous context via message passing
|
||||
self.rt.spawn(async move {
|
||||
let stream = query.stream(&conn).await;
|
||||
|
||||
if let Err(err) = stream {
|
||||
let _ = tx.send(Err(err)).await;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let mut stream = stream.unwrap();
|
||||
|
||||
match query.stream(&conn).await {
|
||||
Ok(mut stream) => {
|
||||
while let Some(res) = stream.next().await {
|
||||
let is_err = res.is_err();
|
||||
let _ = tx.send(res).await;
|
||||
|
@ -197,6 +190,11 @@ impl RepoActor {
|
|||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
let _ = tx.send(Err(err)).await;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let mut committed_ids: Vec<i32> = Vec::new();
|
||||
|
@ -233,6 +231,60 @@ impl RepoActor {
|
|||
}
|
||||
|
||||
fn clean(&self) -> crate::Result<()> {
|
||||
todo!()
|
||||
let (tx, mut rx) = mpsc::channel(1);
|
||||
let conn = self.state.conn.clone();
|
||||
let query = db::query::package::stale_pkgs(&self.state.conn);
|
||||
|
||||
// sea_orm needs its connections to be dropped inside an async context, so we spawn a task
|
||||
// that streams the responses to the synchronous context via message passing
|
||||
self.rt.spawn(async move {
|
||||
match query.stream(&conn).await {
|
||||
Ok(mut stream) => {
|
||||
while let Some(res) = stream.next().await {
|
||||
let is_err = res.is_err();
|
||||
let _ = tx.send(res).await;
|
||||
|
||||
if is_err {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
let _ = tx.send(Err(err)).await;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Ids are monotonically increasing, so the max id suffices to know which packages to
|
||||
// remove later
|
||||
let mut max_id = -1;
|
||||
let mut removed_pkgs = 0;
|
||||
|
||||
while let Some(pkg) = rx.blocking_recv().transpose()? {
|
||||
// Failing to remove the package file isn't the biggest problem
|
||||
let _ = std::fs::remove_file(
|
||||
self.state
|
||||
.repos_dir
|
||||
.join(pkg.repo_id.to_string())
|
||||
.join(pkg.id.to_string()),
|
||||
);
|
||||
|
||||
if pkg.id > max_id {
|
||||
max_id = pkg.id;
|
||||
}
|
||||
|
||||
removed_pkgs += 1;
|
||||
}
|
||||
|
||||
if removed_pkgs > 0 {
|
||||
self.rt.block_on(db::query::package::delete_stale_pkgs(
|
||||
&self.state.conn,
|
||||
max_id,
|
||||
))?;
|
||||
}
|
||||
|
||||
tracing::info!("Cleaned up {removed_pkgs} old package(s)");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -94,18 +94,11 @@ impl RepoArchivesWriter {
|
|||
|
||||
let conn = self.conn.clone();
|
||||
let query = pkg.find_related(db::PackageFile);
|
||||
|
||||
self.rt.spawn(async move {
|
||||
let files = query.stream(&conn).await;
|
||||
|
||||
if let Err(err) = files {
|
||||
let _ = tx.send(Err(err)).await;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let mut files = files.unwrap();
|
||||
|
||||
while let Some(res) = files.next().await {
|
||||
match query.stream(&conn).await {
|
||||
Ok(mut stream) => {
|
||||
while let Some(res) = stream.next().await {
|
||||
let is_err = res.is_err();
|
||||
let _ = tx.send(res).await;
|
||||
|
||||
|
@ -113,6 +106,11 @@ impl RepoArchivesWriter {
|
|||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
let _ = tx.send(Err(err)).await;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
while let Some(file) = rx.blocking_recv().transpose()? {
|
||||
|
|
Loading…
Reference in New Issue