@@ -81,10 +81,6 @@ pub struct ArtifactStore<T: DatasetsManager> {
8181 ledger_tx : mpsc:: Sender < LedgerManagerRequest > ,
8282 config : watch:: Receiver < Option < ArtifactConfig > > ,
8383 pub ( crate ) storage : T ,
84-
85- /// Used for synchronization in unit tests.
86- #[ cfg( test) ]
87- delete_done : watch:: Receiver < Generation > ,
8884}
8985
9086impl < T : DatasetsManager > ArtifactStore < T > {
@@ -136,14 +132,10 @@ impl<T: DatasetsManager> ArtifactStore<T> {
136132 config_tx,
137133 ) ) ;
138134
139- #[ cfg( test) ]
140- let ( done_signal, delete_done) = watch:: channel ( 0u32 . into ( ) ) ;
141135 tokio:: task:: spawn ( delete_reconciler (
142136 log. clone ( ) ,
143137 storage. clone ( ) ,
144138 config. clone ( ) ,
145- #[ cfg( test) ]
146- done_signal,
147139 ) ) ;
148140
149141 ArtifactStore {
@@ -155,9 +147,6 @@ impl<T: DatasetsManager> ArtifactStore<T> {
155147 ledger_tx,
156148 config,
157149 storage,
158-
159- #[ cfg( test) ]
160- delete_done,
161150 }
162151 }
163152}
@@ -506,7 +495,6 @@ async fn delete_reconciler<T: DatasetsManager>(
506495 log : Logger ,
507496 storage : T ,
508497 mut receiver : watch:: Receiver < Option < ArtifactConfig > > ,
509- #[ cfg( test) ] done_signal : watch:: Sender < Generation > ,
510498) {
511499 while let Ok ( ( ) ) = receiver. changed ( ) . await {
512500 let generation = match receiver. borrow_and_update ( ) . as_ref ( ) {
@@ -580,12 +568,7 @@ async fn delete_reconciler<T: DatasetsManager>(
580568 }
581569 }
582570 }
583- #[ cfg( test) ]
584- done_signal. send_if_modified ( |old| {
585- let modified = * old != generation;
586- * old = generation;
587- modified
588- } ) ;
571+ storage. signal_delete_done ( generation) ;
589572 }
590573 warn ! ( log, "Delete reconciler sender dropped" ) ;
591574}
@@ -602,6 +585,8 @@ pub trait DatasetsManager: Clone + Send + Sync + 'static {
602585 async fn copy_permit ( & self ) -> Option < OwnedSemaphorePermit > {
603586 None
604587 }
588+
589+ fn signal_delete_done ( & self , _generation : Generation ) { }
605590}
606591
607592impl DatasetsManager for InternalDisksReceiver {
@@ -908,16 +893,20 @@ mod test {
908893 use camino_tempfile:: Utf8TempDir ;
909894 use futures:: stream:: { self , StreamExt } ;
910895 use hex_literal:: hex;
896+ use omicron_common:: api:: external:: Generation ;
911897 use omicron_test_utils:: dev:: test_setup_log;
912898 use sled_agent_api:: ArtifactConfig ;
913899 use tokio:: io:: AsyncReadExt ;
914900 use tokio:: sync:: oneshot;
901+ use tokio:: sync:: watch;
915902 use tufaceous_artifact:: ArtifactHash ;
916903
917904 use super :: { ArtifactStore , DatasetsManager , Error } ;
918905
919906 #[ derive( Clone ) ]
920907 struct TestBackend {
908+ delete_done_tx : watch:: Sender < Generation > ,
909+ delete_done_rx : watch:: Receiver < Generation > ,
921910 datasets : Vec < Utf8PathBuf > ,
922911 _tempdir : Arc < Utf8TempDir > ,
923912 }
@@ -934,7 +923,13 @@ mod test {
934923 datasets. push ( dataset)
935924 }
936925
937- TestBackend { datasets, _tempdir : tempdir }
926+ let ( delete_done_tx, delete_done_rx) = watch:: channel ( 0u32 . into ( ) ) ;
927+ TestBackend {
928+ delete_done_tx,
929+ delete_done_rx,
930+ datasets,
931+ _tempdir : tempdir,
932+ }
938933 }
939934 }
940935
@@ -944,6 +939,14 @@ mod test {
944939 ) -> impl Iterator < Item = camino:: Utf8PathBuf > + ' _ {
945940 self . datasets . iter ( ) . cloned ( )
946941 }
942+
943+ fn signal_delete_done ( & self , generation : Generation ) {
944+ self . delete_done_tx . send_if_modified ( |old| {
945+ let modified = * old != generation;
946+ * old = generation;
947+ modified
948+ } ) ;
949+ }
947950 }
948951
949952 const TEST_ARTIFACT : Bytes = Bytes :: from_static ( b"I'm an artifact!\n " ) ;
@@ -1121,7 +1124,7 @@ mod test {
11211124 }
11221125
11231126 // clear `delete_done` so we can synchronize with the delete reconciler
1124- store. delete_done . mark_unchanged ( ) ;
1127+ store. storage . delete_done_rx . mark_unchanged ( ) ;
11251128 // put a new config that says we don't want the artifact anymore.
11261129 config. generation = config. generation . next ( ) ;
11271130 config. artifacts . remove ( & TEST_HASH ) ;
@@ -1130,7 +1133,7 @@ mod test {
11301133 // has actually occurred yet
11311134 assert ! ( store. list( ) . await . unwrap( ) . list. is_empty( ) ) ;
11321135 // wait for deletion to actually complete
1133- store. delete_done . changed ( ) . await . unwrap ( ) ;
1136+ store. storage . delete_done_rx . changed ( ) . await . unwrap ( ) ;
11341137 // get fails, because it has been deleted
11351138 assert ! ( matches!(
11361139 store. get( TEST_HASH ) . await ,
0 commit comments