Skip to content

HADOOP-19527. Skip AAL tests if encryption is set. #7592

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@
import org.apache.hadoop.fs.contract.AbstractFSContract;

import static org.apache.hadoop.fs.s3a.S3ATestUtils.enableAnalyticsAccelerator;
import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipForAnyEncryptionExceptSSES3;

/**
* S3A contract tests for vectored reads with the Analytics stream. The analytics stream does
* not explicitly implement the vectoredRead() method, or currently do and vectored-read specific
* optimisations (such as range coalescing). However, this test ensures that the base implementation
* of readVectored {@link org.apache.hadoop.fs.PositionedReadable} still works.
* S3A contract tests for vectored reads with the Analytics stream.
* The analytics stream does not explicitly implement the vectoredRead() method,
* or currently do and vectored-read specific optimisations
* (such as range coalescing). However, this test ensures that the base
* implementation of readVectored {@link org.apache.hadoop.fs.PositionedReadable}
* still works.
*/
public class ITestS3AContractAnalyticsStreamVectoredRead extends AbstractContractVectoredReadTest {

Expand All @@ -44,6 +47,16 @@ public ITestS3AContractAnalyticsStreamVectoredRead(String bufferType) {
protected Configuration createConfiguration() {
Configuration conf = super.createConfiguration();
enableAnalyticsAccelerator(conf);
// If encryption is set, some AAL tests will fail.
// This is because AAL caches the head request response, and uses
// the eTag when making a GET request. When using encryption, the eTag is
// no longer a hash of the object content, and is not always the same when
// the same object is created multiple times. This test creates the file
// vectored_file.txt before running each test, which will have a
// different eTag when using encryption, leading to preconditioned failures.
// This issue is tracked in:
// https://github.com/awslabs/analytics-accelerator-s3/issues/218
skipForAnyEncryptionExceptSSES3(conf);
conf.set("fs.contract.vector-io-early-eof-check", "false");
return conf;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public class ITestS3AAnalyticsAcceleratorStreamReading extends AbstractS3ATestBa
@Before
public void setUp() throws Exception {
super.setup();
skipIfClientSideEncryption();
externalTestFile = getExternalData(getConfiguration());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@

import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile;
import static org.apache.hadoop.fs.impl.FlagSet.createFlagSet;
import static org.apache.hadoop.fs.s3a.S3AEncryptionMethods.SSE_S3;
import static org.apache.hadoop.fs.s3a.impl.streams.InputStreamType.Analytics;
import static org.apache.hadoop.fs.s3a.impl.streams.InputStreamType.Prefetch;
import static org.apache.hadoop.fs.s3a.impl.CallableSupplier.submit;
Expand Down Expand Up @@ -1709,6 +1710,30 @@ public static void skipIfEncryptionNotSet(Configuration configuration,
}
}

/**
* Skip a test if encryption algorithm is not empty, or if it is set to
* anything other than AES256.
*
* @param configuration configuration
*/
public static void skipForAnyEncryptionExceptSSES3(Configuration configuration) {
String bucket = getTestBucketName(configuration);
try {
final EncryptionSecrets secrets = buildEncryptionSecrets(bucket, configuration);
S3AEncryptionMethods s3AEncryptionMethods = secrets.getEncryptionMethod();

if (s3AEncryptionMethods.getMethod().equals(SSE_S3.getMethod())
|| s3AEncryptionMethods.getMethod().isEmpty()) {
return;
}

skip("Encryption method is set to " + s3AEncryptionMethods.getMethod());
} catch (IOException e) {
throw new UncheckedIOException(e);
}

}

/**
* Get the input stream statistics of an input stream.
* Raises an exception if the inner stream is not an S3A input stream
Expand Down