1
1
use std:: cmp:: Reverse ;
2
2
use std:: collections:: { HashMap , VecDeque } ;
3
3
4
- use tokio:: sync:: mpsc;
5
-
6
4
use super :: job:: { IndexedRequest , Job , JobResult } ;
7
5
use super :: StoreSegmentRequest ;
8
6
use libsql_sys:: name:: NamespaceName ;
@@ -32,16 +30,14 @@ impl<C, F> Default for NamespaceRequests<C, F> {
32
30
/// It is generic over C: the storage config type (for config overrides), and T, the segment type
33
31
pub ( crate ) struct Scheduler < C , T > {
34
32
/// notify new durability index for namespace
35
- durable_notifier : mpsc:: Sender < ( NamespaceName , u64 ) > ,
36
33
requests : HashMap < NamespaceName , NamespaceRequests < C , T > > ,
37
34
queue : priority_queue:: PriorityQueue < NamespaceName , Reverse < u64 > > ,
38
35
next_request_id : u64 ,
39
36
}
40
37
41
38
impl < C , T > Scheduler < C , T > {
42
- pub fn new ( durable_notifier : mpsc :: Sender < ( NamespaceName , u64 ) > ) -> Self {
39
+ pub fn new ( ) -> Self {
43
40
Self {
44
- durable_notifier,
45
41
requests : Default :: default ( ) ,
46
42
queue : Default :: default ( ) ,
47
43
next_request_id : Default :: default ( ) ,
@@ -108,14 +104,6 @@ impl<C, T> Scheduler<C, T> {
108
104
Ok ( durable_index) => {
109
105
tracing:: debug!( "job success registered" ) ;
110
106
( result. job . request . request . on_store_callback ) ( durable_index) . await ;
111
- if self
112
- . durable_notifier
113
- . send ( ( name. clone ( ) , durable_index) )
114
- . await
115
- . is_err ( )
116
- {
117
- tracing:: warn!( "durability notifier was closed, proceeding anyway" ) ;
118
- }
119
107
}
120
108
Err ( e) => {
121
109
tracing:: error!( "error processing request, re-enqueuing: {e}" ) ;
@@ -154,6 +142,7 @@ mod test {
154
142
use std:: future:: ready;
155
143
156
144
use chrono:: Utc ;
145
+ use tokio:: sync:: oneshot;
157
146
158
147
use crate :: storage:: Error ;
159
148
use libsql_sys:: name:: NamespaceName ;
@@ -162,29 +151,34 @@ mod test {
162
151
163
152
#[ tokio:: test]
164
153
async fn schedule_simple ( ) {
165
- let ( sender, mut receiver) = tokio:: sync:: mpsc:: channel ( 10 ) ;
166
- let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( sender) ;
154
+ let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( ) ;
167
155
168
156
let ns1 = NamespaceName :: from ( "test1" ) ;
169
157
let ns2 = NamespaceName :: from ( "test2" ) ;
170
158
159
+ let ( job_1_snd, job_1_rcv) = oneshot:: channel ( ) ;
171
160
scheduler. register (
172
161
StoreSegmentRequest {
173
162
namespace : ns1. clone ( ) ,
174
163
segment : ( ) ,
175
164
created_at : Utc :: now ( ) ,
176
165
storage_config_override : None ,
177
- on_store_callback : Box :: new ( |_| Box :: pin ( ready ( ( ) ) ) ) ,
166
+ on_store_callback : Box :: new ( move |n| Box :: pin ( async move {
167
+ let _ = job_1_snd. send ( n) ;
168
+ } ) ) ,
178
169
} ,
179
170
) ;
180
171
172
+ let ( job_2_snd, job_2_rcv) = oneshot:: channel ( ) ;
181
173
scheduler. register (
182
174
StoreSegmentRequest {
183
175
namespace : ns2. clone ( ) ,
184
176
segment : ( ) ,
185
177
created_at : Utc :: now ( ) ,
186
178
storage_config_override : None ,
187
- on_store_callback : Box :: new ( |_| Box :: pin ( ready ( ( ) ) ) ) ,
179
+ on_store_callback : Box :: new ( move |n| Box :: pin ( async move {
180
+ let _ = job_2_snd. send ( n) ;
181
+ } ) ) ,
188
182
} ,
189
183
) ;
190
184
@@ -194,7 +188,7 @@ mod test {
194
188
segment : ( ) ,
195
189
created_at : Utc :: now ( ) ,
196
190
storage_config_override : None ,
197
- on_store_callback : Box :: new ( |_| Box :: pin ( ready ( ( ) ) ) ) ,
191
+ on_store_callback : Box :: new ( move |_| Box :: pin ( ready ( ( ) ) ) ) ,
198
192
} ,
199
193
) ;
200
194
@@ -215,15 +209,15 @@ mod test {
215
209
. await ;
216
210
217
211
assert ! ( scheduler. schedule( ) . is_none( ) ) ;
218
- assert_eq ! ( receiver . recv ( ) . await . unwrap( ) , ( ns2 . clone ( ) , 42 ) ) ;
212
+ assert_eq ! ( job_2_rcv . await . unwrap( ) , 42 ) ;
219
213
220
214
scheduler
221
215
. report ( JobResult {
222
216
job : job1,
223
217
result : Ok ( 10 ) ,
224
218
} )
225
219
. await ;
226
- assert_eq ! ( receiver . recv ( ) . await . unwrap( ) , ( ns1 . clone ( ) , 10 ) ) ;
220
+ assert_eq ! ( job_1_rcv . await . unwrap( ) , 10 ) ;
227
221
228
222
let job1 = scheduler. schedule ( ) . unwrap ( ) ;
229
223
assert_eq ! ( job1. request. request. namespace, ns1) ;
@@ -232,8 +226,7 @@ mod test {
232
226
233
227
#[ tokio:: test]
234
228
async fn job_error_reschedule ( ) {
235
- let ( sender, _) = tokio:: sync:: mpsc:: channel ( 10 ) ;
236
- let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( sender) ;
229
+ let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( ) ;
237
230
238
231
let ns1 = NamespaceName :: from ( "test1" ) ;
239
232
let ns2 = NamespaceName :: from ( "test2" ) ;
@@ -275,8 +268,7 @@ mod test {
275
268
276
269
#[ tokio:: test]
277
270
async fn schedule_while_in_flight ( ) {
278
- let ( sender, _) = tokio:: sync:: mpsc:: channel ( 10 ) ;
279
- let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( sender) ;
271
+ let mut scheduler = Scheduler :: < ( ) , ( ) > :: new ( ) ;
280
272
281
273
let ns1 = NamespaceName :: from ( "test1" ) ;
282
274
0 commit comments