Index: gm/rebaseline_server/imagepair.py |
diff --git a/gm/rebaseline_server/imagepair.py b/gm/rebaseline_server/imagepair.py |
index 33385ab5224b74239d6c7a347b421ddc777250e6..a89066fca31dfc2c74431551ebfea1dc2a3f37bb 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 |