@@ -68,14 +68,6 @@ impl Runner {
68
68
}
69
69
}
70
70
71
- impl Runner {
72
- #[ doc( hidden) ]
73
- /// For use in integration tests
74
- pub ( super ) fn connection_pool ( & self ) -> & DieselPool {
75
- & self . connection_pool
76
- }
77
- }
78
-
79
71
impl Runner {
80
72
/// Runs all pending jobs in the queue
81
73
///
@@ -120,20 +112,18 @@ impl Runner {
120
112
121
113
fn run_single_job ( & self , sender : SyncSender < Event > ) {
122
114
let environment = self . environment . clone ( ) ;
123
- // FIXME: https://github.com/sfackler/r2d2/pull/70
124
- let connection_pool = AssertUnwindSafe ( self . connection_pool ( ) . clone ( ) ) ;
125
- self . get_single_job ( sender, move |job| {
115
+ self . get_single_job ( sender, move |job, conn| {
126
116
let job = Job :: from_value ( & job. job_type , job. data ) ?;
127
-
128
- // Make sure to move the whole `AssertUnwindSafe`
129
- let connection_pool = connection_pool;
130
- job. perform ( & environment, & connection_pool. 0 )
117
+ job. perform ( & environment, conn)
131
118
} )
132
119
}
133
120
134
121
fn get_single_job < F > ( & self , sender : SyncSender < Event > , f : F )
135
122
where
136
- F : FnOnce ( storage:: BackgroundJob ) -> Result < ( ) , PerformError > + Send + UnwindSafe + ' static ,
123
+ F : FnOnce ( storage:: BackgroundJob , & mut PgConnection ) -> Result < ( ) , PerformError >
124
+ + Send
125
+ + UnwindSafe
126
+ + ' static ,
137
127
{
138
128
use diesel:: result:: Error :: RollbackTransaction ;
139
129
@@ -166,9 +156,18 @@ impl Runner {
166
156
} ;
167
157
let job_id = job. id ;
168
158
169
- let result = catch_unwind ( || f ( job) )
170
- . map_err ( |e| try_to_extract_panic_info ( & e) )
171
- . and_then ( |r| r) ;
159
+ let result = conn
160
+ . transaction ( |conn| {
161
+ let conn = AssertUnwindSafe ( conn) ;
162
+ catch_unwind ( || {
163
+ // Ensure the whole `AssertUnwindSafe(_)` is moved
164
+ let conn = conn;
165
+ f ( job, conn. 0 )
166
+ } )
167
+ . map_err ( |e| try_to_extract_panic_info ( & e) )
168
+ } )
169
+ // TODO: Replace with flatten() once that stabilizes
170
+ . and_then ( std:: convert:: identity) ;
172
171
173
172
match result {
174
173
Ok ( _) => storage:: delete_successful_job ( conn, job_id) ?,
@@ -269,15 +268,15 @@ mod tests {
269
268
let return_barrier = Arc :: new ( AssertUnwindSafe ( Barrier :: new ( 2 ) ) ) ;
270
269
let return_barrier2 = return_barrier. clone ( ) ;
271
270
272
- runner. get_single_job ( dummy_sender ( ) , move |job| {
271
+ runner. get_single_job ( dummy_sender ( ) , move |job, _ | {
273
272
fetch_barrier. 0 . wait ( ) ; // Tell thread 2 it can lock its job
274
273
assert_eq ! ( first_job_id, job. id) ;
275
274
return_barrier. 0 . wait ( ) ; // Wait for thread 2 to lock its job
276
275
Ok ( ( ) )
277
276
} ) ;
278
277
279
278
fetch_barrier2. 0 . wait ( ) ; // Wait until thread 1 locks its job
280
- runner. get_single_job ( dummy_sender ( ) , move |job| {
279
+ runner. get_single_job ( dummy_sender ( ) , move |job, _ | {
281
280
assert_eq ! ( second_job_id, job. id) ;
282
281
return_barrier2. 0 . wait ( ) ; // Tell thread 1 it can unlock its job
283
282
Ok ( ( ) )
@@ -293,7 +292,7 @@ mod tests {
293
292
let runner = runner ( ) ;
294
293
create_dummy_job ( & runner) ;
295
294
296
- runner. get_single_job ( dummy_sender ( ) , |_| Ok ( ( ) ) ) ;
295
+ runner. get_single_job ( dummy_sender ( ) , |_, _ | Ok ( ( ) ) ) ;
297
296
runner. wait_for_jobs ( ) . unwrap ( ) ;
298
297
299
298
let remaining_jobs = background_jobs
@@ -311,10 +310,10 @@ mod tests {
311
310
let barrier = Arc :: new ( AssertUnwindSafe ( Barrier :: new ( 2 ) ) ) ;
312
311
let barrier2 = barrier. clone ( ) ;
313
312
314
- runner. get_single_job ( dummy_sender ( ) , move |_| {
313
+ runner. get_single_job ( dummy_sender ( ) , move |_, _ | {
315
314
barrier. 0 . wait ( ) ;
316
- // error so the job goes back into the queue
317
- Err ( "nope" . into ( ) )
315
+ // The job should go back into the queue after a panic
316
+ panic ! ( ) ;
318
317
} ) ;
319
318
320
319
let conn = & mut * runner. connection ( ) . unwrap ( ) ;
@@ -350,7 +349,7 @@ mod tests {
350
349
let runner = runner ( ) ;
351
350
let job_id = create_dummy_job ( & runner) . id ;
352
351
353
- runner. get_single_job ( dummy_sender ( ) , |_| panic ! ( ) ) ;
352
+ runner. get_single_job ( dummy_sender ( ) , |_, _ | panic ! ( ) ) ;
354
353
runner. wait_for_jobs ( ) . unwrap ( ) ;
355
354
356
355
let tries = background_jobs
0 commit comments