@@ -717,7 +717,7 @@ pub async fn handle_self_profile(
717
717
}
718
718
719
719
struct Server {
720
- data : Arc < RwLock < Arc < InputData > > > ,
720
+ data : Arc < RwLock < Option < Arc < InputData > > > > ,
721
721
updating : UpdatingStatus ,
722
722
}
723
723
@@ -781,6 +781,7 @@ impl Server {
781
781
check_http_method ! ( * req. method( ) , http:: Method :: GET ) ;
782
782
let data = self . data . clone ( ) ;
783
783
let data = data. read ( ) ;
784
+ let data = data. as_ref ( ) . unwrap ( ) ;
784
785
let result = handler ( & data) ;
785
786
Ok ( http:: Response :: builder ( )
786
787
. header_typed ( ContentType :: json ( ) )
@@ -794,6 +795,7 @@ impl Server {
794
795
. get ( Authorization :: < headers:: authorization:: Bearer > :: name ( ) )
795
796
{
796
797
let data = self . data . read ( ) ;
798
+ let data = data. as_ref ( ) . unwrap ( ) ;
797
799
let auth = Authorization :: < headers:: authorization:: Bearer > :: decode (
798
800
& mut Some ( auth) . into_iter ( ) ,
799
801
)
@@ -831,6 +833,9 @@ impl Server {
831
833
832
834
git:: update_repo ( & repo_path) . unwrap ( ) ;
833
835
836
+ // Erase old data
837
+ * rwlock. write ( ) = None ;
838
+
834
839
info ! ( "updating from filesystem..." ) ;
835
840
let new_data = Arc :: new ( InputData :: from_fs ( & repo_path) . unwrap ( ) ) ;
836
841
debug ! ( "last date = {:?}" , new_data. last_date) ;
@@ -839,7 +844,7 @@ impl Server {
839
844
let mut data = rwlock. write ( ) ;
840
845
841
846
// Write the new data back into the request
842
- * data = new_data;
847
+ * data = Some ( new_data) ;
843
848
844
849
std:: mem:: drop ( updating) ;
845
850
} ) ;
@@ -860,6 +865,10 @@ impl fmt::Display for ServerError {
860
865
impl std:: error:: Error for ServerError { }
861
866
862
867
async fn serve_req ( ctx : Arc < Server > , req : Request ) -> Result < Response , ServerError > {
868
+ if ctx. data . read ( ) . is_none ( ) {
869
+ return Ok ( Response :: new ( hyper:: Body :: from ( "no data yet, please wait" ) ) ) ;
870
+ }
871
+
863
872
let fs_path = format ! (
864
873
"site/static{}" ,
865
874
if req. uri( ) . path( ) == "" || req. uri( ) . path( ) == "/" {
@@ -897,7 +906,7 @@ async fn serve_req(ctx: Arc<Server>, req: Request) -> Result<Response, ServerErr
897
906
let ( req, body_stream) = req. into_parts ( ) ;
898
907
let p = req. uri . path ( ) ;
899
908
check_http_method ! ( req. method, http:: Method :: POST ) ;
900
- let data: Arc < InputData > = ctx. data . read ( ) . clone ( ) ;
909
+ let data: Arc < InputData > = ctx. data . read ( ) . as_ref ( ) . unwrap ( ) . clone ( ) ;
901
910
let mut c = body_stream. compat ( ) ;
902
911
let mut body = Vec :: new ( ) ;
903
912
while let Some ( chunk) = c. next ( ) . await {
@@ -1038,9 +1047,9 @@ where
1038
1047
}
1039
1048
}
1040
1049
1041
- async fn run_server ( data : InputData , addr : SocketAddr ) {
1050
+ async fn run_server ( data : Arc < RwLock < Option < Arc < InputData > > > > , addr : SocketAddr ) {
1042
1051
let ctx = Arc :: new ( Server {
1043
- data : Arc :: new ( RwLock :: new ( Arc :: new ( data ) ) ) ,
1052
+ data,
1044
1053
updating : UpdatingStatus :: new ( ) ,
1045
1054
} ) ;
1046
1055
let server = hyper:: Server :: bind ( & addr) . serve ( move || {
@@ -1063,7 +1072,7 @@ async fn run_server(data: InputData, addr: SocketAddr) {
1063
1072
}
1064
1073
}
1065
1074
1066
- pub fn start ( data : InputData , port : u16 ) {
1075
+ pub fn start ( data : Arc < RwLock < Option < Arc < InputData > > > > , port : u16 ) {
1067
1076
let mut server_address: SocketAddr = "0.0.0.0:2346" . parse ( ) . unwrap ( ) ;
1068
1077
server_address. set_port ( port) ;
1069
1078
hyper:: rt:: run (
0 commit comments