Skip to content

Commit 67c986a

Browse files
authored
separate enable_activities into remote and local for task types (#1066)
* separate enable_activities into enable_local and enable_remote * lint
1 parent 695172f commit 67c986a

File tree

16 files changed

+299
-143
lines changed

16 files changed

+299
-143
lines changed

crates/client/src/raw.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1870,7 +1870,8 @@ mod tests {
18701870
.expect_worker_task_types()
18711871
.return_const(WorkerTaskTypes {
18721872
enable_workflows: true,
1873-
enable_activities: true,
1873+
enable_local_activities: true,
1874+
enable_remote_activities: true,
18741875
enable_nexus: true,
18751876
});
18761877

crates/client/src/worker_registry/mod.rs

Lines changed: 73 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,20 @@ impl ClientWorkerSetImpl {
149149
.map(|opts| opts.version.build_id);
150150
let task_types = worker.worker_task_types();
151151

152-
if !task_types.enable_workflows && !task_types.enable_activities && !task_types.enable_nexus
152+
if !task_types.enable_workflows
153+
&& !task_types.enable_local_activities
154+
&& !task_types.enable_remote_activities
155+
&& !task_types.enable_nexus
153156
{
154157
bail!(
155158
"Worker must have at least one capability enabled (workflows, activities, or nexus)"
156159
);
157160
}
158161

162+
if !task_types.enable_workflows && task_types.enable_local_activities {
163+
bail!("Local activities cannot be enabled without workflows")
164+
}
165+
159166
if !skip_client_worker_set_check
160167
&& let Some(existing_workers) = self.slot_providers.get(&slot_key)
161168
{
@@ -442,7 +449,8 @@ mod tests {
442449
.expect_worker_task_types()
443450
.return_const(WorkerTaskTypes {
444451
enable_workflows: true,
445-
enable_activities: true,
452+
enable_local_activities: true,
453+
enable_remote_activities: true,
446454
enable_nexus: true,
447455
});
448456
mock_provider
@@ -486,7 +494,8 @@ mod tests {
486494
.expect_worker_task_types()
487495
.return_const(WorkerTaskTypes {
488496
enable_workflows: true,
489-
enable_activities: true,
497+
enable_local_activities: true,
498+
enable_remote_activities: true,
490499
enable_nexus: true,
491500
});
492501

@@ -523,7 +532,8 @@ mod tests {
523532
.expect_worker_task_types()
524533
.return_const(WorkerTaskTypes {
525534
enable_workflows: true,
526-
enable_activities: true,
535+
enable_local_activities: true,
536+
enable_remote_activities: true,
527537
enable_nexus: true,
528538
});
529539

@@ -584,7 +594,8 @@ mod tests {
584594
.expect_worker_task_types()
585595
.return_const(WorkerTaskTypes {
586596
enable_workflows: true,
587-
enable_activities: true,
597+
enable_local_activities: true,
598+
enable_remote_activities: true,
588599
enable_nexus: true,
589600
});
590601

@@ -611,7 +622,8 @@ mod tests {
611622
.expect_worker_task_types()
612623
.return_const(WorkerTaskTypes {
613624
enable_workflows: true,
614-
enable_activities: true,
625+
enable_local_activities: true,
626+
enable_remote_activities: true,
615627
enable_nexus: true,
616628
});
617629

@@ -776,7 +788,8 @@ mod tests {
776788
.expect_worker_task_types()
777789
.return_const(WorkerTaskTypes {
778790
enable_workflows: true,
779-
enable_activities: true,
791+
enable_local_activities: true,
792+
enable_remote_activities: true,
780793
enable_nexus: true,
781794
});
782795

@@ -1063,7 +1076,8 @@ mod tests {
10631076
.expect_worker_task_types()
10641077
.return_const(WorkerTaskTypes {
10651078
enable_workflows: true,
1066-
enable_activities: false,
1079+
enable_local_activities: false,
1080+
enable_remote_activities: false,
10671081
enable_nexus: true,
10681082
});
10691083

@@ -1087,7 +1101,8 @@ mod tests {
10871101
.expect_worker_task_types()
10881102
.return_const(WorkerTaskTypes {
10891103
enable_workflows: false,
1090-
enable_activities: true,
1104+
enable_local_activities: false,
1105+
enable_remote_activities: true,
10911106
enable_nexus: false,
10921107
});
10931108
activity_worker.expect_try_reserve_wft_slot().times(0); // Should not be called for activity-only worker
@@ -1121,7 +1136,8 @@ mod tests {
11211136
.expect_worker_task_types()
11221137
.return_const(WorkerTaskTypes {
11231138
enable_workflows: true,
1124-
enable_activities: true,
1139+
enable_local_activities: true,
1140+
enable_remote_activities: true,
11251141
enable_nexus: false,
11261142
});
11271143

@@ -1138,7 +1154,8 @@ mod tests {
11381154
.expect_worker_task_types()
11391155
.return_const(WorkerTaskTypes {
11401156
enable_workflows: true,
1141-
enable_activities: true,
1157+
enable_local_activities: true,
1158+
enable_remote_activities: true,
11421159
enable_nexus: false,
11431160
});
11441161

@@ -1168,7 +1185,8 @@ mod tests {
11681185
.expect_worker_task_types()
11691186
.return_const(WorkerTaskTypes {
11701187
enable_workflows: false,
1171-
enable_activities: true,
1188+
enable_local_activities: false,
1189+
enable_remote_activities: true,
11721190
enable_nexus: false,
11731191
});
11741192

@@ -1208,7 +1226,8 @@ mod tests {
12081226
.expect_worker_task_types()
12091227
.return_const(WorkerTaskTypes {
12101228
enable_workflows: false,
1211-
enable_activities: true,
1229+
enable_local_activities: false,
1230+
enable_remote_activities: true,
12121231
enable_nexus: false,
12131232
});
12141233

@@ -1228,7 +1247,8 @@ mod tests {
12281247
.expect_worker_task_types()
12291248
.return_const(WorkerTaskTypes {
12301249
enable_workflows: false,
1231-
enable_activities: false,
1250+
enable_local_activities: false,
1251+
enable_remote_activities: false,
12321252
enable_nexus: true,
12331253
});
12341254

@@ -1266,7 +1286,8 @@ mod tests {
12661286
.expect_worker_task_types()
12671287
.return_const(WorkerTaskTypes {
12681288
enable_workflows: true,
1269-
enable_activities: false,
1289+
enable_local_activities: true,
1290+
enable_remote_activities: false,
12701291
enable_nexus: false,
12711292
});
12721293
workflow_worker
@@ -1286,9 +1307,10 @@ mod tests {
12861307
}
12871308

12881309
#[test]
1289-
fn worker_with_no_capabilities_rejected() {
1310+
fn worker_invalid_type_config_rejected() {
12901311
let manager = ClientWorkerSet::new();
12911312

1313+
// no types enabled
12921314
let mut worker = MockClientWorker::new();
12931315
worker
12941316
.expect_namespace()
@@ -1305,7 +1327,8 @@ mod tests {
13051327
.expect_worker_task_types()
13061328
.return_const(WorkerTaskTypes {
13071329
enable_workflows: false,
1308-
enable_activities: false,
1330+
enable_local_activities: false,
1331+
enable_remote_activities: false,
13091332
enable_nexus: false,
13101333
});
13111334

@@ -1317,6 +1340,35 @@ mod tests {
13171340
.to_string()
13181341
.contains("must have at least one capability enabled")
13191342
);
1343+
1344+
// local activities enabled without workflows
1345+
let mut worker = MockClientWorker::new();
1346+
worker
1347+
.expect_namespace()
1348+
.return_const("test_namespace".to_string());
1349+
worker
1350+
.expect_task_queue()
1351+
.return_const("test_queue".to_string());
1352+
worker.expect_deployment_options().return_const(None);
1353+
worker
1354+
.expect_worker_instance_key()
1355+
.return_const(Uuid::new_v4());
1356+
worker.expect_heartbeat_enabled().return_const(false);
1357+
worker
1358+
.expect_worker_task_types()
1359+
.return_const(WorkerTaskTypes {
1360+
enable_workflows: false,
1361+
enable_local_activities: true,
1362+
enable_remote_activities: true,
1363+
enable_nexus: false,
1364+
});
1365+
1366+
let result = manager.register_worker(Arc::new(worker), false);
1367+
assert!(result.is_err());
1368+
assert_eq!(
1369+
result.unwrap_err().to_string(),
1370+
"Local activities cannot be enabled without workflows".to_string()
1371+
);
13201372
}
13211373

13221374
#[test]
@@ -1347,7 +1399,8 @@ mod tests {
13471399
.expect_worker_task_types()
13481400
.return_const(WorkerTaskTypes {
13491401
enable_workflows: true,
1350-
enable_activities: false,
1402+
enable_local_activities: true,
1403+
enable_remote_activities: false,
13511404
enable_nexus: false,
13521405
});
13531406
workflow_worker
@@ -1376,7 +1429,8 @@ mod tests {
13761429
.expect_worker_task_types()
13771430
.return_const(WorkerTaskTypes {
13781431
enable_workflows: false,
1379-
enable_activities: true,
1432+
enable_local_activities: false,
1433+
enable_remote_activities: true,
13801434
enable_nexus: false,
13811435
});
13821436

crates/common/src/worker.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,26 @@ use std::{
2222
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
2323
pub struct WorkerTaskTypes {
2424
pub enable_workflows: bool,
25-
pub enable_activities: bool,
25+
pub enable_local_activities: bool,
26+
pub enable_remote_activities: bool,
2627
pub enable_nexus: bool,
2728
}
2829

2930
impl WorkerTaskTypes {
3031
/// Check if no task types are enabled
3132
pub fn is_empty(&self) -> bool {
32-
!self.enable_workflows && !self.enable_activities && !self.enable_nexus
33+
!self.enable_workflows
34+
&& !self.enable_local_activities
35+
&& !self.enable_remote_activities
36+
&& !self.enable_nexus
3337
}
3438

3539
/// Create a config with all task types enabled
3640
pub fn all() -> WorkerTaskTypes {
3741
WorkerTaskTypes {
3842
enable_workflows: true,
39-
enable_activities: true,
43+
enable_local_activities: true,
44+
enable_remote_activities: true,
4045
enable_nexus: true,
4146
}
4247
}
@@ -45,7 +50,8 @@ impl WorkerTaskTypes {
4550
pub fn workflow_only() -> WorkerTaskTypes {
4651
WorkerTaskTypes {
4752
enable_workflows: true,
48-
enable_activities: false,
53+
enable_local_activities: false,
54+
enable_remote_activities: false,
4955
enable_nexus: false,
5056
}
5157
}
@@ -54,7 +60,8 @@ impl WorkerTaskTypes {
5460
pub fn activity_only() -> WorkerTaskTypes {
5561
WorkerTaskTypes {
5662
enable_workflows: false,
57-
enable_activities: true,
63+
enable_local_activities: false,
64+
enable_remote_activities: true,
5865
enable_nexus: false,
5966
}
6067
}
@@ -63,14 +70,16 @@ impl WorkerTaskTypes {
6370
pub fn nexus_only() -> WorkerTaskTypes {
6471
WorkerTaskTypes {
6572
enable_workflows: false,
66-
enable_activities: false,
73+
enable_local_activities: false,
74+
enable_remote_activities: false,
6775
enable_nexus: true,
6876
}
6977
}
7078

7179
pub fn overlaps_with(&self, other: &WorkerTaskTypes) -> bool {
7280
(self.enable_workflows && other.enable_workflows)
73-
|| (self.enable_activities && other.enable_activities)
81+
|| (self.enable_local_activities && other.enable_local_activities)
82+
|| (self.enable_remote_activities && other.enable_remote_activities)
7483
|| (self.enable_nexus && other.enable_nexus)
7584
}
7685
}
@@ -285,6 +294,9 @@ impl WorkerConfigBuilder {
285294
if task_types.is_empty() {
286295
return Err("At least one task type must be enabled in `task_types`".to_owned());
287296
}
297+
if !task_types.enable_workflows && task_types.enable_local_activities {
298+
return Err("`task_types` cannot enable local activities without workflows".to_owned());
299+
}
288300

289301
if let Some(b) = self.workflow_task_poller_behavior.as_ref() {
290302
b.validate()?

0 commit comments

Comments
 (0)