Skip to content

Commit

Permalink
Fix update_mappings_for_fuzzer when there are stale job references. (g…
Browse files Browse the repository at this point in the history
  • Loading branch information
oliverchang authored Aug 13, 2024
1 parent 88ebf29 commit ff2652e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
21 changes: 20 additions & 1 deletion src/clusterfuzz/_internal/fuzzing/fuzzer_selection.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
def update_mappings_for_fuzzer(fuzzer, mappings=None):
"""Clear existing mappings for a fuzzer, and replace them."""
if mappings is None:
mappings = fuzzer.jobs
# Make a copy in case we need to modify it.
mappings = fuzzer.jobs.copy()

query = data_types.FuzzerJob.query()
query = query.filter(data_types.FuzzerJob.fuzzer == fuzzer.name)
Expand All @@ -47,7 +48,22 @@ def update_mappings_for_fuzzer(fuzzer, mappings=None):
jobs = {job.name: job for job in jobs}
else:
jobs = {}

fuzzer_modified = False

for job_name in mappings:
if job_name not in jobs:
# Job references a deleted job, clean it up.
try:
fuzzer.jobs.remove(job_name)
fuzzer_modified = True
except ValueError:
# If `mappings` was provided via an argument, it's possible it won't
# exist in `fuzzer.jobs`.
pass

continue

mapping = old_mappings.pop(job_name, None)
if not mapping:
mapping = data_types.FuzzerJob()
Expand All @@ -59,6 +75,9 @@ def update_mappings_for_fuzzer(fuzzer, mappings=None):
ndb_utils.put_multi(new_mappings)
ndb_utils.delete_multi([m.key for m in list(old_mappings.values())])

if fuzzer_modified:
fuzzer.put()


def update_mappings_for_job(job, mappings):
"""Clear existing mappings for a job, and replace them."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import os
import unittest

from google.cloud import ndb
import parameterized

from clusterfuzz._internal.datastore import data_types
Expand Down Expand Up @@ -131,6 +132,21 @@ def test_mapping_removed(self):
mappings = _get_job_list_for_fuzzer(fuzzer)
self.assertEqual([], mappings)

def test_nonexistent_job(self):
"""Ensure stale, non-existent job references are handled."""
fuzzer = data_types.Fuzzer()
fuzzer.name = 'adding_jobs'
fuzzer.jobs = ['does_not_exist', 'job_1']
fuzzer.put()

fuzzer_selection.update_mappings_for_fuzzer(fuzzer)

fuzzer = ndb.Key(data_types.Fuzzer, fuzzer.key.id()).get()
self.assertCountEqual(['job_1'], fuzzer.jobs)

mappings = _get_job_list_for_fuzzer(fuzzer)
self.assertCountEqual(['job_1'], mappings)


@test_utils.with_cloud_emulators('datastore')
class UpdateMappingsForJobTest(unittest.TestCase):
Expand Down

0 comments on commit ff2652e

Please sign in to comment.