@@ -27,7 +27,7 @@ use databend_common_meta_api::util::txn_put_pb;
27
27
use databend_common_meta_api:: SchemaApi ;
28
28
use databend_common_meta_app:: principal:: task;
29
29
use databend_common_meta_app:: principal:: task:: TaskMessage ;
30
- use databend_common_meta_app:: principal:: task:: TaskState ;
30
+ use databend_common_meta_app:: principal:: task:: TaskStateValue ;
31
31
use databend_common_meta_app:: principal:: task_dependent_ident:: TaskDependentIdent ;
32
32
use databend_common_meta_app:: principal:: task_message_ident:: TaskMessageIdent ;
33
33
use databend_common_meta_app:: principal:: task_state_ident:: TaskStateIdent ;
@@ -47,6 +47,7 @@ use databend_common_meta_types::TxnOp;
47
47
use databend_common_meta_types:: TxnRequest ;
48
48
use databend_common_meta_types:: With ;
49
49
use databend_common_proto_conv:: FromToProto ;
50
+ use futures:: StreamExt ;
50
51
use futures:: TryStreamExt ;
51
52
use prost:: Message ;
52
53
use seq_marked:: SeqValue ;
@@ -266,37 +267,38 @@ impl TaskMgr {
266
267
task_name : & str ,
267
268
new_afters : & [ String ] ,
268
269
) -> Result < Result < ( ) , TaskError > , TaskApiError > {
269
- let mut update_ops = Vec :: new ( ) ;
270
- let mut check_ops = Vec :: with_capacity ( new_afters. len ( ) ) ;
271
-
270
+ let mut request = TxnRequest :: new ( vec ! [ ] , vec ! [ ] ) ;
272
271
let after_dependent_ident = TaskDependentIdent :: new_after ( & self . tenant , task_name) ;
273
272
274
273
let after_seq_deps = self . kv_api . get_pb ( & after_dependent_ident) . await ?;
275
- check_ops . push ( txn_cond_eq_seq (
274
+ request . condition . push ( txn_cond_eq_seq (
276
275
& after_dependent_ident,
277
276
after_seq_deps. seq ( ) ,
278
277
) ) ;
279
278
280
279
let mut after_deps = after_seq_deps. unwrap_or_default ( ) ;
281
280
after_deps. 0 . extend ( new_afters. iter ( ) . cloned ( ) ) ;
282
- update_ops. push ( txn_put_pb ( & after_dependent_ident, & after_deps) ?) ;
281
+ request
282
+ . if_then
283
+ . push ( txn_put_pb ( & after_dependent_ident, & after_deps) ?) ;
283
284
284
285
let before_dependent_idents = new_afters
285
286
. iter ( )
286
287
. map ( |after| TaskDependentIdent :: new_before ( & self . tenant , after) ) ;
287
288
for ( before_dependent_ident, before_seq_deps) in
288
289
self . kv_api . get_pb_vec ( before_dependent_idents) . await ?
289
290
{
290
- check_ops . push ( txn_cond_eq_seq (
291
+ request . condition . push ( txn_cond_eq_seq (
291
292
& before_dependent_ident,
292
293
before_seq_deps. seq ( ) ,
293
294
) ) ;
294
295
295
296
let mut deps = before_seq_deps. unwrap_or_default ( ) ;
296
297
deps. 0 . insert ( task_name. to_string ( ) ) ;
297
- update_ops. push ( txn_put_pb ( & before_dependent_ident, & deps) ?) ;
298
+ request
299
+ . if_then
300
+ . push ( txn_put_pb ( & before_dependent_ident, & deps) ?) ;
298
301
}
299
- let request = TxnRequest :: new ( check_ops, update_ops) ;
300
302
let reply = self . kv_api . transaction ( request) . await ?;
301
303
302
304
if !reply. success {
@@ -316,12 +318,11 @@ impl TaskMgr {
316
318
task_name : & str ,
317
319
remove_afters : & [ String ] ,
318
320
) -> Result < Result < ( ) , TaskError > , TaskApiError > {
319
- let mut update_ops = Vec :: new ( ) ;
320
- let mut check_ops = Vec :: with_capacity ( remove_afters. len ( ) ) ;
321
+ let mut request = TxnRequest :: new ( vec ! [ ] , vec ! [ ] ) ;
321
322
322
323
let after_dependent_ident = TaskDependentIdent :: new_after ( & self . tenant , task_name) ;
323
324
let after_seq_deps = self . kv_api . get_pb ( & after_dependent_ident) . await ?;
324
- check_ops . push ( txn_cond_eq_seq (
325
+ request . condition . push ( txn_cond_eq_seq (
325
326
& after_dependent_ident,
326
327
after_seq_deps. seq ( ) ,
327
328
) ) ;
@@ -330,7 +331,9 @@ impl TaskMgr {
330
331
for remove_after in remove_afters {
331
332
deps. 0 . remove ( remove_after) ;
332
333
}
333
- update_ops. push ( txn_put_pb ( & after_dependent_ident, & deps) ?) ;
334
+ request
335
+ . if_then
336
+ . push ( txn_put_pb ( & after_dependent_ident, & deps) ?) ;
334
337
}
335
338
336
339
let before_dependent_idents = remove_afters
@@ -339,17 +342,18 @@ impl TaskMgr {
339
342
for ( before_dependent_ident, before_seq_deps) in
340
343
self . kv_api . get_pb_vec ( before_dependent_idents) . await ?
341
344
{
342
- check_ops . push ( txn_cond_eq_seq (
345
+ request . condition . push ( txn_cond_eq_seq (
343
346
& before_dependent_ident,
344
347
before_seq_deps. seq ( ) ,
345
348
) ) ;
346
349
347
350
if let Some ( mut deps) = before_seq_deps {
348
351
deps. 0 . remove ( task_name) ;
349
- update_ops. push ( txn_put_pb ( & before_dependent_ident, & deps) ?) ;
352
+ request
353
+ . if_then
354
+ . push ( txn_put_pb ( & before_dependent_ident, & deps) ?) ;
350
355
}
351
356
}
352
- let request = TxnRequest :: new ( check_ops, update_ops) ;
353
357
let reply = self . kv_api . transaction ( request) . await ?;
354
358
355
359
if !reply. success {
@@ -369,8 +373,7 @@ impl TaskMgr {
369
373
& self ,
370
374
task_name : & str ,
371
375
) -> Result < Result < ( ) , TaskError > , TaskApiError > {
372
- let mut check_ops = Vec :: new ( ) ;
373
- let mut update_ops = Vec :: new ( ) ;
376
+ let mut request = TxnRequest :: new ( vec ! [ ] , vec ! [ ] ) ;
374
377
375
378
let task_after_ident = TaskDependentIdent :: new_after ( & self . tenant , task_name) ;
376
379
let task_before_ident = TaskDependentIdent :: new_before ( & self . tenant , task_name) ;
@@ -387,24 +390,33 @@ impl TaskMgr {
387
390
} ) ) ;
388
391
}
389
392
for ( target_ident, seq_dep) in self . kv_api . get_pb_vec ( target_idents) . await ? {
390
- check_ops. push ( txn_cond_eq_seq ( & target_ident, seq_dep. seq ( ) ) ) ;
393
+ request
394
+ . condition
395
+ . push ( txn_cond_eq_seq ( & target_ident, seq_dep. seq ( ) ) ) ;
391
396
392
397
if let Some ( mut deps) = seq_dep {
393
398
deps. 0 . remove ( task_name) ;
394
- update_ops . push ( txn_put_pb ( & target_ident, & deps) ?) ;
399
+ request . if_then . push ( txn_put_pb ( & target_ident, & deps) ?) ;
395
400
}
396
401
}
397
- update_ops . push ( TxnOp :: delete (
402
+ request . if_then . push ( TxnOp :: delete (
398
403
TaskDependentIdent :: new_before ( & self . tenant , task_name) . to_string_key ( ) ,
399
404
) ) ;
400
- update_ops . push ( TxnOp :: delete (
405
+ request . if_then . push ( TxnOp :: delete (
401
406
TaskDependentIdent :: new_after ( & self . tenant , task_name) . to_string_key ( ) ,
402
407
) ) ;
403
- update_ops. push ( TxnOp :: delete (
404
- TaskStateIdent :: new ( & self . tenant , task_name) . to_string_key ( ) ,
405
- ) ) ;
408
+ let mut stream = self
409
+ . kv_api
410
+ . list_pb_keys ( & DirName :: new ( TaskStateIdent :: new (
411
+ & self . tenant ,
412
+ task_name,
413
+ "" ,
414
+ ) ) )
415
+ . await ?;
406
416
407
- let request = TxnRequest :: new ( check_ops, update_ops) ;
417
+ while let Some ( result) = stream. next ( ) . await {
418
+ request. if_then . push ( TxnOp :: delete ( result?. to_string_key ( ) ) )
419
+ }
408
420
let _ = self . kv_api . transaction ( request) . await ?;
409
421
410
422
Ok ( Ok ( ( ) ) )
@@ -439,9 +451,8 @@ impl TaskMgr {
439
451
task_name : & str ,
440
452
) -> Result < Result < Vec < String > , TaskError > , TaskApiError > {
441
453
let task_before_ident = TaskDependentIdent :: new_before ( & self . tenant , task_name) ;
442
- let task_state_key = TaskStateIdent :: new ( & self . tenant , task_name) ;
443
- let succeeded_value = TaskState { is_succeeded : true } ;
444
- let not_succeeded_value = TaskState {
454
+ let succeeded_value = TaskStateValue { is_succeeded : true } ;
455
+ let not_succeeded_value = TaskStateValue {
445
456
is_succeeded : false ,
446
457
} ;
447
458
@@ -460,13 +471,19 @@ impl TaskMgr {
460
471
let Some ( target_after_dependent) = target_after_dependent else {
461
472
continue ;
462
473
} ;
463
- let mut request = TxnRequest :: new ( vec ! [ ] , vec ! [ ] )
464
- . with_else ( vec ! [ txn_put_pb( & task_state_key, & succeeded_value) ?] ) ;
465
-
466
- for target_after_task in target_after_dependent. 0 . iter ( ) {
467
- let task_ident = TaskStateIdent :: new ( & self . tenant , target_after_task) ;
474
+ let target_after = & target_after_ident. name ( ) . source ;
475
+ let this_task_to_target_state =
476
+ TaskStateIdent :: new ( & self . tenant , task_name, target_after) ;
477
+ let mut request = TxnRequest :: new ( vec ! [ ] , vec ! [ ] ) . with_else ( vec ! [ txn_put_pb(
478
+ & this_task_to_target_state,
479
+ & succeeded_value,
480
+ ) ?] ) ;
481
+
482
+ for before_target_after in target_after_dependent. 0 . iter ( ) {
483
+ let task_ident =
484
+ TaskStateIdent :: new ( & self . tenant , before_target_after, target_after) ;
468
485
// Only care about the predecessors of this task's successor tasks, excluding this task itself.
469
- if target_after_task != task_name {
486
+ if before_target_after != task_name {
470
487
request. condition . push ( TxnCondition :: eq_value (
471
488
task_ident. to_string_key ( ) ,
472
489
succeeded_value. to_pb ( ) ?. encode_to_vec ( ) ,
@@ -485,15 +502,6 @@ impl TaskMgr {
485
502
Ok ( Ok ( ready_tasks) )
486
503
}
487
504
488
- #[ async_backtrace:: framed]
489
- #[ fastrace:: trace]
490
- pub async fn clean_task_state ( & self , task_name : & str ) -> Result < ( ) , TaskApiError > {
491
- let key = TaskStateIdent :: new ( & self . tenant , task_name) ;
492
- let req = UpsertPB :: delete ( key) . with ( MatchSeq :: GE ( 1 ) ) ;
493
- let _ = self . kv_api . upsert_pb ( & req) . await ?;
494
- Ok ( ( ) )
495
- }
496
-
497
505
async fn create_task_inner (
498
506
& self ,
499
507
task : Task ,
0 commit comments