@@ -35,76 +35,60 @@ use crate::metrics::network_metrics;
35
35
use crate :: metrics:: server_metrics;
36
36
37
37
pub type WatcherId = i64 ;
38
- pub type WatcherStreamSender = Sender < Result < WatchResponse , Status > > ;
39
38
40
- type CreateWatcherEvent = ( WatchRequest , WatcherStreamSender ) ;
39
+ /// A sender for dispatcher to send event to interested watchers.
40
+ pub type WatcherSender = Sender < Result < WatchResponse , Status > > ;
41
41
42
+ /// A sender for event source, such as raft state machine, to send event to [`EventDispatcher`].
42
43
#[ derive( Clone , Debug ) ]
43
- pub struct WatcherStateMachineSubscriber {
44
- event_tx : mpsc:: UnboundedSender < WatcherEvent > ,
45
- }
44
+ pub ( crate ) struct DispatcherSender ( pub ( crate ) mpsc:: UnboundedSender < WatchEvent > ) ;
46
45
47
46
#[ derive( Clone ) ]
48
- pub enum WatcherEvent {
49
- CreateWatcherEvent ( CreateWatcherEvent ) ,
50
- StateMachineKvDataEvent ( Change < Vec < u8 > , String > ) ,
51
- }
52
-
53
- #[ derive( Debug ) ]
54
- pub struct WatcherManager {
55
- event_tx : mpsc:: UnboundedSender < WatcherEvent > ,
56
-
57
- pub subscriber : WatcherStateMachineSubscriber ,
47
+ pub enum WatchEvent {
48
+ AddWatcher ( ( WatchRequest , WatcherSender ) ) ,
49
+ KVChange ( Change < Vec < u8 > , String > ) ,
58
50
}
59
51
60
- struct WatcherManagerCore {
61
- event_rx : mpsc:: UnboundedReceiver < WatcherEvent > ,
52
+ /// Receives events from event sources, dispatches them to interested watchers.
53
+ pub ( crate ) struct EventDispatcher {
54
+ event_rx : mpsc:: UnboundedReceiver < WatchEvent > ,
62
55
63
56
/// map range to WatcherId
64
57
watcher_range_map : RangeMap < String , WatcherId , WatcherStream > ,
65
58
66
59
current_watcher_id : WatcherId ,
67
60
}
68
61
69
- impl WatcherManager {
70
- pub fn create ( ) -> Self {
62
+ impl EventDispatcher {
63
+ /// Spawn a dispatcher loop task.
64
+ pub ( crate ) fn spawn ( ) -> mpsc:: UnboundedSender < WatchEvent > {
71
65
let ( event_tx, event_rx) = mpsc:: unbounded_channel ( ) ;
72
66
73
- let core = WatcherManagerCore {
67
+ let dispatcher = EventDispatcher {
74
68
event_rx,
75
69
watcher_range_map : RangeMap :: new ( ) ,
76
70
current_watcher_id : 1 ,
77
71
} ;
78
72
79
- let _h = tokio:: spawn ( core . watcher_manager_main ( ) ) ;
73
+ let _h = tokio:: spawn ( dispatcher . main ( ) ) ;
80
74
81
- WatcherManager {
82
- event_tx : event_tx. clone ( ) ,
83
- subscriber : WatcherStateMachineSubscriber { event_tx } ,
84
- }
85
- }
86
-
87
- pub fn create_watcher_stream ( & self , request : WatchRequest , tx : WatcherStreamSender ) {
88
- let create: CreateWatcherEvent = ( request, tx) ;
89
- let _ = self . event_tx . send ( WatcherEvent :: CreateWatcherEvent ( create) ) ;
75
+ event_tx
90
76
}
91
- }
92
77
93
- impl WatcherManagerCore {
94
78
#[ tracing:: instrument( level = "trace" , skip( self ) ) ]
95
- async fn watcher_manager_main ( mut self ) {
79
+ async fn main ( mut self ) {
96
80
loop {
97
81
if let Some ( event) = self . event_rx . recv ( ) . await {
98
82
match event {
99
- WatcherEvent :: CreateWatcherEvent ( ( req, tx) ) => {
100
- self . create_watcher_stream ( req, tx) . await ;
83
+ WatchEvent :: AddWatcher ( ( req, tx) ) => {
84
+ self . add_watcher ( req, tx) . await ;
101
85
}
102
- WatcherEvent :: StateMachineKvDataEvent ( kv_change) => {
103
- self . notify_event ( kv_change) . await ;
86
+ WatchEvent :: KVChange ( kv_change) => {
87
+ self . dispatch_event ( kv_change) . await ;
104
88
}
105
89
}
106
90
} else {
107
- info ! ( "watcher manager has been shutdown " ) ;
91
+ info ! ( "all event senders are closed. quit. " ) ;
108
92
break ;
109
93
}
110
94
}
@@ -117,7 +101,8 @@ impl WatcherManagerCore {
117
101
server_metrics:: incr_watchers ( -1 ) ;
118
102
}
119
103
120
- async fn notify_event ( & mut self , change : Change < Vec < u8 > , String > ) {
104
+ /// Dispatch a kv change event to interested watchers.
105
+ async fn dispatch_event ( & mut self , change : Change < Vec < u8 > , String > ) {
121
106
let k = change. ident . as_ref ( ) . unwrap ( ) ;
122
107
let set = self . watcher_range_map . get_by_point ( k) ;
123
108
if set. is_empty ( ) {
@@ -165,23 +150,24 @@ impl WatcherManagerCore {
165
150
} ;
166
151
}
167
152
153
+ // TODO: when a watcher stream is dropped, send a event to remove the watcher explicitly
168
154
for range_key in remove_range_keys {
169
155
self . close_stream ( range_key) ;
170
156
}
171
157
}
172
158
173
159
#[ tracing:: instrument( level = "debug" , skip( self ) ) ]
174
- pub async fn create_watcher_stream ( & mut self , create : WatchRequest , tx : WatcherStreamSender ) {
160
+ pub async fn add_watcher ( & mut self , create : WatchRequest , tx : WatcherSender ) {
175
161
info ! ( "create_watcher_stream: {:?}" , create) ;
176
162
177
- let range = match WatcherManagerCore :: get_range_key ( create. key . clone ( ) , & create. key_end ) {
163
+ let range = match EventDispatcher :: get_range_key ( create. key . clone ( ) , & create. key_end ) {
178
164
Ok ( range) => range,
179
165
Err ( _) => return ,
180
166
} ;
181
167
182
168
self . current_watcher_id += 1 ;
183
169
let watcher_id = self . current_watcher_id ;
184
- let filter = create. filter_type ( ) ;
170
+ let filter: FilterType = create. filter_type ( ) ;
185
171
186
172
let watcher_stream = WatcherStream :: new (
187
173
watcher_id,
@@ -210,10 +196,8 @@ impl WatcherManagerCore {
210
196
}
211
197
}
212
198
213
- impl StateMachineSubscriber for WatcherStateMachineSubscriber {
199
+ impl StateMachineSubscriber for DispatcherSender {
214
200
fn kv_changed ( & self , change : Change < Vec < u8 > , String > ) {
215
- let _ = self
216
- . event_tx
217
- . send ( WatcherEvent :: StateMachineKvDataEvent ( change) ) ;
201
+ let _ = self . 0 . send ( WatchEvent :: KVChange ( change) ) ;
218
202
}
219
203
}
0 commit comments