Work around failed CDN metadata lookups with HPCS

Previously BlobStore.list and thus BlobStore.clearContainer serialized
on synchronous and failed CDN lookups.  This effectively prevents
clearing any large container.  We cache a negative entry to work
around this.  When HP improves their CDN support we should remove this
workaround.
This commit is contained in:
Andrew Gaul 2012-10-20 14:16:09 -07:00
parent b855d98f13
commit 3c7b9652f4
1 changed files with 14 additions and 1 deletions

View File

@ -18,7 +18,10 @@
*/ */
package org.jclouds.hpcloud.objectstorage.blobstore.functions; package org.jclouds.hpcloud.objectstorage.blobstore.functions;
import static com.google.common.base.Throwables.propagate;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider; import javax.inject.Provider;
@ -45,14 +48,24 @@ public class PublicUriForObjectInfo implements Function<ObjectInfo, URI> {
this.uriBuilders = uriBuilders; this.uriBuilders = uriBuilders;
} }
private static final URI NEGATIVE_ENTRY = URI.create("http://127.0.0.1");
public URI apply(ObjectInfo from) { public URI apply(ObjectInfo from) {
if (from == null) if (from == null)
return null; return null;
try { try {
return uriBuilders.get().uri(cdnContainer.getUnchecked(from.getContainer())).path(from.getName()).replaceQuery("") URI uri = cdnContainer.getUnchecked(from.getContainer());
if (uri == NEGATIVE_ENTRY) { // intentionally use reference equality
// TODO: GetCDNMetadata.load returns null on failure cases. We use
// a negative entry to avoid repeatedly issuing failed CDN queries.
// The LoadingCache removes this value after its normal expiry.
return null;
}
return uriBuilders.get().uri(uri).path(from.getName()).replaceQuery("")
.build(); .build();
} catch (CacheLoader.InvalidCacheLoadException e) { } catch (CacheLoader.InvalidCacheLoadException e) {
// nulls not permitted from cache loader // nulls not permitted from cache loader
cdnContainer.put(from.getContainer(), NEGATIVE_ENTRY);
return null; return null;
} catch (NullPointerException e) { } catch (NullPointerException e) {
// nulls not permitted from cache loader // nulls not permitted from cache loader