Don't continually re-request completed requests that had load errors.

This commit is contained in:
Josh Matthews 2020-02-21 14:51:45 -05:00
parent 2742fd2bea
commit d4e85f9a90
2 changed files with 21 additions and 20 deletions

View file

@ -10,7 +10,7 @@ use net_traits::image_cache::{
CanRequestImages, CorsStatus, ImageCache, ImageCacheResult, ImageResponder, CanRequestImages, CorsStatus, ImageCache, ImageCacheResult, ImageResponder,
PendingImageResponse, PendingImageResponse,
}; };
use net_traits::image_cache::{ImageOrMetadataAvailable, ImageResponse, ImageState}; use net_traits::image_cache::{ImageOrMetadataAvailable, ImageResponse};
use net_traits::image_cache::{PendingImageId, UsePlaceholder}; use net_traits::image_cache::{PendingImageId, UsePlaceholder};
use net_traits::request::CorsSettings; use net_traits::request::CorsSettings;
use net_traits::{ use net_traits::{
@ -391,7 +391,7 @@ impl ImageCacheStore {
origin: ImmutableOrigin, origin: ImmutableOrigin,
cors_setting: Option<CorsSettings>, cors_setting: Option<CorsSettings>,
placeholder: UsePlaceholder, placeholder: UsePlaceholder,
) -> Option<Result<ImageOrMetadataAvailable, ImageState>> { ) -> Option<Result<(Arc<Image>, ServoUrl), ()>> {
self.completed_loads self.completed_loads
.get(&(url, origin, cors_setting)) .get(&(url, origin, cors_setting))
.map( .map(
@ -400,13 +400,10 @@ impl ImageCacheStore {
( (
&ImageResponse::PlaceholderLoaded(ref image, ref url), &ImageResponse::PlaceholderLoaded(ref image, ref url),
UsePlaceholder::Yes, UsePlaceholder::Yes,
) => Ok(ImageOrMetadataAvailable::ImageAvailable( ) => Ok((image.clone(), url.clone())),
image.clone(),
url.clone(),
)),
(&ImageResponse::PlaceholderLoaded(_, _), UsePlaceholder::No) | (&ImageResponse::PlaceholderLoaded(_, _), UsePlaceholder::No) |
(&ImageResponse::None, _) | (&ImageResponse::None, _) |
(&ImageResponse::MetadataLoaded(_), _) => Err(ImageState::LoadError), (&ImageResponse::MetadataLoaded(_), _) => Err(()),
}, },
) )
} }
@ -453,7 +450,7 @@ impl ImageCache for ImageCacheImpl {
let result = let result =
store.get_completed_image_if_available(url, origin, cors_setting, UsePlaceholder::No); store.get_completed_image_if_available(url, origin, cors_setting, UsePlaceholder::No);
match result { match result {
Some(Ok(ImageOrMetadataAvailable::ImageAvailable(img, _))) => Some(img), Some(Ok((img, _))) => Some(img),
_ => None, _ => None,
} }
} }
@ -467,14 +464,24 @@ impl ImageCache for ImageCacheImpl {
can_request: CanRequestImages, can_request: CanRequestImages,
) -> ImageCacheResult { ) -> ImageCacheResult {
let mut store = self.store.lock().unwrap(); let mut store = self.store.lock().unwrap();
if let Some(Ok(result)) = store.get_completed_image_if_available( if let Some(result) = store.get_completed_image_if_available(
url.clone(), url.clone(),
origin.clone(), origin.clone(),
cors_setting, cors_setting,
use_placeholder, use_placeholder,
) { ) {
match result {
Ok((image, image_url)) => {
debug!("{} is available", url); debug!("{} is available", url);
return ImageCacheResult::Available(result); return ImageCacheResult::Available(ImageOrMetadataAvailable::ImageAvailable(
image, image_url,
));
},
Err(()) => {
debug!("{} is not available", url);
return ImageCacheResult::LoadError;
},
}
} }
let decoded = { let decoded = {
@ -518,7 +525,9 @@ impl ImageCache for ImageCacheImpl {
// TODO: make this behaviour configurable according to the caller's needs. // TODO: make this behaviour configurable according to the caller's needs.
store.handle_decoder(decoded); store.handle_decoder(decoded);
match store.get_completed_image_if_available(url, origin, cors_setting, use_placeholder) { match store.get_completed_image_if_available(url, origin, cors_setting, use_placeholder) {
Some(Ok(result)) => ImageCacheResult::Available(result), Some(Ok((image, image_url))) => ImageCacheResult::Available(
ImageOrMetadataAvailable::ImageAvailable(image, image_url),
),
_ => ImageCacheResult::LoadError, _ => ImageCacheResult::LoadError,
} }
} }

View file

@ -73,14 +73,6 @@ pub enum ImageResponse {
None, None,
} }
/// The current state of an image in the cache.
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
pub enum ImageState {
Pending(PendingImageId),
LoadError,
NotRequested(PendingImageId),
}
/// The unique id for an image that has previously been requested. /// The unique id for an image that has previously been requested.
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)] #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
pub struct PendingImageId(pub u64); pub struct PendingImageId(pub u64);