Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(526)

Unified Diff: dashboard/dashboard/pinpoint/models/job.py

Issue 3013153002: [pinpoint] Use _JobState.Differences() in _JobState.Explore(). (Closed)
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dashboard/dashboard/pinpoint/models/job.py
diff --git a/dashboard/dashboard/pinpoint/models/job.py b/dashboard/dashboard/pinpoint/models/job.py
index a2bf223084ee3787ffaf551eec2d48e5847920e5..0a1c48152b6b5754b662c899002acecd70138777 100644
--- a/dashboard/dashboard/pinpoint/models/job.py
+++ b/dashboard/dashboard/pinpoint/models/job.py
@@ -237,38 +237,27 @@ class _JobState(object):
"""Compare Changes and bisect by adding additional Changes as needed.
For every pair of adjacent Changes, compare their results as probability
- distributions. If more information is needed to establish statistical
- confidence, add an additional Attempt. If the results are different, find
- the midpoint of the Changes and add it to the Job.
+ distributions. If the results are different, find the midpoint of the
+ Changes and add it to the Job.
The midpoint can only be added if the second Change represents a commit that
comes after the first Change. Otherwise, this method won't explore further.
For example, if Change A is repo@abc, and Change B is repo@abc + patch,
there's no way to pick additional Changes to try.
"""
- # Compare every pair of Changes.
- # TODO: The list may Change while iterating through it.
- # TODO: Use JobState.Differences().
- for index in xrange(1, len(self._changes)):
+ # This loop adds Changes to the _changes list while looping through it.
perezju 2017/09/19 13:54:52 Actually, it doesn't. Because of "tuple" you're no
perezju 2017/09/19 13:59:04 Ah, ignore both my previous comments. I just noted
dtu 2017/09/19 18:21:53 Yep, the index is needed for the insertion. Since
+ # However, the loop index goes in reverse order and Changes are only added
+ # after the loop index, so the loop never encounters the modified items.
+ for index, change_b in reversed(tuple(self.Differences())):
change_a = self._changes[index - 1]
- change_b = self._changes[index]
- comparison_result = self._Compare(change_a, change_b)
- if comparison_result == _DIFFERENT:
- # Different: Bisect and add an additional Change to the job.
- try:
- midpoint = change_module.Change.Midpoint(change_a, change_b)
- except change_module.NonLinearError:
- continue
- logging.info('Adding Change %s.', midpoint)
- self.AddChange(midpoint, index)
- elif comparison_result == _SAME:
- # The same: Do nothing.
+ try:
+ midpoint = change_module.Change.Midpoint(change_a, change_b)
+ except change_module.NonLinearError:
continue
- elif comparison_result == _UNKNOWN:
- # Unknown: Add an Attempt to the Change with the fewest Attempts.
- change = min(change_a, change_b, key=lambda c: len(self._attempts[c]))
- self.AddAttempt(change)
+
+ logging.info('Adding Change %s.', midpoint)
+ self.AddChange(midpoint, index)
perezju 2017/09/19 13:59:04 Do we really need AddChange to be a public method?
dtu 2017/09/19 18:21:53 One of the original interactivity feature plans wa
def ScheduleWork(self):
work_left = False
@@ -283,6 +272,15 @@ class _JobState(object):
return work_left
def Differences(self):
+ """Compares every pair of Changes and yields ones with different results.
+
+ This method loops through every pair of adjacent Changes. If they have
+ statistically different results, this method yields the latter one (which is
+ assumed to have caused the difference).
+
+ Yields:
+ Tuples of (change_index, Change).
+ """
for index in xrange(1, len(self._changes)):
change_a = self._changes[index - 1]
change_b = self._changes[index]
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698