aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/rebaseline_server/imagepair.py
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-14 18:15:29 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-14 18:15:29 +0000
commit280ea8296ff83663a427b8c9aa0ee98b7839f926 (patch)
treeb3b2226cb3b8d1eeb979a42ba64f5a1bc7a076e0 /gm/rebaseline_server/imagepair.py
parent4431e7757cfcb8cfa99535eed0e9f156dabf95c2 (diff)
rebaseline_server: multithreaded loading/diffing of images
BUG=skia:2414 NOTRY=True R=rmistry@google.com Author: epoger@google.com Review URL: https://codereview.chromium.org/235923002 git-svn-id: http://skia.googlecode.com/svn/trunk@14184 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/rebaseline_server/imagepair.py')
-rw-r--r--gm/rebaseline_server/imagepair.py49
1 files changed, 33 insertions, 16 deletions
diff --git a/gm/rebaseline_server/imagepair.py b/gm/rebaseline_server/imagepair.py
index 33385ab522..a89066fca3 100644
--- a/gm/rebaseline_server/imagepair.py
+++ b/gm/rebaseline_server/imagepair.py
@@ -48,27 +48,43 @@ class ImagePair(object):
self.extra_columns_dict = extra_columns
if not imageA_relative_url or not imageB_relative_url:
self._is_different = True
- self.diff_record = None
+ self._diff_record = None
+ self._diff_record_set = True
elif imageA_relative_url == imageB_relative_url:
self._is_different = False
- self.diff_record = None
+ self._diff_record = None
+ self._diff_record_set = True
else:
- # TODO(epoger): Rather than blocking until image_diff_db can read in
- # the image pair and generate diffs, it would be better to do it
- # asynchronously: tell image_diff_db to download a bunch of file pairs,
- # and only block later if we're still waiting for diff_records to come
- # back.
- self._is_different = True
- image_diff_db.add_image_pair(
+ # Tell image_diff_db to add this ImagePair.
+ # It will do so in a separate thread so as not to block this one;
+ # when you call self.get_diff_record(), it will block until the results
+ # are ready.
+ image_diff_db.add_image_pair_async(
expected_image_locator=imageA_relative_url,
expected_image_url=posixpath.join(base_url, imageA_relative_url),
actual_image_locator=imageB_relative_url,
actual_image_url=posixpath.join(base_url, imageB_relative_url))
- self.diff_record = image_diff_db.get_diff_record(
- expected_image_locator=imageA_relative_url,
- actual_image_locator=imageB_relative_url)
- if self.diff_record and self.diff_record.get_num_pixels_differing() == 0:
+ self._image_diff_db = image_diff_db
+ self._diff_record_set = False
+
+ def get_diff_record(self):
+ """Returns the DiffRecord associated with this ImagePair.
+
+ Returns None if the images are identical, or one is missing.
+ This method will block until the DiffRecord is available.
+ """
+ if not self._diff_record_set:
+ self._diff_record = self._image_diff_db.get_diff_record(
+ expected_image_locator=self.imageA_relative_url,
+ actual_image_locator=self.imageB_relative_url)
+ self._image_diff_db = None # release reference, no longer needed
+ if (self._diff_record and
+ self._diff_record.get_num_pixels_differing() == 0):
self._is_different = False
+ else:
+ self._is_different = True
+ self._diff_record_set = True
+ return self._diff_record
def as_dict(self):
"""Returns a dictionary describing this ImagePair.
@@ -79,11 +95,12 @@ class ImagePair(object):
KEY__IMAGE_A_URL: self.imageA_relative_url,
KEY__IMAGE_B_URL: self.imageB_relative_url,
}
- asdict[KEY__IS_DIFFERENT] = self._is_different
if self.expectations_dict:
asdict[KEY__EXPECTATIONS_DATA] = self.expectations_dict
if self.extra_columns_dict:
asdict[KEY__EXTRA_COLUMN_VALUES] = self.extra_columns_dict
- if self.diff_record and (self.diff_record.get_num_pixels_differing() > 0):
- asdict[KEY__DIFFERENCE_DATA] = self.diff_record.as_dict()
+ diff_record = self.get_diff_record()
+ if diff_record and (diff_record.get_num_pixels_differing() > 0):
+ asdict[KEY__DIFFERENCE_DATA] = diff_record.as_dict()
+ asdict[KEY__IS_DIFFERENT] = self._is_different
return asdict