1
- use crate :: { db:: delete, Context } ;
1
+ use crate :: { db:: delete, utils :: spawn_blocking , Context } ;
2
2
use anyhow:: { Context as _, Result } ;
3
3
use itertools:: Itertools ;
4
4
use tracing:: { info, warn} ;
@@ -24,24 +24,25 @@ const BUILD_PRIORITY: i32 = 15;
24
24
///
25
25
/// Even when activities fail, the command can just be re-run. While the diff calculation will
26
26
/// 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 < ( ) > {
28
28
let index = ctx. index ( ) ?;
29
29
30
30
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
37
34
. context ( "Loading crate data from database for consistency check" ) ?;
38
35
39
36
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" ) ?;
42
43
43
44
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 ?;
45
46
46
47
println ! ( "============" ) ;
47
48
println ! ( "SUMMARY" ) ;
@@ -79,29 +80,27 @@ struct HandleResult {
79
80
yanks_corrected : u32 ,
80
81
}
81
82
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 >
83
84
where
84
85
I : Iterator < Item = & ' a diff:: Difference > ,
85
86
C : Context ,
86
87
{
87
88
let mut result = HandleResult :: default ( ) ;
88
89
89
90
let config = ctx. config ( ) ?;
90
- let runtime = ctx. runtime ( ) ?;
91
91
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 ?;
94
94
95
- let mut conn = runtime . block_on ( ctx. pool ( ) ?. get_async ( ) ) ?;
95
+ let mut conn = ctx. async_pool ( ) . await ?. get_async ( ) . await ?;
96
96
97
97
for difference in iter {
98
98
println ! ( "{difference}" ) ;
99
99
100
100
match difference {
101
101
diff:: Difference :: CrateNotInIndex ( name) => {
102
102
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
105
104
{
106
105
warn ! ( "{:?}" , err) ;
107
106
}
@@ -111,7 +110,9 @@ where
111
110
diff:: Difference :: CrateNotInDb ( name, versions) => {
112
111
for version in versions {
113
112
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
115
116
{
116
117
warn ! ( "{:?}" , err) ;
117
118
}
@@ -121,25 +122,28 @@ where
121
122
}
122
123
diff:: Difference :: ReleaseNotInIndex ( name, version) => {
123
124
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
+ {
127
128
warn ! ( "{:?}" , err) ;
128
129
}
129
130
}
130
131
result. releases_deleted += 1 ;
131
132
}
132
133
diff:: Difference :: ReleaseNotInDb ( name, version) => {
133
134
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
+ {
135
139
warn ! ( "{:?}" , err) ;
136
140
}
137
141
}
138
142
result. builds_queued += 1 ;
139
143
}
140
144
diff:: Difference :: ReleaseYank ( name, version, yanked) => {
141
145
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 {
143
147
warn ! ( "{:?}" , err) ;
144
148
}
145
149
}
@@ -155,57 +159,55 @@ where
155
159
mod tests {
156
160
use super :: diff:: Difference ;
157
161
use super :: * ;
158
- use crate :: test:: { wrapper , TestEnvironment } ;
162
+ use crate :: test:: { async_wrapper , TestEnvironment } ;
159
163
use sqlx:: Row as _;
160
164
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 ?)
166
168
}
167
169
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 > >
169
171
where
170
172
O : Send + Unpin + for < ' r > sqlx:: Decode < ' r , sqlx:: Postgres > + sqlx:: Type < sqlx:: Postgres > ,
171
173
{
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
+ )
183
183
}
184
184
185
185
#[ test]
186
186
fn test_delete_crate ( ) {
187
- wrapper ( |env| {
188
- env. fake_release ( )
187
+ async_wrapper ( |env| async move {
188
+ env. async_fake_release ( )
189
+ . await
189
190
. name ( "krate" )
190
191
. version ( "0.1.1" )
191
192
. version ( "0.1.2" )
192
- . create ( ) ?;
193
+ . create_async ( )
194
+ . await ?;
193
195
194
196
let diff = [ Difference :: CrateNotInIndex ( "krate" . into ( ) ) ] ;
195
197
196
198
// calling with dry-run leads to no change
197
- handle_diff ( env, diff. iter ( ) , true ) ?;
199
+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
198
200
199
201
assert_eq ! (
200
- count( env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) ?,
202
+ count( & env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) . await ?,
201
203
1
202
204
) ;
203
205
204
206
// without dry-run the crate will be deleted
205
- handle_diff ( env, diff. iter ( ) , false ) ?;
207
+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
206
208
207
209
assert_eq ! (
208
- count( env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) ?,
210
+ count( & env, "SELECT count(*) FROM crates WHERE name = 'krate'" ) . await ?,
209
211
0
210
212
) ;
211
213
@@ -215,25 +217,35 @@ mod tests {
215
217
216
218
#[ test]
217
219
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 ?;
221
233
222
234
let diff = [ Difference :: ReleaseNotInIndex (
223
235
"krate" . into ( ) ,
224
236
"0.1.1" . into ( ) ,
225
237
) ] ;
226
238
227
- assert_eq ! ( count( env, "SELECT count(*) FROM releases" ) ?, 2 ) ;
239
+ assert_eq ! ( count( & env, "SELECT count(*) FROM releases" ) . await ?, 2 ) ;
228
240
229
- handle_diff ( env, diff. iter ( ) , true ) ?;
241
+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
230
242
231
- assert_eq ! ( count( env, "SELECT count(*) FROM releases" ) ?, 2 ) ;
243
+ assert_eq ! ( count( & env, "SELECT count(*) FROM releases" ) . await ?, 2 ) ;
232
244
233
- handle_diff ( env, diff. iter ( ) , false ) ?;
245
+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
234
246
235
247
assert_eq ! (
236
- single_row:: <String >( env, "SELECT version FROM releases" ) ?,
248
+ single_row:: <String >( & env, "SELECT version FROM releases" ) . await ?,
237
249
vec![ "0.1.2" ]
238
250
) ;
239
251
@@ -243,30 +255,32 @@ mod tests {
243
255
244
256
#[ test]
245
257
fn test_wrong_yank ( ) {
246
- wrapper ( |env| {
247
- env. fake_release ( )
258
+ async_wrapper ( |env| async move {
259
+ env. async_fake_release ( )
260
+ . await
248
261
. name ( "krate" )
249
262
. version ( "0.1.1" )
250
263
. yanked ( true )
251
- . create ( ) ?;
264
+ . create_async ( )
265
+ . await ?;
252
266
253
267
let diff = [ Difference :: ReleaseYank (
254
268
"krate" . into ( ) ,
255
269
"0.1.1" . into ( ) ,
256
270
false ,
257
271
) ] ;
258
272
259
- handle_diff ( env, diff. iter ( ) , true ) ?;
273
+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
260
274
261
275
assert_eq ! (
262
- single_row:: <bool >( env, "SELECT yanked FROM releases" ) ?,
276
+ single_row:: <bool >( & env, "SELECT yanked FROM releases" ) . await ?,
263
277
vec![ true ]
264
278
) ;
265
279
266
- handle_diff ( env, diff. iter ( ) , false ) ?;
280
+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
267
281
268
282
assert_eq ! (
269
- single_row:: <bool >( env, "SELECT yanked FROM releases" ) ?,
283
+ single_row:: <bool >( & env, "SELECT yanked FROM releases" ) . await ?,
270
284
vec![ false ]
271
285
) ;
272
286
@@ -276,20 +290,21 @@ mod tests {
276
290
277
291
#[ test]
278
292
fn test_missing_release_in_db ( ) {
279
- wrapper ( |env| {
293
+ async_wrapper ( |env| async move {
280
294
let diff = [ Difference :: ReleaseNotInDb ( "krate" . into ( ) , "0.1.1" . into ( ) ) ] ;
281
295
282
- handle_diff ( env, diff. iter ( ) , true ) ?;
296
+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
283
297
284
- let build_queue = env. build_queue ( ) ;
298
+ let build_queue = env. async_build_queue ( ) . await ;
285
299
286
- assert ! ( build_queue. queued_crates( ) ?. is_empty( ) ) ;
300
+ assert ! ( build_queue. queued_crates( ) . await ?. is_empty( ) ) ;
287
301
288
- handle_diff ( env, diff. iter ( ) , false ) ?;
302
+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
289
303
290
304
assert_eq ! (
291
305
build_queue
292
- . queued_crates( ) ?
306
+ . queued_crates( )
307
+ . await ?
293
308
. iter( )
294
309
. map( |c| ( c. name. as_str( ) , c. version. as_str( ) , c. priority) )
295
310
. collect:: <Vec <_>>( ) ,
@@ -301,23 +316,24 @@ mod tests {
301
316
302
317
#[ test]
303
318
fn test_missing_crate_in_db ( ) {
304
- wrapper ( |env| {
319
+ async_wrapper ( |env| async move {
305
320
let diff = [ Difference :: CrateNotInDb (
306
321
"krate" . into ( ) ,
307
322
vec ! [ "0.1.1" . into( ) , "0.1.2" . into( ) ] ,
308
323
) ] ;
309
324
310
- handle_diff ( env, diff. iter ( ) , true ) ?;
325
+ handle_diff ( & * env, diff. iter ( ) , true ) . await ?;
311
326
312
- let build_queue = env. build_queue ( ) ;
327
+ let build_queue = env. async_build_queue ( ) . await ;
313
328
314
- assert ! ( build_queue. queued_crates( ) ?. is_empty( ) ) ;
329
+ assert ! ( build_queue. queued_crates( ) . await ?. is_empty( ) ) ;
315
330
316
- handle_diff ( env, diff. iter ( ) , false ) ?;
331
+ handle_diff ( & * env, diff. iter ( ) , false ) . await ?;
317
332
318
333
assert_eq ! (
319
334
build_queue
320
- . queued_crates( ) ?
335
+ . queued_crates( )
336
+ . await ?
321
337
. iter( )
322
338
. map( |c| ( c. name. as_str( ) , c. version. as_str( ) , c. priority) )
323
339
. collect:: <Vec <_>>( ) ,
0 commit comments