2020-04-17 14:11:25 +02:00
use anyhow ::{ bail , Error } ;
2019-04-11 08:26:52 +02:00
#[ macro_use ]
extern crate proxmox_backup ;
extern crate tokio ;
extern crate nix ;
2020-01-22 10:08:40 +01:00
use proxmox ::try_block ;
2019-08-05 10:04:12 +02:00
2019-04-11 08:26:52 +02:00
use proxmox_backup ::server ;
use proxmox_backup ::tools ;
fn garbage_collection ( worker : & server ::WorkerTask ) -> Result < ( ) , Error > {
worker . log ( " start garbage collection " ) ;
for i in 0 .. 50 {
worker . fail_on_abort ( ) ? ;
flog! ( worker , " progress {} " , i ) ;
std ::thread ::sleep ( std ::time ::Duration ::from_millis ( 10 ) ) ;
}
worker . log ( " end garbage collection " ) ;
2021-01-15 14:38:27 +01:00
Ok ( ( ) )
2019-04-11 08:26:52 +02:00
}
2019-08-21 12:27:10 +02:00
#[ test ] #[ ignore ]
2019-04-11 08:26:52 +02:00
fn worker_task_abort ( ) -> Result < ( ) , Error > {
server ::create_task_log_dirs ( ) ? ;
use std ::sync ::{ Arc , Mutex } ;
let errmsg : Arc < Mutex < Option < String > > > = Arc ::new ( Mutex ::new ( None ) ) ;
let errmsg1 = errmsg . clone ( ) ;
2020-12-04 11:53:34 +01:00
let rt = tokio ::runtime ::Runtime ::new ( ) . unwrap ( ) ;
2019-08-29 10:05:43 +02:00
rt . block_on ( async move {
2019-04-11 08:26:52 +02:00
2020-11-02 19:13:36 +01:00
let mut commando_sock = server ::CommandoSocket ::new ( server ::our_ctrl_sock ( ) ) ;
2019-04-11 08:26:52 +02:00
let init_result : Result < ( ) , Error > = try_block! ( {
2020-11-02 19:13:36 +01:00
server ::register_task_control_commands ( & mut commando_sock ) ? ;
2019-04-11 08:26:52 +02:00
server ::server_state_init ( ) ? ;
Ok ( ( ) )
} ) ;
if let Err ( err ) = init_result {
eprintln! ( " unable to start daemon - {} " , err ) ;
2019-08-29 10:05:43 +02:00
return ;
2019-04-11 08:26:52 +02:00
}
let errmsg = errmsg1 . clone ( ) ;
2020-08-06 15:46:01 +02:00
let res = server ::WorkerTask ::new_thread (
" garbage_collection " ,
None ,
2020-10-23 13:33:21 +02:00
proxmox_backup ::api2 ::types ::Authid ::root_auth_id ( ) . clone ( ) ,
2020-08-06 15:46:01 +02:00
true ,
move | worker | {
println! ( " WORKER {} " , worker ) ;
let result = garbage_collection ( & worker ) ;
tools ::request_shutdown ( ) ;
if let Err ( err ) = result {
println! ( " got expected error: {} " , err ) ;
} else {
let mut data = errmsg . lock ( ) . unwrap ( ) ;
* data = Some ( String ::from ( " thread finished - seems abort did not work as expected " ) ) ;
}
Ok ( ( ) )
} ,
) ;
2019-04-11 08:26:52 +02:00
match res {
Err ( err ) = > {
println! ( " unable to start worker - {} " , err ) ;
}
Ok ( wid ) = > {
println! ( " WORKER: {} " , wid ) ;
server ::abort_worker_async ( wid . parse ::< server ::UPID > ( ) . unwrap ( ) ) ;
}
}
2019-08-29 10:05:43 +02:00
} ) ;
2019-04-11 08:26:52 +02:00
let data = errmsg . lock ( ) . unwrap ( ) ;
match * data {
Some ( ref err ) = > bail! ( " Error: {} " , err ) ,
None = > { } ,
}
Ok ( ( ) )
}