feat: reimplemented clean method in actor
parent
042f1ecbd3
commit
bde3b90711
|
@ -98,6 +98,7 @@ impl RepoActor {
|
||||||
== Some(0)
|
== Some(0)
|
||||||
{
|
{
|
||||||
let _ = self.sync_repo(repo);
|
let _ = self.sync_repo(repo);
|
||||||
|
let _ = self.clean();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RepoCommand::SyncRepo(repo) => {
|
RepoCommand::SyncRepo(repo) => {
|
||||||
|
@ -179,22 +180,19 @@ impl RepoActor {
|
||||||
// sea_orm needs its connections to be dropped inside an async context, so we spawn a task
|
// 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
|
// that streams the responses to the synchronous context via message passing
|
||||||
self.rt.spawn(async move {
|
self.rt.spawn(async move {
|
||||||
let stream = query.stream(&conn).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;
|
||||||
|
|
||||||
if let Err(err) = stream {
|
if is_err {
|
||||||
let _ = tx.send(Err(err)).await;
|
return;
|
||||||
|
}
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
|
Err(err) => {
|
||||||
let mut stream = stream.unwrap();
|
let _ = tx.send(Err(err)).await;
|
||||||
|
|
||||||
while let Some(res) = stream.next().await {
|
|
||||||
let is_err = res.is_err();
|
|
||||||
let _ = tx.send(res).await;
|
|
||||||
|
|
||||||
if is_err {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -233,6 +231,60 @@ impl RepoActor {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clean(&self) -> crate::Result<()> {
|
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,23 +94,21 @@ impl RepoArchivesWriter {
|
||||||
|
|
||||||
let conn = self.conn.clone();
|
let conn = self.conn.clone();
|
||||||
let query = pkg.find_related(db::PackageFile);
|
let query = pkg.find_related(db::PackageFile);
|
||||||
|
|
||||||
self.rt.spawn(async move {
|
self.rt.spawn(async move {
|
||||||
let files = query.stream(&conn).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;
|
||||||
|
|
||||||
if let Err(err) = files {
|
if is_err {
|
||||||
let _ = tx.send(Err(err)).await;
|
return;
|
||||||
|
}
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
|
Err(err) => {
|
||||||
let mut files = files.unwrap();
|
let _ = tx.send(Err(err)).await;
|
||||||
|
|
||||||
while let Some(res) = files.next().await {
|
|
||||||
let is_err = res.is_err();
|
|
||||||
let _ = tx.send(res).await;
|
|
||||||
|
|
||||||
if is_err {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue