@@ -5,8 +5,11 @@ use scorpio::fuse::MegaFuse;
55use scorpio:: manager:: { fetch:: CheckHash , ScorpioManager } ;
66use scorpio:: server:: mount_filesystem;
77use scorpio:: util:: config;
8+ use std:: net:: SocketAddr ;
89use std:: { ffi:: OsStr , sync:: Arc } ;
10+ #[ cfg( not( unix) ) ]
911use tokio:: signal;
12+ use tokio:: sync:: oneshot;
1013
1114/// Command line arguments for the application
1215#[ derive( Parser , Debug ) ]
@@ -15,6 +18,10 @@ struct Args {
1518 /// Path to the configuration file
1619 #[ arg( short, long, default_value = "scorpio.toml" ) ]
1720 config_path : String ,
21+
22+ /// HTTP bind address for the daemon (Antares API lives under /antares/*)
23+ #[ arg( long, default_value = "0.0.0.0:2725" ) ]
24+ http_addr : SocketAddr ,
1825}
1926
2027#[ tokio:: main]
@@ -44,19 +51,61 @@ async fn main() {
4451 let lgfs = LoggingFileSystem :: new ( fuse_interface. clone ( ) ) ;
4552 let mut mount_handle = mount_filesystem ( lgfs, mountpoint) . await ;
4653
47- let handle = & mut mount_handle ;
54+ print ! ( "server running..." ) ;
4855
49- // spawn the server running function.
50- tokio:: spawn ( daemon_main ( Arc :: new ( fuse_interface) , manager) ) ;
56+ let ( shutdown_tx, shutdown_rx) = oneshot:: channel :: < ( ) > ( ) ;
57+ let mut daemon_task = tokio:: spawn ( daemon_main (
58+ Arc :: new ( fuse_interface) ,
59+ manager,
60+ shutdown_rx,
61+ args. http_addr ,
62+ ) ) ;
5163
52- print ! ( "server running..." ) ;
64+ let mut mount_finished = false ;
5365 tokio:: select! {
54- res = handle => res. unwrap( ) ,
55- _ = signal:: ctrl_c( ) => {
66+ res = & mut mount_handle => {
67+ mount_finished = true ;
68+ if let Err ( e) = res {
69+ eprintln!( "FUSE session ended with error: {e:?}" ) ;
70+ }
71+ }
72+ _ = shutdown_signal( ) => {
73+ // fallthrough to shutdown sequence below
74+ }
75+ }
5676
57- println!( "unmount...." ) ;
58- mount_handle. unmount( ) . await . unwrap( ) ;
77+ // Stop HTTP server first (this triggers Antares shutdown cleanup), then unmount the main workspace FS.
78+ let _ = shutdown_tx. send ( ( ) ) ;
79+ match tokio:: time:: timeout ( std:: time:: Duration :: from_secs ( 20 ) , & mut daemon_task) . await {
80+ Ok ( Ok ( _) ) => { }
81+ Ok ( Err ( e) ) => eprintln ! ( "HTTP daemon task join failed: {e}" ) ,
82+ Err ( _) => {
83+ eprintln ! ( "HTTP daemon shutdown timed out; aborting task" ) ;
84+ daemon_task. abort ( ) ;
85+ }
86+ }
87+
88+ if !mount_finished {
89+ println ! ( "unmount...." ) ;
90+ let _ = mount_handle. unmount ( ) . await ;
91+ }
92+ }
5993
94+ async fn shutdown_signal ( ) {
95+ #[ cfg( unix) ]
96+ {
97+ let mut sigterm = tokio:: signal:: unix:: signal ( tokio:: signal:: unix:: SignalKind :: terminate ( ) )
98+ . expect ( "failed to install SIGTERM handler" ) ;
99+ let mut sigint = tokio:: signal:: unix:: signal ( tokio:: signal:: unix:: SignalKind :: interrupt ( ) )
100+ . expect ( "failed to install SIGINT handler" ) ;
101+ tokio:: select! {
102+ _ = sigterm. recv( ) => { }
103+ _ = sigint. recv( ) => { }
60104 }
61105 }
106+
107+ #[ cfg( not( unix) ) ]
108+ {
109+ let _ = signal:: ctrl_c ( ) . await ;
110+ }
62111}
0 commit comments