From 8ca29e70d1f448bb3933f0d5e855f09892951686 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Thu, 14 Mar 2019 15:22:23 +0000 Subject: [PATCH 1/5] HADOOP-16190. S3A copyFile operation to include source versionID or etag in the copy request This patch adds the constraints on the request, and maps a 412 response to a RemoteFileChangedException. No obvious test for this. The way to do it would be to get an invalid etag/version in to the request and see what happens, which would complicate the copy API a bit -but is something we will need for etag/version tracking in s3guard anyway.... Change-Id: I4b229336ba2d57018bd8b66888b807074419598e --- .../fs/s3a/RemoteFileChangedException.java | 17 +++++++++++++++++ .../org/apache/hadoop/fs/s3a/S3AFileSystem.java | 14 +++++++++++--- .../java/org/apache/hadoop/fs/s3a/S3AUtils.java | 8 ++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java index cfa5935bbf3e3..9af4354f281bf 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java @@ -46,4 +46,21 @@ public RemoteFileChangedException(String path, super(path, message); setOperation(operation); } + + /** + * Constructs a RemoteFileChangedException. + * + * @param path the path accessed when the change was detected + * @param operation the operation (e.g. open, re-open) performed when the + * change was detected + * @param message a message providing more details about the condition + * @param cause inner cause. + */ + public RemoteFileChangedException(final String path, + final String operation, + final String message, + final Throwable cause) { + super(path, message, cause); + setOperation(operation); + } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java index 1f560d064a9bf..3ae9e5e8cc4a2 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java @@ -74,6 +74,7 @@ import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerConfiguration; import com.amazonaws.services.s3.transfer.Upload; +import com.amazonaws.services.s3.transfer.model.CopyResult; import com.amazonaws.services.s3.transfer.model.UploadResult; import com.amazonaws.event.ProgressListener; import com.google.common.annotations.VisibleForTesting; @@ -2864,7 +2865,7 @@ public List listAWSPolicyRules( * @throws IOException Other IO problems */ @Retries.RetryMixed - private void copyFile(String srcKey, String dstKey, long size) + private CopyResult copyFile(String srcKey, String dstKey, long size) throws IOException, InterruptedIOException { LOG.debug("copyFile {} -> {} ", srcKey, dstKey); @@ -2878,7 +2879,7 @@ private void copyFile(String srcKey, String dstKey, long size) } }; - once("copyFile(" + srcKey + ", " + dstKey + ")", srcKey, + return once("copyFile(" + srcKey + ", " + dstKey + ")", srcKey, () -> { ObjectMetadata srcom = getObjectMetadata(srcKey); ObjectMetadata dstom = cloneObjectMetadata(srcom); @@ -2888,12 +2889,19 @@ private void copyFile(String srcKey, String dstKey, long size) setOptionalCopyObjectRequestParameters(copyObjectRequest); copyObjectRequest.setCannedAccessControlList(cannedACL); copyObjectRequest.setNewObjectMetadata(dstom); + String id = srcom.getVersionId(); + if (id != null) { + copyObjectRequest.setSourceVersionId(id); + } else if (isNotEmpty(srcom.getETag())) { + copyObjectRequest.withMatchingETagConstraint(srcom.getETag()); + } Copy copy = transfers.copy(copyObjectRequest); copy.addProgressListener(progressListener); try { - copy.waitForCopyResult(); + CopyResult r = copy.waitForCopyResult(); incrementWriteOperations(); instrumentation.filesCopied(1, size); + return r; } catch (InterruptedException e) { throw new InterruptedIOException("Interrupted copying " + srcKey + " to " + dstKey + ", cancelling"); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java index f3235545c49c5..b6949e85de605 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java @@ -257,6 +257,14 @@ public static IOException translateException(@Nullable String operation, ioe = new AWSBadRequestException(message, s3Exception); break; + // version/etag id cannot be met in copy. + case 412: + ioe = new RemoteFileChangedException(path, + operation, + "Constraints of request were unsatisfiable", + ase); + break; + // out of range. This may happen if an object is overwritten with // a shorter one while it is being read. case 416: From 6aabc598b4dcb6a9487cb630e05436465a90ab16 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Thu, 21 Mar 2019 13:05:11 +0000 Subject: [PATCH 2/5] HADOOP-16190. Add a section in testiing, especially on having an expiry rule. Includes a PNG file of the form to fill in Change-Id: I7cce8d954da08a9f9e39701e6abaf6b99bdf6cea --- .../site/markdown/tools/hadoop-aws/testing.md | 51 ++++++++++++++++++ .../tools/hadoop-aws/delete-old-versions.png | Bin 0 -> 76055 bytes 2 files changed, 51 insertions(+) create mode 100644 hadoop-tools/hadoop-aws/src/site/resources/images/tools/hadoop-aws/delete-old-versions.png diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md index 1a1d5a9347e80..9c0431b9c4984 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md @@ -288,6 +288,57 @@ For the default test dataset, hosted in the `landsat-pds` bucket, this is: ``` +## Testing against versioned buckets + +AWS S3 and some third party stores support versioned buckets. + +Hadoop is adding awareness of this, including + +* Using version ID to guarantee consistent reads of opened files. + [HADOOP-15625](https://issues.apache.org/jira/browse/HADOOP-15625) +* Using version ID to guarantee consistent multipart copies. +* Checks to avoid creating needless delete markers. + ++ maybe more to come. + +To test these features, you need to have buckets with object versioning +enabled. + +A full `hadoop-aws` test run implicitly cleans up all files in the bucket +in `ITestS3AContractRootDir`, so all every test run creates a large set of +old (deleted) file versions. To avoid large bills, you must +create a lifecycle rule on the bucket to purge the old versions. + + + +### How to set up a test bucket for object versioning + +1. Find the bucket in the AWS management console. +1. In the _Properties_ tab, enable versioning. +1. In the _Management_ tab, add a lifecycle rule with an "expiration" policy +to delete old versions (included deletion markers) +in 1-2 days. +1. Consider also adding an "abort all multipart uploads" option here too. + +![expiry rule](../../images/tools/hadoop-aws/delete-old-versions.png) + + +You will be billed for all old versions of every file, so this lifecycle rule _is critical_. + + +Once versioning is enabled, set change detection to `versionid` for the bucket, +so that it will be used for all IO in the test suite. + +```xml + + fs.s3a.bucket.TEST-BUCKET.change.detection.source + versionid + +``` + +To verify that the bucket has version support enabled, execute the test +`ITestS3ARemoteFileChanged` and verify that _no tests are skipped_. + ## Viewing Integration Test Reports diff --git a/hadoop-tools/hadoop-aws/src/site/resources/images/tools/hadoop-aws/delete-old-versions.png b/hadoop-tools/hadoop-aws/src/site/resources/images/tools/hadoop-aws/delete-old-versions.png new file mode 100644 index 0000000000000000000000000000000000000000..1d44df640cf592bab352ffb3b7751c4b1478b4f9 GIT binary patch literal 76055 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%0A<%?>-z}hrN&Zo}_f?84 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
  • B7irdwVkGzT1+mr{Qy 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 Date: Mon, 25 Mar 2019 14:40:46 +0000 Subject: [PATCH 3/5] HADOOP-16190: address review feedback, move to a constant string for the exception, add a test for that and an entry in the troubleshooting_s3a doc Change-Id: I71a13024a7efe32b56ecfe49fbe79529627ab126 --- .../fs/s3a/RemoteFileChangedException.java | 6 ++++++ .../apache/hadoop/fs/s3a/S3AFileSystem.java | 3 ++- .../org/apache/hadoop/fs/s3a/S3AUtils.java | 2 +- .../tools/hadoop-aws/troubleshooting_s3a.md | 19 +++++++++++++++++++ .../org/apache/hadoop/fs/s3a/TestInvoker.java | 13 +++++++++++-- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java index 9af4354f281bf..96710b9d80d87 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/RemoteFileChangedException.java @@ -32,6 +32,12 @@ @InterfaceStability.Unstable public class RemoteFileChangedException extends PathIOException { + /** + * Error message used when mapping a 412 to this exception. + */ + public static final String PRECONDITIONS_NOT_MET = + "Constraints of request were unsatisfiable"; + /** * Constructs a RemoteFileChangedException. * diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java index 3ae9e5e8cc4a2..b189e9c375340 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java @@ -2856,10 +2856,11 @@ public List listAWSPolicyRules( /** * Copy a single object in the bucket via a COPY operation. * There's no update of metadata, directory markers, etc. - * Callers must implement. + * Callers must add those. * @param srcKey source object path * @param dstKey destination object path * @param size object size + * @return the result of the copy. * @throws AmazonClientException on failures inside the AWS SDK * @throws InterruptedIOException the operation was interrupted * @throws IOException Other IO problems diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java index b6949e85de605..5e5781afe2f28 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java @@ -261,7 +261,7 @@ public static IOException translateException(@Nullable String operation, case 412: ioe = new RemoteFileChangedException(path, operation, - "Constraints of request were unsatisfiable", + RemoteFileChangedException.PRECONDITIONS_NOT_MET, ase); break; diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/troubleshooting_s3a.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/troubleshooting_s3a.md index 3123221bd8293..e11016ec3c0aa 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/troubleshooting_s3a.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/troubleshooting_s3a.md @@ -1155,6 +1155,25 @@ java.io.FileNotFoundException: Bucket stevel45r56666 does not exist Check the URI. If using a third-party store, verify that you've configured the client to talk to the specific server in `fs.s3a.endpoint`. +#### `RemoteFileChangedException`: `Constraints of request were unsatisfiable` + +This error surfaces when the S3 endpoint returns the HTTP error code 412 on +a request. + +This happens during a copy/rename when the etag of the source file +changed partway through the copy (when a large file is being copied), +or between the HEAD request to probe for the existence of the file +and the actual COPY request being initiated. + +It may also surface if a file had just overwritten an existing file, +and, due to AWS S3's eventual consistency, the HEAD request +returned a different version of the file than the COPY command. + +Fixes + +1. Don't change files while they are being copied. +1. Don't rename files or directories immediately after they've been written to/under. + ## Other Issues ### Enabling low-level logging diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java index 5da665c46b9ce..0b20c2ba03865 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java @@ -42,6 +42,7 @@ import static org.apache.hadoop.fs.s3a.Invoker.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.verifyExceptionClass; import static org.apache.hadoop.fs.s3a.S3AUtils.*; +import static org.apache.hadoop.test.GenericTestUtils.assertExceptionContains; import static org.apache.hadoop.test.LambdaTestUtils.*; /** @@ -129,10 +130,10 @@ private static AmazonS3Exception createS3Exception(int code, return ex; } - protected void verifyTranslated( + protected E verifyTranslated( int status, Class expected) throws Exception { - verifyTranslated(expected, createS3Exception(status)); + return verifyTranslated(expected, createS3Exception(status)); } private static E verifyTranslated(Class clazz, @@ -145,6 +146,14 @@ private void resetCounters() { retryCount = 0; } + @Test + public void test413isPreconditions() throws Exception { + RemoteFileChangedException ex = verifyTranslated( + 412, RemoteFileChangedException.class); + assertExceptionContains( + RemoteFileChangedException.PRECONDITIONS_NOT_MET, ex); + } + @Test public void test503isThrottled() throws Exception { verifyTranslated(503, AWSServiceThrottledException.class); From 40591d759cb75a2b11676d7cf0d0447171f5fc50 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Mon, 25 Mar 2019 15:02:17 +0000 Subject: [PATCH 4/5] HADOOP-161910 address review comments Change-Id: I46b3fc65711856b390e1a4d3b4d860113061eac8 --- .../hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md | 2 +- .../src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md index 9c0431b9c4984..5846047bcff40 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md @@ -292,7 +292,7 @@ For the default test dataset, hosted in the `landsat-pds` bucket, this is: AWS S3 and some third party stores support versioned buckets. -Hadoop is adding awareness of this, including +Hadoop is adding awareness of this, including * Using version ID to guarantee consistent reads of opened files. [HADOOP-15625](https://issues.apache.org/jira/browse/HADOOP-15625) diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java index 0b20c2ba03865..dcc59c4922b79 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestInvoker.java @@ -147,7 +147,7 @@ private void resetCounters() { } @Test - public void test413isPreconditions() throws Exception { + public void test412isPreconditions() throws Exception { RemoteFileChangedException ex = verifyTranslated( 412, RemoteFileChangedException.class); assertExceptionContains( From 5374d7475a6e45fc2acf3f0ba5745278a2021a5b Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Thu, 28 Mar 2019 23:32:34 +0000 Subject: [PATCH 5/5] HADOOP-16190: address review comments, especially incrementing the stream read version mismatch counter Change-Id: I0e3e5ac94592495d078202a0881aef4d89236e81 --- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 63 ++++++++++--------- .../site/markdown/tools/hadoop-aws/testing.md | 2 +- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java index b189e9c375340..6ab815e5550fa 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java @@ -2880,34 +2880,41 @@ private CopyResult copyFile(String srcKey, String dstKey, long size) } }; - return once("copyFile(" + srcKey + ", " + dstKey + ")", srcKey, - () -> { - ObjectMetadata srcom = getObjectMetadata(srcKey); - ObjectMetadata dstom = cloneObjectMetadata(srcom); - setOptionalObjectMetadata(dstom); - CopyObjectRequest copyObjectRequest = - new CopyObjectRequest(bucket, srcKey, bucket, dstKey); - setOptionalCopyObjectRequestParameters(copyObjectRequest); - copyObjectRequest.setCannedAccessControlList(cannedACL); - copyObjectRequest.setNewObjectMetadata(dstom); - String id = srcom.getVersionId(); - if (id != null) { - copyObjectRequest.setSourceVersionId(id); - } else if (isNotEmpty(srcom.getETag())) { - copyObjectRequest.withMatchingETagConstraint(srcom.getETag()); - } - Copy copy = transfers.copy(copyObjectRequest); - copy.addProgressListener(progressListener); - try { - CopyResult r = copy.waitForCopyResult(); - incrementWriteOperations(); - instrumentation.filesCopied(1, size); - return r; - } catch (InterruptedException e) { - throw new InterruptedIOException("Interrupted copying " + srcKey - + " to " + dstKey + ", cancelling"); - } - }); + try { + return once("copyFile(" + srcKey + ", " + dstKey + ")", srcKey, + () -> { + ObjectMetadata srcom = getObjectMetadata(srcKey); + ObjectMetadata dstom = cloneObjectMetadata(srcom); + setOptionalObjectMetadata(dstom); + CopyObjectRequest copyObjectRequest = + new CopyObjectRequest(bucket, srcKey, bucket, dstKey); + setOptionalCopyObjectRequestParameters(copyObjectRequest); + copyObjectRequest.setCannedAccessControlList(cannedACL); + copyObjectRequest.setNewObjectMetadata(dstom); + String id = srcom.getVersionId(); + if (id != null) { + copyObjectRequest.setSourceVersionId(id); + } else if (isNotEmpty(srcom.getETag())) { + copyObjectRequest.withMatchingETagConstraint(srcom.getETag()); + } + Copy copy = transfers.copy(copyObjectRequest); + copy.addProgressListener(progressListener); + try { + CopyResult r = copy.waitForCopyResult(); + incrementWriteOperations(); + instrumentation.filesCopied(1, size); + return r; + } catch (InterruptedException e) { + throw (IOException) new InterruptedIOException( + "Interrupted copying " + srcKey + " to " + dstKey + + ", cancelling").initCause(e); + } + }); + } catch (RemoteFileChangedException e) { + // file changed during the copy. Fail, after adding the counter. + instrumentation.incrementCounter(STREAM_READ_VERSION_MISMATCHES, 1); + throw e; + } } /** diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md index 5846047bcff40..c7ed3ddb90c71 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/testing.md @@ -305,7 +305,7 @@ To test these features, you need to have buckets with object versioning enabled. A full `hadoop-aws` test run implicitly cleans up all files in the bucket -in `ITestS3AContractRootDir`, so all every test run creates a large set of +in `ITestS3AContractRootDir`, so every test run creates a large set of old (deleted) file versions. To avoid large bills, you must create a lifecycle rule on the bucket to purge the old versions.