1
- use notify:: { PollWatcher , RecursiveMode , Watcher } ;
1
+ use notify:: { Event , PollWatcher , RecursiveMode , Watcher } ;
2
2
use regex:: Regex ;
3
3
use serde:: { Deserialize , Deserializer } ;
4
4
use serde_json:: Value ;
5
5
use std:: { error:: Error , fs, sync:: Arc , time:: Duration } ;
6
+ use tokio:: runtime:: { Handle , Runtime } ;
6
7
use tracing:: { error, info, instrument, warn} ;
7
8
8
9
use crate :: State ;
@@ -53,13 +54,22 @@ pub fn start(state: Arc<State>) {
53
54
return ;
54
55
}
55
56
56
- let ( tx, rx) = std :: sync:: mpsc:: channel ( ) ;
57
+ let ( tx, mut rx) = tokio :: sync:: mpsc:: channel :: < Event > ( 1 ) ;
57
58
58
59
let watcher_config = notify:: Config :: default ( )
59
60
. with_compare_contents ( true )
60
61
. with_poll_interval ( state. config . proxy_tiers_poll_interval ) ;
61
62
62
- let watcher_result = PollWatcher :: new ( tx, watcher_config) ;
63
+ let watcher_result = PollWatcher :: new (
64
+ move |res| {
65
+ if let Ok ( event) = res {
66
+ runtime_handle ( )
67
+ . block_on ( async { tx. send ( event) . await } )
68
+ . unwrap ( ) ;
69
+ }
70
+ } ,
71
+ watcher_config,
72
+ ) ;
63
73
if let Err ( err) = watcher_result {
64
74
error ! ( error = err. to_string( ) , "error to watcher tier" ) ;
65
75
return ;
@@ -73,17 +83,15 @@ pub fn start(state: Arc<State>) {
73
83
return ;
74
84
}
75
85
76
- for result in rx {
77
- match result {
78
- Ok ( _event) => {
79
- if let Err ( err) = update_tiers ( state. clone ( ) ) . await {
80
- error ! ( error = err. to_string( ) , "error to update tiers" ) ;
81
- continue ;
82
- }
83
-
84
- info ! ( "tiers modified" ) ;
86
+ loop {
87
+ let result = rx. recv ( ) . await ;
88
+ if result. is_some ( ) {
89
+ if let Err ( err) = update_tiers ( state. clone ( ) ) . await {
90
+ error ! ( error = err. to_string( ) , "error to update tiers" ) ;
91
+ continue ;
85
92
}
86
- Err ( err) => error ! ( error = err. to_string( ) , "watch error" ) ,
93
+
94
+ info ! ( "tiers modified" ) ;
87
95
}
88
96
}
89
97
} ) ;
@@ -110,3 +118,13 @@ async fn update_tiers(state: Arc<State>) -> Result<(), Box<dyn Error>> {
110
118
111
119
Ok ( ( ) )
112
120
}
121
+
122
+ fn runtime_handle ( ) -> Handle {
123
+ match Handle :: try_current ( ) {
124
+ Ok ( h) => h,
125
+ Err ( _) => {
126
+ let rt = Runtime :: new ( ) . unwrap ( ) ;
127
+ rt. handle ( ) . clone ( )
128
+ }
129
+ }
130
+ }
0 commit comments