You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2014/07/26 13:12:58 UTC
git commit: JCLOUDS-457: Add polling strategy
Repository: jclouds-labs-aws
Updated Branches:
refs/heads/master 36e8cbda3 -> 3bc840e67
JCLOUDS-457: Add polling strategy
The polling strategy interface for job operations
and a simple implementation class have been added.
This implementation waits an initial time and then
polls at regular intervals.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/commit/3bc840e6
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/tree/3bc840e6
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/diff/3bc840e6
Branch: refs/heads/master
Commit: 3bc840e6794fa7cc5a62c5bc4632911ed44d45b0
Parents: 36e8cbd
Author: Roman Coedo <ro...@gmail.com>
Authored: Tue Jul 22 13:16:04 2014 +0200
Committer: Andrew Gaul <ga...@apache.org>
Committed: Fri Jul 25 23:18:42 2014 -0700
----------------------------------------------------------------------
.../glacier/blobstore/GlacierBlobStore.java | 7 +-
.../config/GlacierBlobStoreContextModule.java | 3 +
.../blobstore/strategy/PollingStrategy.java | 21 ++++++
.../strategy/internal/BasePollingStrategy.java | 76 ++++++++++++++++++++
.../glacier/GlacierClientLongLiveTest.java | 12 ++--
5 files changed, 110 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/3bc840e6/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java b/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java
index 15ebdc3..546abc1 100644
--- a/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java
+++ b/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java
@@ -37,6 +37,7 @@ import org.jclouds.domain.Location;
import org.jclouds.glacier.GlacierClient;
import org.jclouds.glacier.blobstore.functions.PaginatedVaultCollectionToStorageMetadata;
import org.jclouds.glacier.blobstore.strategy.MultipartUploadStrategy;
+import org.jclouds.glacier.blobstore.strategy.PollingStrategy;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Supplier;
@@ -47,13 +48,17 @@ public class GlacierBlobStore extends BaseBlobStore {
private final GlacierClient sync;
private final Crypto crypto;
private final Provider<MultipartUploadStrategy> multipartUploadStrategy;
+ private final Provider<PollingStrategy> pollingStrategy;
private final PaginatedVaultCollectionToStorageMetadata vaultsToContainers;
@Inject
GlacierBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier<Location> defaultLocation,
@Memoized Supplier<Set<? extends Location>> locations, GlacierClient sync, Crypto crypto,
- Provider<MultipartUploadStrategy> multipartUploadStrategy, PaginatedVaultCollectionToStorageMetadata vaultsToContainers) {
+ Provider<MultipartUploadStrategy> multipartUploadStrategy,
+ Provider<PollingStrategy> pollingStrategy,
+ PaginatedVaultCollectionToStorageMetadata vaultsToContainers) {
super(context, blobUtils, defaultLocation, locations);
+ this.pollingStrategy = checkNotNull(pollingStrategy, "pollingStrategy");
this.vaultsToContainers = checkNotNull(vaultsToContainers, "vaultsToContainers");
this.multipartUploadStrategy = checkNotNull(multipartUploadStrategy, "multipartUploadStrategy");
this.sync = checkNotNull(sync, "sync");
http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/3bc840e6/glacier/src/main/java/org/jclouds/glacier/blobstore/config/GlacierBlobStoreContextModule.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/blobstore/config/GlacierBlobStoreContextModule.java b/glacier/src/main/java/org/jclouds/glacier/blobstore/config/GlacierBlobStoreContextModule.java
index e330c53..e45c809 100644
--- a/glacier/src/main/java/org/jclouds/glacier/blobstore/config/GlacierBlobStoreContextModule.java
+++ b/glacier/src/main/java/org/jclouds/glacier/blobstore/config/GlacierBlobStoreContextModule.java
@@ -24,7 +24,9 @@ import org.jclouds.glacier.blobstore.GlacierAsyncBlobStore;
import org.jclouds.glacier.blobstore.GlacierBlobStore;
import org.jclouds.glacier.blobstore.strategy.ClearVaultStrategy;
import org.jclouds.glacier.blobstore.strategy.MultipartUploadStrategy;
+import org.jclouds.glacier.blobstore.strategy.PollingStrategy;
import org.jclouds.glacier.blobstore.strategy.SlicingStrategy;
+import org.jclouds.glacier.blobstore.strategy.internal.BasePollingStrategy;
import org.jclouds.glacier.blobstore.strategy.internal.BaseSlicingStrategy;
import org.jclouds.glacier.blobstore.strategy.internal.SequentialMultipartUploadStrategy;
@@ -39,5 +41,6 @@ public class GlacierBlobStoreContextModule extends AbstractModule {
bind(MultipartUploadStrategy.class).to(SequentialMultipartUploadStrategy.class);
bind(SlicingStrategy.class).to(BaseSlicingStrategy.class);
bind(ClearListStrategy.class).to(ClearVaultStrategy.class);
+ bind(PollingStrategy.class).to(BasePollingStrategy.class);
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/3bc840e6/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/PollingStrategy.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/PollingStrategy.java b/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/PollingStrategy.java
new file mode 100644
index 0000000..b208809
--- /dev/null
+++ b/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/PollingStrategy.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.glacier.blobstore.strategy;
+
+public interface PollingStrategy {
+ boolean waitForSuccess(String vault, String job) throws InterruptedException;
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/3bc840e6/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/internal/BasePollingStrategy.java
----------------------------------------------------------------------
diff --git a/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/internal/BasePollingStrategy.java b/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/internal/BasePollingStrategy.java
new file mode 100644
index 0000000..b9c90df
--- /dev/null
+++ b/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/internal/BasePollingStrategy.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.glacier.blobstore.strategy.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.glacier.GlacierClient;
+import org.jclouds.glacier.blobstore.strategy.PollingStrategy;
+import org.jclouds.glacier.domain.JobMetadata;
+import org.jclouds.glacier.domain.JobStatus;
+
+import com.google.inject.Inject;
+
+public class BasePollingStrategy implements PollingStrategy {
+ public static final long DEFAULT_INITIAL_WAIT = TimeUnit.HOURS.toMillis(3);
+ public static final long DEFAULT_TIME_BETWEEN_POLLS = TimeUnit.MINUTES.toMillis(15);
+
+ private final GlacierClient client;
+ private final long initialWait;
+ private final long timeBetweenPolls;
+
+ public BasePollingStrategy(long initialWait, long timeBetweenPolls, GlacierClient client) {
+ this.initialWait = initialWait;
+ this.timeBetweenPolls = timeBetweenPolls;
+ this.client = checkNotNull(client, "client");
+ }
+
+ @Inject
+ public BasePollingStrategy(GlacierClient client) {
+ this(DEFAULT_INITIAL_WAIT, DEFAULT_TIME_BETWEEN_POLLS, client);
+ }
+
+ private boolean inProgress(String job, String vault) {
+ JobMetadata jobMetadata = client.describeJob(vault, job);
+ return (jobMetadata != null) && (jobMetadata.getStatusCode() == JobStatus.IN_PROGRESS);
+ }
+
+ private void waitForJob(String job, String vault) throws InterruptedException {
+ Thread.sleep(initialWait);
+ while (inProgress(job, vault)) {
+ Thread.sleep(timeBetweenPolls);
+ }
+ }
+
+ private boolean succeeded(String job, String vault) {
+ JobMetadata jobMetadata = client.describeJob(vault, job);
+ return (jobMetadata != null) && (jobMetadata.getStatusCode() == JobStatus.SUCCEEDED);
+ }
+
+ @Override
+ public boolean waitForSuccess(String vault, String job) throws InterruptedException {
+ // Avoid waiting if the job doesn't exist
+ if (client.describeJob(vault, job) == null) {
+ return false;
+ }
+ waitForJob(job, vault);
+ return succeeded(job, vault);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs-aws/blob/3bc840e6/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
----------------------------------------------------------------------
diff --git a/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java b/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
index 1ab4939..ffe66f4 100644
--- a/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
+++ b/glacier/src/test/java/org/jclouds/glacier/GlacierClientLongLiveTest.java
@@ -17,15 +17,16 @@
package org.jclouds.glacier;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.jclouds.glacier.blobstore.strategy.internal.BasePollingStrategy.DEFAULT_TIME_BETWEEN_POLLS;
import static org.jclouds.glacier.util.TestUtils.MiB;
import static org.jclouds.glacier.util.TestUtils.buildData;
import static org.jclouds.glacier.util.TestUtils.buildPayload;
import java.io.IOException;
import java.io.InputStream;
-import java.util.concurrent.TimeUnit;
import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.glacier.blobstore.strategy.internal.BasePollingStrategy;
import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest;
import org.jclouds.glacier.domain.InventoryRetrievalJobRequest;
import org.jclouds.glacier.domain.JobMetadata;
@@ -44,8 +45,6 @@ import com.google.common.io.Closer;
public class GlacierClientLongLiveTest extends BaseApiLiveTest<GlacierClient>{
private static final long PART_SIZE = 1;
- private static final long INITIAL_WAIT = TimeUnit.HOURS.toMillis(3);
- private static final long TIME_BETWEEN_POLLS = TimeUnit.MINUTES.toMillis(15);
private static final String VAULT_NAME = "JCLOUDS_LIVE_TESTS";
private static final String ARCHIVE_DESCRIPTION = "test archive";
@@ -112,11 +111,8 @@ public class GlacierClientLongLiveTest extends BaseApiLiveTest<GlacierClient>{
@Test(groups = {"live", "livelong", "longtest"}, dependsOnMethods = {"testInitiateJob", "testDescribeJob", "testListJobs"})
public void testWaitForSucceed() throws InterruptedException {
- Thread.sleep(INITIAL_WAIT);
- while (api.describeJob(VAULT_NAME, archiveRetrievalJob).getStatusCode() == JobStatus.IN_PROGRESS ||
- api.describeJob(VAULT_NAME, inventoryRetrievalJob).getStatusCode() == JobStatus.IN_PROGRESS) {
- Thread.sleep(TIME_BETWEEN_POLLS);
- }
+ new BasePollingStrategy(api).waitForSuccess(VAULT_NAME, archiveRetrievalJob);
+ new BasePollingStrategy(0, DEFAULT_TIME_BETWEEN_POLLS, api).waitForSuccess(VAULT_NAME, inventoryRetrievalJob);
assertThat(api.describeJob(VAULT_NAME, archiveRetrievalJob).getStatusCode()).isEqualTo(JobStatus.SUCCEEDED);
assertThat(api.describeJob(VAULT_NAME, inventoryRetrievalJob).getStatusCode()).isEqualTo(JobStatus.SUCCEEDED);
}