This commit is contained in:
Adrian Cole 2012-05-17 01:31:20 -07:00
parent a2c8993592
commit 6e1c354423
3 changed files with 29 additions and 41 deletions

View File

@ -53,12 +53,6 @@
<artifactId>jclouds-compute</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jclouds.provider</groupId>
<artifactId>aws-s3</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jclouds.provider</groupId>
<artifactId>hpcloud-objectstorage</artifactId>
@ -369,8 +363,6 @@
<systemPropertyVariables>
<!-- note you can add support for new clouds by adding more entries here
after adding maven dependency -->
<test.aws-s3.identity>${test.aws-s3.identity}</test.aws-s3.identity>
<test.aws-s3.credential>${test.aws-s3.credential}</test.aws-s3.credential>
<test.hpcloud-objectstorage.identity>${test.hpcloud-objectstorage.identity}</test.hpcloud-objectstorage.identity>
<test.hpcloud-objectstorage.credential>${test.hpcloud-objectstorage.credential}</test.hpcloud-objectstorage.credential>
<appengine.sdk.root>${appengine.sdk.root}</appengine.sdk.root>

View File

@ -25,5 +25,6 @@
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
</system-properties>
<threadsafe>true</threadsafe>
<!-- potential race condition in GuiceServletConfig -->
<threadsafe>false</threadsafe>
</appengine-web-app>

View File

@ -23,7 +23,6 @@ import static com.google.common.collect.Iterables.size;
import static com.google.common.collect.Iterables.transform;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeUnit;
@ -50,7 +49,6 @@ import com.google.common.base.Stopwatch;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@ -116,9 +114,8 @@ public class GetAllResourcesController extends HttpServlet {
request.setAttribute("resources", results);
}
private Set<Iterable<? extends ResourceMetadata<?>>> allResourcesWithinDeadline(
Iterable<ListenableFuture<? extends Iterable<? extends ResourceMetadata<?>>>> asyncResources) {
Builder<Iterable<? extends ResourceMetadata<?>>> resourcesWeCanList = addToBuilderOnComplete(asyncResources);
private <T> Set<T> allResourcesWithinDeadline(Iterable<ListenableFuture<? extends T>> asyncResources) {
Builder<T> resourcesWeCanList = addToBuilderOnComplete(asyncResources);
// only serve resources that made it by the timeout
blockUntilAllDoneOrCancelOnTimeout(asyncResources);
@ -126,22 +123,20 @@ public class GetAllResourcesController extends HttpServlet {
return resourcesWeCanList.build();
}
private Builder<Iterable<? extends ResourceMetadata<?>>> addToBuilderOnComplete(
Iterable<ListenableFuture<? extends Iterable<? extends ResourceMetadata<?>>>> asyncResources) {
private <T> Builder<T> addToBuilderOnComplete(Iterable<ListenableFuture<? extends T>> asyncResources) {
final Builder<Iterable<? extends ResourceMetadata<?>>> resourcesWeCanList = ImmutableSet
.<Iterable<? extends ResourceMetadata<?>>> builder();
final Builder<T> resourcesWeCanList = ImmutableSet.<T> builder();
for (final ListenableFuture<? extends Iterable<? extends ResourceMetadata<?>>> asyncResource : asyncResources) {
Futures.addCallback(asyncResource, new FutureCallback<Iterable<? extends ResourceMetadata<?>>>() {
public void onSuccess(Iterable<? extends ResourceMetadata<?>> result) {
for (final ListenableFuture<? extends T> asyncResource : asyncResources) {
Futures.addCallback(asyncResource, new FutureCallback<T>() {
public void onSuccess(T result) {
if (result != null)
resourcesWeCanList.add(result);
}
public void onFailure(Throwable t) {
if (!(t instanceof CancellationException))
logger.info("exception getting resource %s: %s", asyncResource, t.getMessage());
logger.error(t, "exception getting resource %s: %s", asyncResource, t.getMessage());
}
}, currentRequestExecutorService);
@ -149,27 +144,27 @@ public class GetAllResourcesController extends HttpServlet {
return resourcesWeCanList;
}
private void blockUntilAllDoneOrCancelOnTimeout(
Iterable<ListenableFuture<? extends Iterable<? extends ResourceMetadata<?>>>> asyncResources) {
List<ListenableFuture<? extends Iterable<? extends ResourceMetadata<?>>>> remaining = Lists
.newArrayList(asyncResources);
while (remaining.size() > 0) {
ListenableFuture<?> resource = remaining.remove(0);
if (remainingMillis.get() <= 0) {
if (!resource.isDone())
resource.cancel(true);
continue;
// ensure we don't violate our request timeouts.
private void blockUntilAllDoneOrCancelOnTimeout(Iterable<? extends ListenableFuture<?>> asyncResources) {
try {
for (ListenableFuture<?> asyncResource : asyncResources) {
if (remainingMillis.get() > 0) {
try {
asyncResource.get(remainingMillis.get(), TimeUnit.MILLISECONDS);
} catch (Exception e) {
logger.info("exception getting resource %s: %s", asyncResource, e.getMessage());
}
}
}
try {
resource.get(remainingMillis.get(), TimeUnit.MILLISECONDS);
} catch (Exception e) {
logger.info("exception getting resource %s: %s", resource, e.getMessage());
if (!resource.isDone())
resource.cancel(true);
} finally {
if (remainingMillis.get() < 0) {
for (ListenableFuture<?> asyncResource : asyncResources) {
if (!asyncResource.isDone())
asyncResource.cancel(true);
}
}
}
}
}