Constellation, Spacedust, Slingshot, UFOs: atproto crates and services for microcosm

run tasks in actually separate tokio tasks

the more you know 🎶

Changed files
+37 -10
ufos
src
+37 -10
ufos/src/main.rs
··· 4 use metrics_exporter_prometheus::PrometheusBuilder; 5 use std::path::PathBuf; 6 use std::time::{Duration, SystemTime}; 7 use ufos::consumer; 8 use ufos::file_consumer; 9 use ufos::server; ··· 72 Ok(()) 73 } 74 75 - async fn go<B: StoreBackground>( 76 args: Args, 77 read_store: impl StoreReader + 'static + Clone, 78 mut write_store: impl StoreWriter<B> + 'static, 79 cursor: Option<Cursor>, 80 sketch_secret: SketchSecretPrefix, 81 ) -> anyhow::Result<()> { 82 println!("starting server with storage..."); 83 let serving = server::serve(read_store.clone()); 84 85 if args.pause_writer { 86 log::info!("not starting jetstream or the write loop."); 87 - serving.await.map_err(|e| anyhow::anyhow!(e))?; 88 return Ok(()); 89 } 90 ··· 102 let rolling = write_store 103 .background_tasks(args.reroll)? 104 .run(args.backfill); 105 - let consuming = write_store.receive_batches(batches); 106 107 - let stating = do_update_stuff(read_store); 108 109 install_metrics_server()?; 110 111 - tokio::select! { 112 - z = serving => log::warn!("serve task ended: {z:?}"), 113 - z = rolling => log::warn!("rollup task ended: {z:?}"), 114 - z = consuming => log::warn!("consuming task ended: {z:?}"), 115 - z = stating => log::warn!("status task ended: {z:?}"), 116 - }; 117 118 println!("bye!"); 119
··· 4 use metrics_exporter_prometheus::PrometheusBuilder; 5 use std::path::PathBuf; 6 use std::time::{Duration, SystemTime}; 7 + use tokio::task::JoinSet; 8 use ufos::consumer; 9 use ufos::file_consumer; 10 use ufos::server; ··· 73 Ok(()) 74 } 75 76 + async fn go<B: StoreBackground + 'static>( 77 args: Args, 78 read_store: impl StoreReader + 'static + Clone, 79 mut write_store: impl StoreWriter<B> + 'static, 80 cursor: Option<Cursor>, 81 sketch_secret: SketchSecretPrefix, 82 ) -> anyhow::Result<()> { 83 + let mut tasks: JoinSet<anyhow::Result<()>> = JoinSet::new(); 84 + 85 println!("starting server with storage..."); 86 let serving = server::serve(read_store.clone()); 87 + tasks.spawn(async move { 88 + serving.await.map_err(|e| { 89 + log::warn!("server ended: {e}"); 90 + anyhow::anyhow!(e) 91 + }) 92 + }); 93 94 if args.pause_writer { 95 log::info!("not starting jetstream or the write loop."); 96 + for t in tasks.join_all().await { 97 + if let Err(e) = t { 98 + return Err(anyhow::anyhow!(e)); 99 + } 100 + } 101 return Ok(()); 102 } 103 ··· 115 let rolling = write_store 116 .background_tasks(args.reroll)? 117 .run(args.backfill); 118 + tasks.spawn(async move { 119 + rolling 120 + .await 121 + .inspect_err(|e| log::warn!("rollup ended: {e}"))?; 122 + Ok(()) 123 + }); 124 + 125 + tasks.spawn(async move { 126 + write_store 127 + .receive_batches(batches) 128 + .await 129 + .inspect_err(|e| log::warn!("consumer ended: {e}"))?; 130 + Ok(()) 131 + }); 132 133 + tasks.spawn(async move { 134 + do_update_stuff(read_store).await; 135 + log::warn!("status task ended"); 136 + Ok(()) 137 + }); 138 139 install_metrics_server()?; 140 141 + for (i, t) in tasks.join_all().await.iter().enumerate() { 142 + log::warn!("task {i} done: {t:?}"); 143 + } 144 145 println!("bye!"); 146