Skip to content

Commit

Permalink
Support multiple regions for schedule_fuzz_task.py (#4525)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanmetzman authored Dec 19, 2024
1 parent 1ec0456 commit 22dc493
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
17 changes: 10 additions & 7 deletions src/clusterfuzz/_internal/cron/schedule_fuzz.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def _get_quotas(project, region):
region=region, project=project).execute()['quotas']


def get_available_cpus(project: str, region: str) -> int:
def get_available_cpus_for_region(project: str, region: str) -> int:
"""Returns the number of available CPUs in the current GCE region."""
quotas = _get_quotas(project, region)

Expand Down Expand Up @@ -181,17 +181,20 @@ def get_fuzz_tasks(available_cpus: int) -> [tasks.Task]:
return fuzz_tasks


def get_batch_regions(batch_config):
mapping = batch_config.get('mapping')
return list(set(config['gce_region'] for config in mapping.values()))


def schedule_fuzz_tasks() -> bool:
"""Schedules fuzz tasks."""
# TODO(metzman): Remove this when we are ready to run on Chrome.
start = time.time()

batch_config = local_config.BatchConfig()
regions = set(get_batch_regions(batch_config))
project = batch_config.get('project')
# TODO(metzman): Put the CPU-based scheduling in tworkers.
available_cpus = get_available_cpus(project, 'us-east4')
# TODO(metzman): Remove this as we move from experimental code to production.
available_cpus = min(available_cpus, 2750)
available_cpus = sum(
get_available_cpus_for_region(project, region) for region in regions)
available_cpus = min(available_cpus, 3500 * len(regions))
fuzz_tasks = get_fuzz_tasks(available_cpus)
if not fuzz_tasks:
logs.error('No fuzz tasks found to schedule.')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,24 +78,25 @@ def test_get_fuzz_tasks(self):
self.assertListEqual(comparable_results, expected_results)


class TestGetAvailableCpus(unittest.TestCase):
"""Tests for get_available_cpus."""
class TestGetAvailableCpusForRegion(unittest.TestCase):
"""Tests for get_available_cpus_for_region."""

def setUp(self):
test_helpers.patch(self,
['clusterfuzz._internal.cron.schedule_fuzz._get_quotas'])

def test_usage(self):
"""Tests that get_available_cpus handles usage properly."""
"""Tests that get_available_cpus_for_region handles usage properly."""
self.mock._get_quotas.return_value = [{
'metric': 'PREEMPTIBLE_CPUS',
'limit': 5,
'usage': 2
}]
self.assertEqual(schedule_fuzz.get_available_cpus('project', 'region'), 3)
self.assertEqual(
schedule_fuzz.get_available_cpus_for_region('project', 'region'), 3)

def test_cpus_and_preemptible_cpus(self):
"""Tests that get_available_cpus handles usage properly."""
"""Tests that get_available_cpus_for_region handles usage properly."""
self.mock._get_quotas.return_value = [{
'metric': 'PREEMPTIBLE_CPUS',
'limit': 5,
Expand All @@ -105,4 +106,5 @@ def test_cpus_and_preemptible_cpus(self):
'limit': 5,
'usage': 5
}]
self.assertEqual(schedule_fuzz.get_available_cpus('region', 'project'), 5)
self.assertEqual(
schedule_fuzz.get_available_cpus_for_region('region', 'project'), 5)

0 comments on commit 22dc493

Please sign in to comment.