Merge "Fix deserializing change refs from cache"

This commit is contained in:
Zuul 2021-09-29 20:41:27 +00:00 committed by Gerrit Code Review
commit ca2704be7b
3 changed files with 52 additions and 16 deletions

View File

@ -5537,8 +5537,9 @@ class ZuulTestCase(BaseTestCase):
# Join ensures that the queue is empty _and_ events have been
# processed
self.__eventQueuesJoin(matcher)
self.scheds.execute(
lambda app: app.sched.run_handler_lock.acquire())
for sched in map(lambda app: app.sched,
self.scheds.filter(matcher)):
sched.run_handler_lock.acquire()
if (self.__areAllSchedulersPrimed(matcher) and
self.__areAllMergeJobsWaiting(matcher) and
self.__haveAllBuildsReported() and
@ -5551,17 +5552,21 @@ class ZuulTestCase(BaseTestCase):
# when locked the run handler and checked that the
# components were stable, we don't erroneously
# report that we are settled.
self.scheds.execute(
lambda app: app.sched.run_handler_lock.release())
for sched in map(lambda app: app.sched,
self.scheds.filter(matcher)):
sched.run_handler_lock.release()
self.executor_server.lock.release()
self.log.debug("...settled after %.3f ms / %s loops (%s)",
time.time() - start, i, msg)
self.logState()
return
self.scheds.execute(
lambda app: app.sched.run_handler_lock.release())
for sched in map(lambda app: app.sched,
self.scheds.filter(matcher)):
sched.run_handler_lock.release()
self.executor_server.lock.release()
self.scheds.execute(lambda app: app.sched.wake_event.wait(0.1))
for sched in map(lambda app: app.sched,
self.scheds.filter(matcher)):
sched.wake_event.wait(0.1)
# Let other threads work
time.sleep(0.1)

View File

@ -102,3 +102,37 @@ class TestScaleOutScheduler(ZuulTestCase):
if all(l == new for l in layout_states):
break
self.waitUntilSettled()
def test_change_cache(self):
# Test re-using a change from the change cache.
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
B.setDependsOn(A, 1)
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
# This has populated the change cache with our change.
app = self.create_scheduler()
app.start()
self.assertEqual(len(self.scheds), 2)
# Hold the lock on the first scheduler so that only the second
# will act.
with self.scheds.first.sched.run_handler_lock:
# Enqueue the change again. The second scheduler will
# load the change object from the cache.
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
self.waitUntilSettled(matcher=[app])
# Each job should appear twice and contain both changes.
self.assertHistory([
dict(name='project-merge', result='SUCCESS', changes='1,1 2,1'),
dict(name='project-test1', result='SUCCESS', changes='1,1 2,1'),
dict(name='project-test2', result='SUCCESS', changes='1,1 2,1'),
dict(name='project-merge', result='SUCCESS', changes='1,1 2,1'),
dict(name='project-test1', result='SUCCESS', changes='1,1 2,1'),
dict(name='project-test2', result='SUCCESS', changes='1,1 2,1'),
], ordered=False)

View File

@ -3791,17 +3791,14 @@ class Change(Branch):
self.url = data.get("url")
self.uris = data.get("uris", [])
self.patchset = data.get("patchset")
self.git_needs_changes = [
tuple(k) for k in data.get("git_needs_changes", [])]
self.git_needed_by_changes = [
tuple(k) for k in data.get("git_needed_by_changes", [])]
self.compat_needs_changes = [
tuple(k) for k in data.get("compat_needs_changes", [])]
self.compat_needed_by_changes = [
tuple(k) for k in data.get("compat_needed_by_changes", [])]
self.git_needs_changes = data.get("git_needs_changes", [])
self.git_needed_by_changes = data.get("git_needed_by_changes", [])
self.compat_needs_changes = data.get("compat_needs_changes", [])
self.compat_needed_by_changes = data.get(
"compat_needed_by_changes", [])
self.commit_needs_changes = (
None if data.get("commit_needs_changes") is None
else [tuple(k) for k in data.get("commit_needs_changes", [])]
else data.get("commit_needs_changes", [])
)
self.is_current_patchset = data.get("is_current_patchset", True)
self.can_merge = data.get("can_merge", False)