@@ -15,7 +15,6 @@ use core::ops::Range;
15
15
16
16
use common_base:: base:: tokio;
17
17
use common_base:: base:: tokio:: sync:: mpsc;
18
- use common_base:: base:: tokio:: sync:: mpsc:: Sender ;
19
18
use common_base:: base:: tokio:: sync:: oneshot;
20
19
use common_base:: rangemap:: RangeMap ;
21
20
use common_base:: rangemap:: RangeMapKey ;
@@ -31,23 +30,22 @@ use tonic::Status;
31
30
use tracing:: info;
32
31
use tracing:: warn;
33
32
34
- use super :: WatcherStream ;
33
+ use super :: WatchStreamHandle ;
35
34
use crate :: metrics:: network_metrics;
36
35
use crate :: metrics:: server_metrics;
36
+ use crate :: watcher:: Watcher ;
37
37
38
38
pub type WatcherId = i64 ;
39
39
40
40
/// A sender for dispatcher to send event to interested watchers.
41
- pub type WatcherSender = Sender < Result < WatchResponse , Status > > ;
41
+ pub type WatcherSender = mpsc :: Sender < Result < WatchResponse , Status > > ;
42
42
43
43
/// A sender for event source, such as raft state machine, to send event to [`EventDispatcher`].
44
44
#[ derive( Clone , Debug ) ]
45
45
pub ( crate ) struct DispatcherSender ( pub ( crate ) mpsc:: UnboundedSender < WatchEvent > ) ;
46
46
47
+ /// An event sent to EventDispatcher.
47
48
pub ( crate ) enum WatchEvent {
48
- /// Inform the dispatcher to add a new watcher.
49
- AddWatcher ( ( WatchRequest , WatcherSender ) ) ,
50
-
51
49
/// Submit a kv change event to dispatcher
52
50
KVChange ( Change < Vec < u8 > , String > ) ,
53
51
@@ -59,6 +57,7 @@ pub(crate) enum WatchEvent {
59
57
} ,
60
58
}
61
59
60
+ #[ derive( Clone , Debug ) ]
62
61
pub struct EventDispatcherHandle {
63
62
/// For sending event or command to the dispatcher.
64
63
pub ( crate ) tx : mpsc:: UnboundedSender < WatchEvent > ,
@@ -94,7 +93,7 @@ pub struct EventDispatcher {
94
93
event_rx : mpsc:: UnboundedReceiver < WatchEvent > ,
95
94
96
95
/// map range to WatcherId
97
- watcher_range_map : RangeMap < String , WatcherId , WatcherStream > ,
96
+ watcher_range_map : RangeMap < String , WatcherId , WatchStreamHandle > ,
98
97
99
98
current_watcher_id : WatcherId ,
100
99
}
@@ -120,9 +119,6 @@ impl EventDispatcher {
120
119
loop {
121
120
if let Some ( event) = self . event_rx . recv ( ) . await {
122
121
match event {
123
- WatchEvent :: AddWatcher ( ( req, tx) ) => {
124
- self . add_watcher ( req, tx) . await ;
125
- }
126
122
WatchEvent :: KVChange ( kv_change) => {
127
123
self . dispatch_event ( kv_change) . await ;
128
124
}
@@ -178,57 +174,64 @@ impl EventDispatcher {
178
174
watcher_id, err
179
175
) ;
180
176
remove_range_keys. push ( RangeMapKey :: new (
181
- stream. watcher . key . clone ( ) ..stream . watcher . key_end . clone ( ) ,
177
+ stream. watcher . key_range . clone ( ) ,
182
178
watcher_id,
183
179
) ) ;
184
180
} ;
185
181
}
186
182
187
183
// TODO: when a watcher stream is dropped, send a event to remove the watcher explicitly
188
184
for range_key in remove_range_keys {
189
- self . remove_watcher ( range_key) ;
185
+ self . remove_watcher ( & range_key) ;
190
186
}
191
187
}
192
188
193
189
#[ tracing:: instrument( level = "debug" , skip( self ) ) ]
194
- pub async fn add_watcher ( & mut self , create : WatchRequest , tx : WatcherSender ) {
195
- info ! ( "create_watcher_stream: {:?}" , create) ;
196
-
197
- let range = match EventDispatcher :: get_range_key ( create. key . clone ( ) , & create. key_end ) {
190
+ pub fn add_watcher (
191
+ & mut self ,
192
+ create : WatchRequest ,
193
+ tx : WatcherSender ,
194
+ ) -> Result < Watcher , & ' static str > {
195
+ info ! ( "add_watcher: {:?}" , create) ;
196
+
197
+ let range = match EventDispatcher :: build_key_range ( create. key . clone ( ) , & create. key_end ) {
198
198
Ok ( range) => range,
199
- Err ( _ ) => return ,
199
+ Err ( e ) => return Err ( e ) ,
200
200
} ;
201
201
202
202
self . current_watcher_id += 1 ;
203
203
let watcher_id = self . current_watcher_id ;
204
204
let filter: FilterType = create. filter_type ( ) ;
205
205
206
- let watcher_stream = WatcherStream :: new (
207
- watcher_id,
208
- filter,
209
- tx,
210
- range. start . clone ( ) ,
211
- range. end . clone ( ) ,
212
- ) ;
206
+ let watcher = Watcher :: new ( watcher_id, filter, range. clone ( ) ) ;
207
+ let stream_handle = WatchStreamHandle :: new ( watcher. clone ( ) , tx) ;
213
208
214
209
self . watcher_range_map
215
- . insert ( range, watcher_id, watcher_stream ) ;
210
+ . insert ( range, watcher_id, stream_handle ) ;
216
211
217
212
server_metrics:: incr_watchers ( 1 ) ;
213
+
214
+ Ok ( watcher)
218
215
}
219
216
220
- #[ tracing:: instrument( level = "debug" , skip( self ) ) ]
221
- fn remove_watcher ( & mut self , key : RangeMapKey < String , WatcherId > ) {
222
- self . watcher_range_map . remove_by_key ( & key) ;
217
+ #[ tracing:: instrument( level = "debug" , skip_all) ]
218
+ pub fn remove_watcher ( & mut self , key : & RangeMapKey < String , WatcherId > ) {
219
+ info ! ( "remove_watcher: {:?}" , key) ;
220
+
221
+ self . watcher_range_map . remove_by_key ( key) ;
223
222
223
+ // TODO: decrease it only when the key is actually removed
224
224
server_metrics:: incr_watchers ( -1 ) ;
225
225
}
226
226
227
- fn get_range_key ( key : String , key_end : & Option < String > ) -> Result < Range < String > , bool > {
227
+ fn build_key_range (
228
+ key : String ,
229
+ key_end : & Option < String > ,
230
+ ) -> Result < Range < String > , & ' static str > {
228
231
match key_end {
229
232
Some ( key_end) => {
230
233
if & key > key_end {
231
- return Err ( false ) ;
234
+ return Err ( "empty range" ) ;
232
235
}
233
236
Ok ( key..key_end. to_string ( ) )
234
237
}
0 commit comments