@@ -15,7 +15,7 @@ use n0_snafu::SpanTrace;
1515use nested_enum_utils:: common_fields;
1616use redb:: { Database , DatabaseError , ReadableTable } ;
1717use snafu:: { Backtrace , ResultExt , Snafu } ;
18- use tokio:: pin;
18+ use tokio:: { pin, task :: JoinSet } ;
1919
2020use crate :: {
2121 api:: {
@@ -96,15 +96,6 @@ impl Db {
9696 Self { sender }
9797 }
9898
99- pub async fn snapshot ( & self , span : tracing:: Span ) -> io:: Result < ReadOnlyTables > {
100- let ( tx, rx) = tokio:: sync:: oneshot:: channel ( ) ;
101- self . sender
102- . send ( Snapshot { tx, span } . into ( ) )
103- . await
104- . map_err ( |_| io:: Error :: other ( "send snapshot" ) ) ?;
105- rx. await . map_err ( |_| io:: Error :: other ( "receive snapshot" ) )
106- }
107-
10899 pub async fn update_await ( & self , hash : Hash , state : EntryState < Bytes > ) -> io:: Result < ( ) > {
109100 let ( tx, rx) = oneshot:: channel ( ) ;
110101 self . sender
@@ -463,6 +454,7 @@ pub struct Actor {
463454 ds : DeleteHandle ,
464455 options : BatchOptions ,
465456 protected : HashSet < Hash > ,
457+ tasks : JoinSet < ( ) > ,
466458}
467459
468460impl Actor {
@@ -492,6 +484,7 @@ impl Actor {
492484 ds,
493485 options,
494486 protected : Default :: default ( ) ,
487+ tasks : JoinSet :: new ( ) ,
495488 } )
496489 }
497490
@@ -707,6 +700,7 @@ impl Actor {
707700
708701 async fn handle_toplevel (
709702 db : & mut Database ,
703+ tasks : & mut JoinSet < ( ) > ,
710704 cmd : TopLevelCommand ,
711705 op : TxnNum ,
712706 ) -> ActorResult < Option < ShutdownMsg > > {
@@ -726,11 +720,11 @@ impl Actor {
726720 // nothing to do here, since the database will be dropped
727721 Some ( cmd)
728722 }
729- TopLevelCommand :: Snapshot ( cmd) => {
723+ TopLevelCommand :: ListBlobs ( cmd) => {
730724 trace ! ( "{cmd:?}" ) ;
731725 let txn = db. begin_read ( ) . context ( TransactionSnafu ) ?;
732726 let snapshot = ReadOnlyTables :: new ( & txn) . context ( TableSnafu ) ?;
733- cmd . tx . send ( snapshot) . ok ( ) ;
727+ tasks . spawn ( list_blobs ( snapshot, cmd ) ) ;
734728 None
735729 }
736730 } )
@@ -741,14 +735,20 @@ impl Actor {
741735 let options = & self . options ;
742736 let mut op = 0u64 ;
743737 let shutdown = loop {
738+ let cmd = tokio:: select! {
739+ cmd = self . cmds. recv( ) => cmd,
740+ _ = self . tasks. join_next( ) , if !self . tasks. is_empty( ) => continue ,
741+ } ;
744742 op += 1 ;
745- let Some ( cmd) = self . cmds . recv ( ) . await else {
743+ let Some ( cmd) = cmd else {
746744 break None ;
747745 } ;
748746 match cmd {
749747 Command :: TopLevel ( cmd) => {
750748 let op = TxnNum :: TopLevel ( op) ;
751- if let Some ( shutdown) = Self :: handle_toplevel ( & mut db, cmd, op) . await ? {
749+ if let Some ( shutdown) =
750+ Self :: handle_toplevel ( & mut db, & mut self . tasks , cmd, op) . await ?
751+ {
752752 break Some ( shutdown) ;
753753 }
754754 }
0 commit comments