Skip to content

Commit a20e9d3

Browse files
committed
Add ability to fetch restored glacier object
1 parent 283f73c commit a20e9d3

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

embulk-input-s3/src/main/java/org/embulk/input/s3/explorer/S3NameOrderPrefixFileExplorer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
package org.embulk.input.s3.explorer;
1818

1919
import com.amazonaws.services.s3.AmazonS3;
20+
import com.amazonaws.services.s3.model.GetObjectMetadataRequest;
2021
import com.amazonaws.services.s3.model.ListObjectsRequest;
2122
import com.amazonaws.services.s3.model.ObjectListing;
23+
import com.amazonaws.services.s3.model.ObjectMetadata;
2224
import com.amazonaws.services.s3.model.S3ObjectSummary;
2325
import org.embulk.input.s3.DefaultRetryable;
2426
import org.embulk.util.retryhelper.RetryExecutor;
@@ -53,6 +55,17 @@ public ObjectListing call()
5355
return ol.getObjectSummaries();
5456
}
5557

58+
@Override
59+
protected ObjectMetadata fetchObjectMetadata(S3ObjectSummary obj) {
60+
final GetObjectMetadataRequest req = new GetObjectMetadataRequest(obj.getBucketName(), obj.getKey());
61+
62+
return new DefaultRetryable<ObjectMetadata>("Get object metadata")
63+
{
64+
@Override
65+
public ObjectMetadata call() { return s3Client.getObjectMetadata(req); }
66+
}.executeWith(retryExecutor);
67+
}
68+
5669
@Override
5770
protected boolean hasNext()
5871
{

embulk-input-s3/src/main/java/org/embulk/input/s3/explorer/S3PrefixFileExplorer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.embulk.input.s3.explorer;
1818

1919
import com.amazonaws.services.s3.AmazonS3;
20+
import com.amazonaws.services.s3.model.ObjectMetadata;
2021
import com.amazonaws.services.s3.model.S3ObjectSummary;
2122
import com.amazonaws.services.s3.model.StorageClass;
2223
import org.embulk.config.ConfigException;
@@ -54,7 +55,13 @@ public void addToBuilder(final FileList.Builder builder)
5455
LOGGER.warn("Skipped \"s3://{}/{}\" that stored at Glacier.", bucketName, s.getKey());
5556
continue;
5657
}
57-
throw new ConfigException("Detected an object stored at Glacier. Set \"skip_glacier_objects\" option to \"true\" to skip this.");
58+
59+
ObjectMetadata objectMetadata = fetchObjectMetadata(s);
60+
if (objectMetadata != null && objectMetadata.getRestoreExpirationTime() != null) {
61+
LOGGER.info("Restored Glacier object \"s3://{}/{}\" found", bucketName, s.getKey());
62+
} else {
63+
throw new ConfigException("Detected an object stored at Glacier. Set \"skip_glacier_objects\" option to \"true\" to skip this.");
64+
}
5865
}
5966
if (s.getSize() > 0) {
6067
builder.add(s.getKey(), s.getSize());
@@ -69,5 +76,7 @@ public void addToBuilder(final FileList.Builder builder)
6976

7077
protected abstract List<S3ObjectSummary> fetch();
7178

79+
protected abstract ObjectMetadata fetchObjectMetadata(final S3ObjectSummary obj);
80+
7281
protected abstract boolean hasNext();
7382
}

embulk-input-s3/src/main/java/org/embulk/input/s3/explorer/S3TimeOrderPrefixFileExplorer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
package org.embulk.input.s3.explorer;
1818

1919
import com.amazonaws.services.s3.AmazonS3;
20+
import com.amazonaws.services.s3.model.GetObjectMetadataRequest;
2021
import com.amazonaws.services.s3.model.ListObjectsRequest;
2122
import com.amazonaws.services.s3.model.ObjectListing;
23+
import com.amazonaws.services.s3.model.ObjectMetadata;
2224
import com.amazonaws.services.s3.model.S3ObjectSummary;
2325
import org.embulk.input.s3.DefaultRetryable;
2426
import org.embulk.util.retryhelper.RetryExecutor;
@@ -72,6 +74,17 @@ public ObjectListing call()
7274
.collect(Collectors.toList());
7375
}
7476

77+
@Override
78+
protected ObjectMetadata fetchObjectMetadata(S3ObjectSummary obj) {
79+
final GetObjectMetadataRequest req = new GetObjectMetadataRequest(obj.getBucketName(), obj.getKey());
80+
81+
return new DefaultRetryable<ObjectMetadata>("Get object metadata")
82+
{
83+
@Override
84+
public ObjectMetadata call() { return s3Client.getObjectMetadata(req); }
85+
}.executeWith(retryExecutor);
86+
}
87+
7588
@Override
7689
public boolean hasNext()
7790
{

embulk-input-s3/src/test/java/org/embulk/input/s3/explorer/TestS3PrefixFileExplorer.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.embulk.input.s3.explorer;
1818

1919
import com.amazonaws.services.s3.AmazonS3;
20+
import com.amazonaws.services.s3.model.ObjectMetadata;
2021
import com.amazonaws.services.s3.model.S3ObjectSummary;
2122
import com.amazonaws.services.s3.model.StorageClass;
2223
import org.embulk.EmbulkTestRuntime;
@@ -31,6 +32,7 @@
3132
import org.mockito.runners.MockitoJUnitRunner;
3233

3334
import java.util.Collections;
35+
import java.util.Date;
3436
import java.util.List;
3537

3638
import static org.mockito.Mockito.doReturn;
@@ -75,6 +77,20 @@ public void addToBuilder_should_throw_exception_if_notskipped_glacier_storage()
7577
s3PrefixFileExplorer.addToBuilder(builder);
7678
}
7779

80+
@Test
81+
public void addToBuilder_should_not_throw_exception_if_restored_glacier_object()
82+
{
83+
when(s3ObjectSummary.getStorageClass()).thenReturn(StorageClass.Glacier.toString());
84+
when(s3ObjectSummary.getKey()).thenReturn(PATH_PREFIX + OBJECT_KEY);
85+
when(s3ObjectSummary.getSize()).thenReturn(1L);
86+
ObjectMetadata objectMetadata = new ObjectMetadata();
87+
objectMetadata.setRestoreExpirationTime(new Date());
88+
doReturn(objectMetadata).when(s3PrefixFileExplorer).fetchObjectMetadata(s3ObjectSummary);
89+
doReturn(true).when(s3PrefixFileExplorer).hasNext();
90+
s3PrefixFileExplorer.addToBuilder(builder);
91+
verify(builder).add(PATH_PREFIX + OBJECT_KEY, 1);
92+
}
93+
7894
@Test
7995
public void addToBuilder_should_skip_glacier_storage_if_allowed()
8096
{
@@ -132,6 +148,9 @@ protected List<S3ObjectSummary> fetch()
132148
return null;
133149
}
134150

151+
@Override
152+
protected ObjectMetadata fetchObjectMetadata(S3ObjectSummary obj) { return null; }
153+
135154
@Override
136155
protected boolean hasNext()
137156
{

0 commit comments

Comments
 (0)