Skip to content

Commit a8baa85

Browse files
authored
Merge pull request #5343 from taskcluster/feature/4999-azure-workers-registration-issue
Worker manager: split Azure scanner process
2 parents 94a7896 + ba15fc3 commit a8baa85

File tree

24 files changed

+367
-14
lines changed

24 files changed

+367
-14
lines changed

changelog/issue-4987.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
audience: worker-deployers
2+
level: minor
3+
reference: issue 4987
4+
---
5+
6+
Worker manager scanner split in two: non-azure providers and azure.

db/fns.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
* [`expire_worker_pool_errors`](#expire_worker_pool_errors)
147147
* [`expire_worker_pools`](#expire_worker_pools)
148148
* [`expire_workers`](#expire_workers)
149-
* [`get_non_stopped_workers_quntil`](#get_non_stopped_workers_quntil)
149+
* [`get_non_stopped_workers_quntil_providers`](#get_non_stopped_workers_quntil_providers)
150150
* [`get_worker_2`](#get_worker_2)
151151
* [`get_worker_pool_error`](#get_worker_pool_error)
152152
* [`get_worker_pool_errors_for_worker_pool`](#get_worker_pool_errors_for_worker_pool)
@@ -2359,7 +2359,7 @@ If the hashed session id does not exist, then an error code `P0002` will be thro
23592359
* [`expire_worker_pool_errors`](#expire_worker_pool_errors)
23602360
* [`expire_worker_pools`](#expire_worker_pools)
23612361
* [`expire_workers`](#expire_workers)
2362-
* [`get_non_stopped_workers_quntil`](#get_non_stopped_workers_quntil)
2362+
* [`get_non_stopped_workers_quntil_providers`](#get_non_stopped_workers_quntil_providers)
23632363
* [`get_worker_2`](#get_worker_2)
23642364
* [`get_worker_pool_error`](#get_worker_pool_error)
23652365
* [`get_worker_pool_errors_for_worker_pool`](#get_worker_pool_errors_for_worker_pool)
@@ -2493,13 +2493,15 @@ no previous_provider_ids. Returns the worker pool ids that it deletes.
24932493
Expire workers that come before `expires_in`.
24942494
Returns a count of rows that have been deleted.
24952495

2496-
### get_non_stopped_workers_quntil
2496+
### get_non_stopped_workers_quntil_providers
24972497

24982498
* *Mode*: read
24992499
* *Arguments*:
25002500
* `worker_pool_id_in text`
25012501
* `worker_group_in text`
25022502
* `worker_id_in text`
2503+
* `providers_filter_cond text`
2504+
* `providers_filter_value text`
25032505
* `page_size_in integer`
25042506
* `page_offset_in integer`
25052507
* *Returns*: `table`
@@ -2517,15 +2519,16 @@ Returns a count of rows that have been deleted.
25172519
* `secret jsonb`
25182520
* `etag uuid`
25192521
* `quarantine_until timestamptz`
2520-
* *Last defined on version*: 66
2522+
* *Last defined on version*: 71
25212523

25222524
Get non-stopped workers filtered by the optional arguments,
25232525
ordered by `worker_pool_id`, `worker_group`, and `worker_id`.
25242526
If the pagination arguments are both NULL, all rows are returned.
25252527
Otherwise, page_size rows are returned at offset `page_offset`.
25262528
The `quaratine_until` contains NULL or a date in the past if the
25272529
worker is not quarantined, otherwise the date until which it is
2528-
quaratined.
2530+
quaratined. `providers_filter_cond` and `providers_filter_value` used to
2531+
filter `=` or `<>` provider by value.
25292532

25302533
### get_worker_2
25312534

@@ -2788,6 +2791,7 @@ the return value is an empty set.
27882791

27892792
### deprecated methods
27902793

2794+
* `get_non_stopped_workers_quntil(worker_pool_id_in text, worker_group_in text, worker_id_in text, page_size_in integer, page_offset_in integer)` (compatibility guaranteed until v46.0.0)
27912795
* `get_worker_pool_with_capacity(worker_pool_id_in text)` (compatibility guaranteed until v46.0.0)
27922796
* `get_worker_pools_with_capacity(page_size_in integer, page_offset_in integer)` (compatibility guaranteed until v46.0.0)
27932797
* `update_worker_pool_with_capacity(worker_pool_id_in text, provider_id_in text, description_in text, config_in jsonb, last_modified_in timestamptz, owner_in text, email_on_error_in boolean)` (compatibility guaranteed until v46.0.0)

db/test/fns/worker_manager_test.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ suite(testing.suiteName(), function() {
584584
}
585585
});
586586

587-
const rows = await db.fns.get_non_stopped_workers_quntil(null, null, null, null, null);
587+
const rows = await db.fns.get_non_stopped_workers_quntil_providers(null, null, null, null, null, null, null);
588588

589589
assert.equal(rows.length, 6);
590590

@@ -609,6 +609,44 @@ suite(testing.suiteName(), function() {
609609
}
610610
});
611611

612+
helper.dbTest('get non-stopped workers by provider', async function(db) {
613+
const now = new Date();
614+
615+
let i = 0;
616+
for (const provider_id of ["azure", "static", "aws", "gcp"]) {
617+
await create_worker(db, {
618+
worker_id: `id${i++}`,
619+
state: 'running',
620+
provider_id,
621+
created: now,
622+
last_modified: now,
623+
last_checked: now,
624+
expires: now,
625+
});
626+
}
627+
628+
const testRuns = [
629+
{ providers_filter_cond: null, providers_filter_value: null, expected_count: 4 },
630+
{ providers_filter_cond: '=', providers_filter_value: null, expected_count: 4 }, // ignoring partial condition
631+
{ providers_filter_cond: null, providers_filter_value: 'a', expected_count: 4 }, // ignoring partial condition
632+
{ providers_filter_cond: '=', providers_filter_value: 'aws', expected_count: 1 },
633+
{ providers_filter_cond: '<>', providers_filter_value: 'aws', expected_count: 3 },
634+
{ providers_filter_cond: '=', providers_filter_value: 'aws,static', expected_count: 2 },
635+
{ providers_filter_cond: '<>', providers_filter_value: 'aws,static', expected_count: 2 },
636+
{ providers_filter_cond: '=', providers_filter_value: 'static', expected_count: 1 },
637+
{ providers_filter_cond: '<>', providers_filter_value: 'non-existent', expected_count: 4 },
638+
{ providers_filter_cond: '=', providers_filter_value: 'non-existent', expected_count: 0 },
639+
{ providers_filter_cond: '=', providers_filter_value: 'azure,static,aws,gcp', expected_count: 4 },
640+
];
641+
642+
for (const run of testRuns) {
643+
const rows = await db.fns.get_non_stopped_workers_quntil_providers(
644+
null, null, null, run.providers_filter_cond, run.providers_filter_value, null, null);
645+
646+
assert.equal(rows.length, run.expected_count);
647+
}
648+
});
649+
612650
helper.dbTest('update_worker, change to a single field', async function(db) {
613651
const etag = await create_worker(db);
614652
await db.deprecatedFns.update_worker(

db/test/versions/0071_test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const testing = require('taskcluster-lib-testing');
2+
3+
suite(testing.suiteName(), function() {
4+
// this version only updates method,
5+
// to trigger index usage, so no tests are needed
6+
});

db/versions/0071.yml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
version: 71
2+
description: add provider filter to get_non_stopped_workers_quntil
3+
migrationScript: |
4+
begin
5+
grant select on queue_workers to $db_user_prefix$_worker_manager;
6+
end
7+
downgradeScript: |
8+
begin
9+
revoke select on queue_workers from $db_user_prefix$_worker_manager;
10+
end
11+
methods:
12+
get_non_stopped_workers_quntil:
13+
deprecated: true
14+
get_non_stopped_workers_quntil_providers:
15+
description: |-
16+
Get non-stopped workers filtered by the optional arguments,
17+
ordered by `worker_pool_id`, `worker_group`, and `worker_id`.
18+
If the pagination arguments are both NULL, all rows are returned.
19+
Otherwise, page_size rows are returned at offset `page_offset`.
20+
The `quaratine_until` contains NULL or a date in the past if the
21+
worker is not quarantined, otherwise the date until which it is
22+
quaratined. `providers_filter_cond` and `providers_filter_value` used to
23+
filter `=` or `<>` provider by value.
24+
mode: read
25+
serviceName: worker_manager
26+
args: worker_pool_id_in text, worker_group_in text, worker_id_in text, providers_filter_cond text, providers_filter_value text, page_size_in integer, page_offset_in integer
27+
returns: table(worker_pool_id text, worker_group text, worker_id text, provider_id text, created timestamptz, expires timestamptz, state text, provider_data jsonb, capacity integer, last_modified timestamptz, last_checked timestamptz, secret jsonb, etag uuid, quarantine_until timestamptz)
28+
body: |-
29+
begin
30+
return query
31+
select
32+
workers.worker_pool_id,
33+
workers.worker_group,
34+
workers.worker_id,
35+
workers.provider_id,
36+
workers.created,
37+
workers.expires,
38+
workers.state,
39+
workers.provider_data,
40+
workers.capacity,
41+
workers.last_modified,
42+
workers.last_checked,
43+
workers.secret,
44+
workers.etag,
45+
queue_workers.quarantine_until
46+
from
47+
workers
48+
left join queue_workers on
49+
workers.worker_pool_id = queue_workers.task_queue_id and
50+
workers.worker_id = queue_workers.worker_id and
51+
workers.worker_group = queue_workers.worker_group
52+
where
53+
(workers.worker_pool_id = worker_pool_id_in or worker_pool_id_in is null) and
54+
(workers.worker_group = worker_group_in or worker_group_in is null) and
55+
(workers.worker_id = worker_id_in or worker_id_in is null) and
56+
(workers.state <> 'stopped') and
57+
(providers_filter_cond is null or providers_filter_value is null or
58+
case
59+
when providers_filter_cond = '='
60+
then workers.provider_id = ANY(string_to_array(providers_filter_value, ','))
61+
when providers_filter_cond = '<>'
62+
then workers.provider_id <> ALL(string_to_array(providers_filter_value, ','))
63+
end
64+
)
65+
order by worker_pool_id, worker_group, worker_id
66+
limit get_page_limit(page_size_in)
67+
offset get_page_offset(page_offset_in);
68+
end

db/versions/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,5 @@ If this invariant is violated, it must be indicated clearly in the changelog.
8080
| [0068](./0068.yml) | v43.1.0 | add queue_artifact_present |
8181
| [0069](./0069.yml) | v44.8.3 | update get_queue_artifacts_paginated with improved index usage |
8282
| [0070](./0070.yml) | v44.10.0 | add `get_worker_pool_with_capacity_and_counts_by_state`, `get_worker_pools_with_capacity_and_counts_by_state`, and `update_worker_pool_with_capacity_and_counts_by_state` functions to get worker counts and capacity by state for worker pools |
83+
| [0071](./0071.yml) | (pending release) | add provider filter to get_non_stopped_workers_quntil |
8384
<!-- AUTOGENERATED DO NOT EDIT - END -->

dev-docs/dev-config-example.yml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

entrypoint

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ web-server/write-docs) exec node services/web-server/src/main.js writeDocs;;
5353
worker-manager/web) exec node services/worker-manager/src/main.js server;;
5454
worker-manager/provisioner) exec node services/worker-manager/src/main.js runProvisioner;;
5555
worker-manager/workerscanner) exec node services/worker-manager/src/main.js workerScanner;;
56+
worker-manager/workerscanner-azure) exec node services/worker-manager/src/main.js workerScannerAzure;;
5657
worker-manager/expire-workers) exec node services/worker-manager/src/main.js expireWorkers;;
5758
worker-manager/expire-worker-pools) exec node services/worker-manager/src/main.js expireWorkerPools;;
5859
worker-manager/expire-errors) exec node services/worker-manager/src/main.js expireErrors;;

generated/db-schema.json

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

generated/references.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)