1- use crate :: { db:: delete, Context } ;
1+ use crate :: { db:: delete, utils :: spawn_blocking , Context } ;
22use anyhow:: { Context as _, Result } ;
33use itertools:: Itertools ;
44use tracing:: { info, warn} ;
@@ -24,24 +24,25 @@ const BUILD_PRIORITY: i32 = 15;
2424///
2525/// Even when activities fail, the command can just be re-run. While the diff calculation will
2626/// be repeated, we won't re-execute fixing activities.
27- pub fn run_check < C : Context > ( ctx : & C , dry_run : bool ) -> Result < ( ) > {
27+ pub async fn run_check < C : Context > ( ctx : & C , dry_run : bool ) -> Result < ( ) > {
2828 let index = ctx. index ( ) ?;
2929
3030 info ! ( "Loading data from database..." ) ;
31- let db_data = ctx
32- . runtime ( ) ?
33- . block_on ( async {
34- let mut conn = ctx. pool ( ) ?. get_async ( ) . await ?;
35- db:: load ( & mut conn, & * ctx. config ( ) ?) . await
36- } )
31+ let mut conn = ctx. async_pool ( ) . await ?. get_async ( ) . await ?;
32+ let db_data = db:: load ( & mut conn, & * ctx. config ( ) ?)
33+ . await
3734 . context ( "Loading crate data from database for consistency check" ) ?;
3835
3936 tracing:: info!( "Loading data from index..." ) ;
40- let index_data =
41- index:: load ( & index) . context ( "Loading crate data from index for consistency check" ) ?;
37+ let index_data = spawn_blocking ( {
38+ let index = index. clone ( ) ;
39+ move || index:: load ( & index)
40+ } )
41+ . await
42+ . context ( "Loading crate data from index for consistency check" ) ?;
4243
4344 let diff = diff:: calculate_diff ( db_data. iter ( ) , index_data. iter ( ) ) ;
44- let result = handle_diff ( ctx, diff. iter ( ) , dry_run) ?;
45+ let result = handle_diff ( ctx, diff. iter ( ) , dry_run) . await ?;
4546
4647 println ! ( "============" ) ;
4748 println ! ( "SUMMARY" ) ;
@@ -79,29 +80,27 @@ struct HandleResult {
7980 yanks_corrected : u32 ,
8081}
8182
82- fn handle_diff < ' a , I , C > ( ctx : & C , iter : I , dry_run : bool ) -> Result < HandleResult >
83+ async fn handle_diff < ' a , I , C > ( ctx : & C , iter : I , dry_run : bool ) -> Result < HandleResult >
8384where
8485 I : Iterator < Item = & ' a diff:: Difference > ,
8586 C : Context ,
8687{
8788 let mut result = HandleResult :: default ( ) ;
8889
8990 let config = ctx. config ( ) ?;
90- let runtime = ctx. runtime ( ) ?;
9191
92- let storage = runtime . block_on ( ctx. async_storage ( ) ) ?;
93- let build_queue = ctx. build_queue ( ) ?;
92+ let storage = ctx. async_storage ( ) . await ?;
93+ let build_queue = ctx. async_build_queue ( ) . await ?;
9494
95- let mut conn = runtime . block_on ( ctx. pool ( ) ?. get_async ( ) ) ?;
95+ let mut conn = ctx. async_pool ( ) . await ?. get_async ( ) . await ?;
9696
9797 for difference in iter {
9898 println ! ( "{difference}" ) ;
9999
100100 match difference {
101101 diff:: Difference :: CrateNotInIndex ( name) => {
102102 if !dry_run {
103- if let Err ( err) =
104- runtime. block_on ( delete:: delete_crate ( & mut conn, & storage, & config, name) )
103+ if let Err ( err) = delete:: delete_crate ( & mut conn, & storage, & config, name) . await
105104 {
106105 warn ! ( "{:?}" , err) ;
107106 }
@@ -111,7 +110,9 @@ where
111110 diff:: Difference :: CrateNotInDb ( name, versions) => {
112111 for version in versions {
113112 if !dry_run {
114- if let Err ( err) = build_queue. add_crate ( name, version, BUILD_PRIORITY , None )
113+ if let Err ( err) = build_queue
114+ . add_crate ( name, version, BUILD_PRIORITY , None )
115+ . await
115116 {
116117 warn ! ( "{:?}" , err) ;
117118 }
@@ -121,25 +122,28 @@ where
121122 }
122123 diff:: Difference :: ReleaseNotInIndex ( name, version) => {
123124 if !dry_run {
124- if let Err ( err) = runtime . block_on ( delete :: delete_version (
125- & mut conn, & storage, & config, name, version,
126- ) ) {
125+ if let Err ( err) =
126+ delete :: delete_version ( & mut conn, & storage, & config, name, version) . await
127+ {
127128 warn ! ( "{:?}" , err) ;
128129 }
129130 }
130131 result. releases_deleted += 1 ;
131132 }
132133 diff:: Difference :: ReleaseNotInDb ( name, version) => {
133134 if !dry_run {
134- if let Err ( err) = build_queue. add_crate ( name, version, BUILD_PRIORITY , None ) {
135+ if let Err ( err) = build_queue
136+ . add_crate ( name, version, BUILD_PRIORITY , None )
137+ . await
138+ {
135139 warn ! ( "{:?}" , err) ;
136140 }
137141 }
138142 result. builds_queued += 1 ;
139143 }
140144 diff:: Difference :: ReleaseYank ( name, version, yanked) => {
141145 if !dry_run {
142- if let Err ( err) = build_queue. set_yanked ( name, version, * yanked) {
146+ if let Err ( err) = build_queue. set_yanked ( name, version, * yanked) . await {
143147 warn ! ( "{:?}" , err) ;
144148 }
145149 }
@@ -155,57 +159,55 @@ where
155159mod tests {
156160 use super :: diff:: Difference ;
157161 use super :: * ;
158- use crate :: test:: { wrapper , TestEnvironment } ;
162+ use crate :: test:: { async_wrapper , TestEnvironment } ;
159163 use sqlx:: Row as _;
160164
161- fn count ( env : & TestEnvironment , sql : & str ) -> Result < i64 > {
162- Ok ( env. runtime ( ) . block_on ( async {
163- let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
164- sqlx:: query_scalar ( sql) . fetch_one ( & mut * conn) . await
165- } ) ?)
165+ async fn count ( env : & TestEnvironment , sql : & str ) -> Result < i64 > {
166+ let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
167+ Ok ( sqlx:: query_scalar ( sql) . fetch_one ( & mut * conn) . await ?)
166168 }
167169
168- fn single_row < O > ( env : & TestEnvironment , sql : & str ) -> Result < Vec < O > >
170+ async fn single_row < O > ( env : & TestEnvironment , sql : & str ) -> Result < Vec < O > >
169171 where
170172 O : Send + Unpin + for < ' r > sqlx:: Decode < ' r , sqlx:: Postgres > + sqlx:: Type < sqlx:: Postgres > ,
171173 {
172- env. runtime ( ) . block_on ( async {
173- let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
174- Ok :: < _ , anyhow:: Error > (
175- sqlx:: query ( sql)
176- . fetch_all ( & mut * conn)
177- . await ?
178- . into_iter ( )
179- . map ( |row| row. get ( 0 ) )
180- . collect ( ) ,
181- )
182- } )
174+ let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
175+ Ok :: < _ , anyhow:: Error > (
176+ sqlx:: query ( sql)
177+ . fetch_all ( & mut * conn)
178+ . await ?
179+ . into_iter ( )
180+ . map ( |row| row. get ( 0 ) )
181+ . collect ( ) ,
182+ )
183183 }
184184
185185 #[ test]
186186 fn test_delete_crate ( ) {
187- wrapper ( |env| {
188- env. fake_release ( )
187+ async_wrapper ( |env| async move {
188+ env. async_fake_release ( )
189+ . await
189190 . name ( "krate" )
190191 . version ( "0.1.1" )
191192 . version ( "0.1.2" )
192- . create ( ) ?;
193+ . create_async ( )
194+ . await ?;
193195
194196 let diff = [ Difference :: CrateNotInIndex ( "krate" . into ( ) ) ] ;
195197
196198 // calling with dry-run leads to no change
197- handle_diff ( env, diff. iter ( ) , true ) ?;
199+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
198200
199201 assert_eq ! (
200- count( env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) ?,
202+ count( & env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) . await ?,
201203 1
202204 ) ;
203205
204206 // without dry-run the crate will be deleted
205- handle_diff ( env, diff. iter ( ) , false ) ?;
207+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
206208
207209 assert_eq ! (
208- count( env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) ?,
210+ count( & env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) . await ?,
209211 0
210212 ) ;
211213
@@ -215,25 +217,35 @@ mod tests {
215217
216218 #[ test]
217219 fn test_delete_release ( ) {
218- wrapper ( |env| {
219- env. fake_release ( ) . name ( "krate" ) . version ( "0.1.1" ) . create ( ) ?;
220- env. fake_release ( ) . name ( "krate" ) . version ( "0.1.2" ) . create ( ) ?;
220+ async_wrapper ( |env| async move {
221+ env. async_fake_release ( )
222+ . await
223+ . name ( "krate" )
224+ . version ( "0.1.1" )
225+ . create_async ( )
226+ . await ?;
227+ env. async_fake_release ( )
228+ . await
229+ . name ( "krate" )
230+ . version ( "0.1.2" )
231+ . create_async ( )
232+ . await ?;
221233
222234 let diff = [ Difference :: ReleaseNotInIndex (
223235 "krate" . into ( ) ,
224236 "0.1.1" . into ( ) ,
225237 ) ] ;
226238
227- assert_eq ! ( count( env, "SELECT count(*) FROM releases" ) ?, 2 ) ;
239+ assert_eq ! ( count( & env, "SELECT count(*) FROM releases" ) . await ?, 2 ) ;
228240
229- handle_diff ( env, diff. iter ( ) , true ) ?;
241+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
230242
231- assert_eq ! ( count( env, "SELECT count(*) FROM releases" ) ?, 2 ) ;
243+ assert_eq ! ( count( & env, "SELECT count(*) FROM releases" ) . await ?, 2 ) ;
232244
233- handle_diff ( env, diff. iter ( ) , false ) ?;
245+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
234246
235247 assert_eq ! (
236- single_row:: <String >( env, "SELECT version FROM releases" ) ?,
248+ single_row:: <String >( & env, "SELECT version FROM releases" ) . await ?,
237249 vec![ "0.1.2" ]
238250 ) ;
239251
@@ -243,30 +255,32 @@ mod tests {
243255
244256 #[ test]
245257 fn test_wrong_yank ( ) {
246- wrapper ( |env| {
247- env. fake_release ( )
258+ async_wrapper ( |env| async move {
259+ env. async_fake_release ( )
260+ . await
248261 . name ( "krate" )
249262 . version ( "0.1.1" )
250263 . yanked ( true )
251- . create ( ) ?;
264+ . create_async ( )
265+ . await ?;
252266
253267 let diff = [ Difference :: ReleaseYank (
254268 "krate" . into ( ) ,
255269 "0.1.1" . into ( ) ,
256270 false ,
257271 ) ] ;
258272
259- handle_diff ( env, diff. iter ( ) , true ) ?;
273+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
260274
261275 assert_eq ! (
262- single_row:: <bool >( env, "SELECT yanked FROM releases" ) ?,
276+ single_row:: <bool >( & env, "SELECT yanked FROM releases" ) . await ?,
263277 vec![ true ]
264278 ) ;
265279
266- handle_diff ( env, diff. iter ( ) , false ) ?;
280+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
267281
268282 assert_eq ! (
269- single_row:: <bool >( env, "SELECT yanked FROM releases" ) ?,
283+ single_row:: <bool >( & env, "SELECT yanked FROM releases" ) . await ?,
270284 vec![ false ]
271285 ) ;
272286
@@ -276,20 +290,21 @@ mod tests {
276290
277291 #[ test]
278292 fn test_missing_release_in_db ( ) {
279- wrapper ( |env| {
293+ async_wrapper ( |env| async move {
280294 let diff = [ Difference :: ReleaseNotInDb ( "krate" . into ( ) , "0.1.1" . into ( ) ) ] ;
281295
282- handle_diff ( env, diff. iter ( ) , true ) ?;
296+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
283297
284- let build_queue = env. build_queue ( ) ;
298+ let build_queue = env. async_build_queue ( ) . await ;
285299
286- assert ! ( build_queue. queued_crates( ) ?. is_empty( ) ) ;
300+ assert ! ( build_queue. queued_crates( ) . await ?. is_empty( ) ) ;
287301
288- handle_diff ( env, diff. iter ( ) , false ) ?;
302+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
289303
290304 assert_eq ! (
291305 build_queue
292- . queued_crates( ) ?
306+ . queued_crates( )
307+ . await ?
293308 . iter( )
294309 . map( |c| ( c. name. as_str( ) , c. version. as_str( ) , c. priority) )
295310 . collect:: <Vec <_>>( ) ,
@@ -301,23 +316,24 @@ mod tests {
301316
302317 #[ test]
303318 fn test_missing_crate_in_db ( ) {
304- wrapper ( |env| {
319+ async_wrapper ( |env| async move {
305320 let diff = [ Difference :: CrateNotInDb (
306321 "krate" . into ( ) ,
307322 vec ! [ "0.1.1" . into( ) , "0.1.2" . into( ) ] ,
308323 ) ] ;
309324
310- handle_diff ( env, diff. iter ( ) , true ) ?;
325+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
311326
312- let build_queue = env. build_queue ( ) ;
327+ let build_queue = env. async_build_queue ( ) . await ;
313328
314- assert ! ( build_queue. queued_crates( ) ?. is_empty( ) ) ;
329+ assert ! ( build_queue. queued_crates( ) . await ?. is_empty( ) ) ;
315330
316- handle_diff ( env, diff. iter ( ) , false ) ?;
331+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
317332
318333 assert_eq ! (
319334 build_queue
320- . queued_crates( ) ?
335+ . queued_crates( )
336+ . await ?
321337 . iter( )
322338 . map( |c| ( c. name. as_str( ) , c. version. as_str( ) , c. priority) )
323339 . collect:: <Vec <_>>( ) ,
0 commit comments