From 3d8f4a4eea0f37a573f7d734d71a5a0c2def6e22 Mon Sep 17 00:00:00 2001 From: fuatbasik Date: Wed, 18 Dec 2024 10:06:56 +0000 Subject: [PATCH 01/13] HADOOP-19348. Add initial support for Analytics Accelerator Library for Amazon S3 (#7192) --- hadoop-tools/hadoop-aws/pom.xml | 11 ++ .../org/apache/hadoop/fs/s3a/Constants.java | 34 ++++ .../apache/hadoop/fs/s3a/S3AFileSystem.java | 74 ++++++- .../hadoop/fs/s3a/S3ASeekableStream.java | 183 ++++++++++++++++++ .../contract/s3a/ITestS3AContractCreate.java | 11 +- .../contract/s3a/ITestS3AContractDistCp.java | 9 + .../contract/s3a/ITestS3AContractRename.java | 8 + .../s3a/ITestS3AContractVectoredRead.java | 12 ++ .../hadoop/fs/s3a/ITestS3ADelayedFNF.java | 3 + .../hadoop/fs/s3a/ITestS3AEncryptionSSEC.java | 6 +- .../fs/s3a/ITestS3AFSMainOperations.java | 18 +- .../fs/s3a/ITestS3AFileSystemContract.java | 11 +- .../fs/s3a/ITestS3AIOStatisticsContext.java | 5 + .../fs/s3a/ITestS3AInputStreamLeakage.java | 7 +- .../apache/hadoop/fs/s3a/ITestS3AMetrics.java | 5 + .../fs/s3a/ITestS3APrefetchingCacheFiles.java | 8 +- .../s3a/ITestS3APrefetchingInputStream.java | 6 +- .../s3a/ITestS3APrefetchingLruEviction.java | 6 +- .../fs/s3a/ITestS3AS3SeekableStream.java | 130 +++++++++++++ .../apache/hadoop/fs/s3a/S3ATestUtils.java | 15 ++ .../s3a/commit/ITestCommitOperationCost.java | 6 + .../s3a/commit/ITestS3ACommitterFactory.java | 3 + .../magic/ITestMagicCommitProtocol.java | 3 + .../ITestDirectoryCommitProtocol.java | 9 + .../ITestPartitionedCommitProtocol.java | 9 + .../ITestStagingCommitProtocol.java | 4 + .../ITestStagingCommitProtocolFailure.java | 12 +- .../ITestS3AFileContextStatistics.java | 4 + .../fs/s3a/impl/ITestConnectionTimeouts.java | 11 ++ .../fs/s3a/performance/ITestS3AOpenCost.java | 8 +- .../performance/ITestUnbufferDraining.java | 4 + .../ITestS3AContractStreamIOStatistics.java | 8 + .../ITestS3AFileSystemStatistic.java | 6 + 33 files changed, 618 insertions(+), 31 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java create mode 100644 hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java diff --git a/hadoop-tools/hadoop-aws/pom.xml b/hadoop-tools/hadoop-aws/pom.xml index d28704b7c334e8..f047cde9cfbfca 100644 --- a/hadoop-tools/hadoop-aws/pom.xml +++ b/hadoop-tools/hadoop-aws/pom.xml @@ -525,6 +525,17 @@ amazon-s3-encryption-client-java provided + + software.amazon.s3.analyticsaccelerator + analyticsaccelerator-s3 + 0.0.2 + compile + + + software.amazon.awssdk.crt + aws-crt + 0.29.10 + org.assertj assertj-core diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index b03c41c7bb1d23..d563181bb6155c 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -1760,4 +1760,38 @@ private Constants() { * Value: {@value}. */ public static final String S3A_IO_RATE_LIMIT = "fs.s3a.io.rate.limit"; + + + /** + * Prefix to configure Analytics Accelerator Library. + */ + public static final String ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX = + "fs.s3a.analytics.accelerator"; + + /** + * Config to enable Analytics Accelerator Library for Amazon S3. + * https://github.com/awslabs/analytics-accelerator-s3 + */ + public static final String ANALYTICS_ACCELERATOR_ENABLED_KEY = + ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX + ".enabled"; + + /** + * Config to enable usage of crt client with Analytics Accelerator Library. + * It is by default true. + */ + public static final String ANALYTICS_ACCELERATOR_CRT_ENABLED = + "fs.s3a.analytics.accelerator.crt.client"; + + /** + * Default value for {@link #ANALYTICS_ACCELERATOR_ENABLED_KEY } + * Value {@value}. + */ + public static final boolean ANALYTICS_ACCELERATOR_ENABLED_DEFAULT = false; + + /** + * Default value for {@link #ANALYTICS_ACCELERATOR_CRT_ENABLED } + * Value {@value}. + */ + public static final boolean ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT = true; + } 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 c0e530cb5ce400..e85cae3942b84d 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 @@ -54,7 +54,9 @@ import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.exception.SdkException; +import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.GetBucketLocationRequest; @@ -87,6 +89,11 @@ import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; +import software.amazon.s3.analyticsaccelerator.S3SdkObjectClient; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; +import software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration; + import org.apache.hadoop.fs.impl.prefetch.ExecutorServiceFuturePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -317,6 +324,13 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, */ private S3Client s3Client; + /** + * CRT-Based S3Client created of analytics accelerator library is enabled + * and managed by the S3AStoreImpl. Analytics accelerator library can be + * enabled with {@link Constants#ANALYTICS_ACCELERATOR_ENABLED_KEY} + */ + private S3AsyncClient s3AsyncClient; + // initial callback policy is fail-once; it's there just to assist // some mock tests and other codepaths trying to call the low level // APIs on an uninitialized filesystem. @@ -344,6 +358,11 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, // If true, the prefetching input stream is used for reads. private boolean prefetchEnabled; + // If true, S3SeekableInputStream from Analytics Accelerator for Amazon S3 will be used. + private boolean analyticsAcceleratorEnabled; + + private boolean analyticsAcceleratorCRTEnabled; + // Size in bytes of a single prefetch block. private int prefetchBlockSize; @@ -525,6 +544,11 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, */ private boolean s3AccessGrantsEnabled; + /** + * Factory to create S3SeekableInputStream if {@link this#analyticsAcceleratorEnabled} is true. + */ + private S3SeekableInputStreamFactory s3SeekableInputStreamFactory; + /** Add any deprecated keys. */ @SuppressWarnings("deprecation") private static void addDeprecatedKeys() { @@ -680,8 +704,21 @@ public void initialize(URI name, Configuration originalConf) this.prefetchBlockSize = (int) prefetchBlockSizeLong; this.prefetchBlockCount = intOption(conf, PREFETCH_BLOCK_COUNT_KEY, PREFETCH_BLOCK_DEFAULT_COUNT, 1); + + this.analyticsAcceleratorEnabled = + conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); + this.analyticsAcceleratorCRTEnabled = + conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, + ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); + this.isMultipartUploadEnabled = conf.getBoolean(MULTIPART_UPLOADS_ENABLED, - DEFAULT_MULTIPART_UPLOAD_ENABLED); + DEFAULT_MULTIPART_UPLOAD_ENABLED); + + if(this.analyticsAcceleratorEnabled && !analyticsAcceleratorCRTEnabled) { + // Temp change: Analytics Accelerator with S3AsyncClient do not support Multi-part upload. + this.isMultipartUploadEnabled = false; + } + // multipart copy and upload are the same; this just makes it explicit this.isMultipartCopyEnabled = isMultipartUploadEnabled; @@ -809,6 +846,27 @@ public void initialize(URI name, Configuration originalConf) // directly through the client manager. // this is to aid mocking. s3Client = store.getOrCreateS3Client(); + + if (this.analyticsAcceleratorEnabled) { + LOG.info("Using S3SeekableInputStream"); + if(this.analyticsAcceleratorCRTEnabled) { + LOG.info("Using S3 CRT client for analytics accelerator S3"); + this.s3AsyncClient = S3CrtAsyncClient.builder().maxConcurrency(600).build(); + } else { + LOG.info("Using S3 async client for analytics accelerator S3"); + this.s3AsyncClient = store.getOrCreateAsyncClient(); + } + + ConnectorConfiguration configuration = new ConnectorConfiguration(conf, + ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); + S3SeekableInputStreamConfiguration seekableInputStreamConfiguration = + S3SeekableInputStreamConfiguration.fromConfiguration(configuration); + this.s3SeekableInputStreamFactory = + new S3SeekableInputStreamFactory( + new S3SdkObjectClient(this.s3AsyncClient), + seekableInputStreamConfiguration); + } + // The filesystem is now ready to perform operations against // S3 // This initiates a probe against S3 for the bucket existing. @@ -1876,6 +1934,8 @@ private FSDataInputStream executeOpen( final Path path, final OpenFileSupport.OpenFileInformation fileInformation) throws IOException { + + // create the input stream statistics before opening // the file so that the time to prepare to open the file is included. S3AInputStreamStatistics inputStreamStats = @@ -1892,6 +1952,14 @@ private FSDataInputStream executeOpen( fileInformation.applyOptions(readContext); LOG.debug("Opening '{}'", readContext); + if (this.analyticsAcceleratorEnabled) { + return new FSDataInputStream( + new S3ASeekableStream( + this.bucket, + pathToKey(path), + s3SeekableInputStreamFactory)); + } + if (this.prefetchEnabled) { Configuration configuration = getConf(); initLocalDirAllocatorIfNotInitialized(configuration); @@ -4421,9 +4489,11 @@ public void close() throws IOException { protected synchronized void stopAllServices() { try { trackDuration(getDurationTrackerFactory(), FILESYSTEM_CLOSE.getSymbol(), () -> { - closeAutocloseables(LOG, store); + closeAutocloseables(LOG, store, s3SeekableInputStreamFactory); store = null; s3Client = null; + s3AsyncClient = null; + s3SeekableInputStreamFactory = null; // At this point the S3A client is shut down, // now the executor pools are closed diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java new file mode 100644 index 00000000000000..ef6a299081587d --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java @@ -0,0 +1,183 @@ +/* + * 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.apache.hadoop.fs.s3a; + +import java.io.EOFException; +import java.io.IOException; + +import org.apache.hadoop.fs.FSExceptionMessages; +import org.apache.hadoop.fs.StreamCapabilities; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.fs.FSInputStream; + +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStream; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; +import software.amazon.s3.analyticsaccelerator.util.S3URI; + +public class S3ASeekableStream extends FSInputStream implements StreamCapabilities { + + private S3SeekableInputStream inputStream; + private long lastReadCurrentPos = 0; + private final String key; + private volatile boolean closed; + + public static final Logger LOG = LoggerFactory.getLogger(S3ASeekableStream.class); + + public S3ASeekableStream(String bucket, String key, + S3SeekableInputStreamFactory s3SeekableInputStreamFactory) { + this.inputStream = s3SeekableInputStreamFactory.createStream(S3URI.of(bucket, key)); + this.key = key; + } + + /** + * Indicates whether the given {@code capability} is supported by this stream. + * + * @param capability the capability to check. + * @return true if the given {@code capability} is supported by this stream, false otherwise. + */ + @Override + public boolean hasCapability(String capability) { + return false; + } + + @Override + public int read() throws IOException { + throwIfClosed(); + int bytesRead; + try { + bytesRead = inputStream.read(); + } catch (IOException ioe) { + onReadFailure(ioe); + throw ioe; + } + return bytesRead; + } + + @Override + public void seek(long pos) throws IOException { + throwIfClosed(); + if (pos < 0) { + throw new EOFException(FSExceptionMessages.NEGATIVE_SEEK + + " " + pos); + } + inputStream.seek(pos); + } + + + @Override + public synchronized long getPos() { + if (!closed) { + lastReadCurrentPos = inputStream.getPos(); + } + return lastReadCurrentPos; + } + + + /** + * Reads the last n bytes from the stream into a byte buffer. Blocks until end of stream is + * reached. Leaves the position of the stream unaltered. + * + * @param buf buffer to read data into + * @param off start position in buffer at which data is written + * @param len the number of bytes to read; the n-th byte should be the last byte of the stream. + * @return the total number of bytes read into the buffer + * @throws IOException if an I/O error occurs + */ + public int readTail(byte[] buf, int off, int len) throws IOException { + throwIfClosed(); + int bytesRead; + try { + bytesRead = inputStream.readTail(buf, off, len); + } catch (IOException ioe) { + onReadFailure(ioe); + throw ioe; + } + return bytesRead; + } + + @Override + public int read(byte[] buf, int off, int len) throws IOException { + throwIfClosed(); + int bytesRead; + try { + bytesRead = inputStream.read(buf, off, len); + } catch (IOException ioe) { + onReadFailure(ioe); + throw ioe; + } + return bytesRead; + } + + + @Override + public boolean seekToNewSource(long l) throws IOException { + return false; + } + + @Override + public int available() throws IOException { + throwIfClosed(); + return super.available(); + } + + @Override + public synchronized void close() throws IOException { + if(!closed) { + closed = true; + try { + inputStream.close(); + inputStream = null; + super.close(); + } catch (IOException ioe) { + LOG.debug("Failure closing stream {}: ", key); + throw ioe; + } + } + } + + /** + * Close the stream on read failure. + * No attempt to recover from failure + * + * @param ioe exception caught. + */ + @Retries.OnceTranslated + private void onReadFailure(IOException ioe) throws IOException { + if (LOG.isDebugEnabled()) { + LOG.debug("Got exception while trying to read from stream {}, " + + "not trying to recover:", + key, ioe); + } else { + LOG.info("Got exception while trying to read from stream {}, " + + "not trying to recover:", + key, ioe); + } + this.close(); + } + + + protected void throwIfClosed() throws IOException { + if (closed) { + throw new IOException(key + ": " + FSExceptionMessages.STREAM_IS_CLOSED); + } + } +} \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractCreate.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractCreate.java index 000caf328837e6..fd569422b429e3 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractCreate.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractCreate.java @@ -30,8 +30,7 @@ import org.apache.hadoop.fs.s3a.S3ATestUtils; import static org.apache.hadoop.fs.s3a.Constants.CONNECTION_EXPECT_CONTINUE; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.setPerformanceFlags; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; /** * S3A contract tests creating files. @@ -88,6 +87,14 @@ protected Configuration createConfiguration() { return conf; } + @Override + public void testOverwriteExistingFile() throws Throwable { + // Will remove this when Analytics Accelerator supports overwrites + skipIfAnalyticsAcceleratorEnabled(this.createConfiguration(), + "Analytics Accelerator does not support overwrites yet"); + super.testOverwriteExistingFile(); + } + @Override public void testOverwriteNonEmptyDirectory() throws Throwable { try { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractDistCp.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractDistCp.java index e761e0d14bf831..f6127700b5f1fb 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractDistCp.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractDistCp.java @@ -20,6 +20,7 @@ import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3ATestConstants.SCALE_TEST_TIMEOUT_MILLIS; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.StorageStatistics; @@ -78,6 +79,14 @@ public void testNonDirectWrite() throws Exception { getRenameOperationCount() - renames); } + @Override + public void testDistCpUpdateCheckFileSkip() throws Exception { + //Will remove this when Analytics Accelerator supports overwrites + skipIfAnalyticsAcceleratorEnabled(createConfiguration(), + "Analytics Accelerator Library does not support update to existing files"); + super.testDistCpUpdateCheckFileSkip(); + } + private long getRenameOperationCount() { return getFileSystem().getStorageStatistics() .getLong(StorageStatistics.CommonStatisticNames.OP_RENAME); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractRename.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractRename.java index d3ba7373cc944a..9f5246d9ddec50 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractRename.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractRename.java @@ -36,6 +36,7 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.verifyFileContents; import static org.apache.hadoop.fs.contract.ContractTestUtils.writeDataset; import static org.apache.hadoop.fs.s3a.S3ATestConstants.S3A_TEST_TIMEOUT; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; /** * S3A contract tests covering rename. @@ -45,6 +46,13 @@ public class ITestS3AContractRename extends AbstractContractRenameTest { public static final Logger LOG = LoggerFactory.getLogger( ITestS3AContractRename.class); + @Override + public void setup() throws Exception { + super.setup(); + skipIfAnalyticsAcceleratorEnabled(createConfiguration(), + "Analytics Accelerator does not support rename"); + + } @Override protected int getTestTimeoutMillis() { return S3A_TEST_TIMEOUT; diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractVectoredRead.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractVectoredRead.java index 8096f55bcd54c0..41aa90434cdd3b 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractVectoredRead.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractVectoredRead.java @@ -61,6 +61,7 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.range; import static org.apache.hadoop.fs.contract.ContractTestUtils.returnBuffersToPoolPostRead; import static org.apache.hadoop.fs.contract.ContractTestUtils.validateVectoredReadResult; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValue; import static org.apache.hadoop.fs.statistics.IOStatisticsLogging.ioStatisticsToPrettyString; import static org.apache.hadoop.test.LambdaTestUtils.interceptFuture; @@ -84,6 +85,17 @@ protected AbstractFSContract createContract(Configuration conf) { return new S3AContract(conf); } + /** + * Analytics Accelerator Library for Amazon S3 does not support Vectored Reads. + * @throws Exception + */ + @Override + public void setup() throws Exception { + skipIfAnalyticsAcceleratorEnabled(createConfiguration(), + "Analytics Accelerator does not support vectored reads"); + super.setup(); + } + /** * Verify response to a vector read request which is beyond the * real length of the file. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ADelayedFNF.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ADelayedFNF.java index ca9d185c3e9e11..4793092b717dd2 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ADelayedFNF.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ADelayedFNF.java @@ -36,6 +36,7 @@ import static org.apache.hadoop.fs.s3a.Constants.RETRY_INTERVAL; import static org.apache.hadoop.fs.s3a.Constants.RETRY_LIMIT; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; /** * Tests behavior of a FileNotFound error that happens after open(), i.e. on @@ -65,6 +66,8 @@ protected Configuration createConfiguration() { */ @Test public void testNotFoundFirstRead() throws Exception { + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Temporarily disabling to fix Exception handling on Analytics Accelerator"); S3AFileSystem fs = getFileSystem(); ChangeDetectionPolicy changeDetectionPolicy = fs.getChangeDetectionPolicy(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AEncryptionSSEC.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AEncryptionSSEC.java index d22de3b06d81b5..12e5ef3841a643 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AEncryptionSSEC.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AEncryptionSSEC.java @@ -38,9 +38,7 @@ import static org.apache.hadoop.fs.s3a.Constants.S3_ENCRYPTION_KEY; import static org.apache.hadoop.fs.s3a.Constants.SERVER_SIDE_ENCRYPTION_ALGORITHM; import static org.apache.hadoop.fs.s3a.Constants.SERVER_SIDE_ENCRYPTION_KEY; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.maybeSkipRootTests; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** @@ -93,6 +91,8 @@ protected Configuration createConfiguration() { @Override public void setup() throws Exception { super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Analytics Accelerator does not support SSEC"); assumeEnabled(); // although not a root dir test, this confuses paths enough it shouldn't be run in // parallel with other jobs diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFSMainOperations.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFSMainOperations.java index 0281c57f5cbce5..1d3806e75e329f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFSMainOperations.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFSMainOperations.java @@ -29,9 +29,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.contract.s3a.S3AContract; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.createTestPath; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.isCreatePerformanceEnabled; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.setPerformanceFlags; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; /** * S3A Test suite for the FSMainOperationsBaseTest tests. @@ -78,6 +76,20 @@ public void testCopyToLocalWithUseRawLocalFileSystemOption() throws Exception { } + @Override + public void testWriteReadAndDeleteOneAndAHalfBlocks() throws Exception { + // Skipping this test for AnalyticsAccelerator as it is acting as an overwrite test + skipIfAnalyticsAcceleratorEnabled(this.contract.getConf(), + "Analytics Accelerator does not support overwrites"); + } + + @Override + public void testWriteReadAndDeleteTwoBlocks() throws Exception { + // Skipping this test for AnalyticsAccelerator as it is acting as an overwrite test + skipIfAnalyticsAcceleratorEnabled(this.contract.getConf(), + "Analytics Accelerator does not support overwrites"); + } + @Override public void testOverwrite() throws IOException { boolean createPerformance = isCreatePerformanceEnabled(fSys); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileSystemContract.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileSystemContract.java index 48081457658220..32d9a511a41596 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileSystemContract.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileSystemContract.java @@ -34,8 +34,7 @@ import org.apache.hadoop.fs.Path; import static org.apache.hadoop.fs.contract.ContractTestUtils.skip; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.isCreatePerformanceEnabled; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.setPerformanceFlags; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.test.LambdaTestUtils.intercept; import static org.junit.Assume.*; import static org.junit.Assert.*; @@ -160,4 +159,12 @@ public void testOverwrite() throws IOException { } } } + + @Override + public void testOverWriteAndRead() throws Exception { + //Will remove this when Analytics Accelerator supports overwrites + skipIfAnalyticsAcceleratorEnabled(fs.getConf(), + "Analytics Accelerator does not support overwrites"); + super.testOverWriteAndRead(); + } } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AIOStatisticsContext.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AIOStatisticsContext.java index 70dc5ee476c479..005b2fbf91d418 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AIOStatisticsContext.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AIOStatisticsContext.java @@ -43,6 +43,7 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset; import static org.apache.hadoop.fs.contract.ContractTestUtils.writeDataset; import static org.apache.hadoop.fs.s3a.S3ATestUtils.disablePrefetching; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticCounter; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValue; import static org.apache.hadoop.fs.statistics.StreamStatisticNames.STREAM_READ_BYTES; @@ -77,6 +78,10 @@ protected Configuration createConfiguration() { public void setup() throws Exception { super.setup(); executor = HadoopExecutors.newFixedThreadPool(SMALL_THREADS); + // TODO: Add IOStatistics Support to S3SeekableStream + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3SeekableStream does not support IOStatisticsContext"); + } @Override diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java index 4b871c6a197db7..4d8956d38e7bef 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java @@ -34,6 +34,7 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset; import static org.apache.hadoop.fs.s3a.S3ATestUtils.assume; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticCounter; import static org.apache.hadoop.fs.statistics.StreamStatisticNames.STREAM_LEAKS; import static org.apache.hadoop.test.GenericTestUtils.LogCapturer.captureLogs; @@ -58,7 +59,7 @@ public class ITestS3AInputStreamLeakage extends AbstractS3ATestBase { @Override public void setup() throws Exception { super.setup(); - assume("Stream leak detection not avaialable", + assume("Stream leak detection not available", getFileSystem().hasCapability(STREAM_LEAKS)); } @@ -89,6 +90,10 @@ public void setup() throws Exception { @Test public void testFinalizer() throws Throwable { Path path = methodPath(); + // TODO: Add Leak Detection to S3SeekableStream + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3SeekableStream does not support leak detection"); + final S3AFileSystem fs = getFileSystem(); ContractTestUtils.createFile(fs, path, true, DATASET); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetrics.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetrics.java index 3bfe69c2bca91b..61d159996357fd 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetrics.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetrics.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.InputStream; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.statistics.IOStatisticsLogging.ioStatisticsSourceToString; /** @@ -51,6 +52,10 @@ public void testMetricsRegister() @Test public void testStreamStatistics() throws IOException { + // TODO: Add StreamStatistics support to S3SeekableStream + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3SeekableStream does not support stream statistics"); + S3AFileSystem fs = getFileSystem(); Path file = path("testStreamStatistics"); byte[] data = "abcdefghijklmnopqrstuvwxyz".getBytes(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java index 5e6731ed520ad1..5e37e68d8bea72 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java @@ -37,10 +37,7 @@ import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.s3a.performance.AbstractS3ACostTest; -import static org.apache.hadoop.fs.s3a.Constants.BUFFER_DIR; -import static org.apache.hadoop.fs.s3a.Constants.ENDPOINT; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; +import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils.getExternalData; import static org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils.isUsingDefaultExternalDataFile; import static org.apache.hadoop.io.IOUtils.cleanupWithLogger; @@ -77,7 +74,6 @@ public void setUp() throws Exception { super.setup(); // Sets BUFFER_DIR by calling S3ATestUtils#prepareTestConfiguration conf = createConfiguration(); - testFile = getExternalData(conf); prefetchBlockSize = conf.getInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); fs = FileSystem.get(testFile.toUri(), conf); @@ -98,6 +94,8 @@ public Configuration createConfiguration() { final String bufferDirBase = configuration.get(BUFFER_DIR); bufferDir = bufferDirBase + "/" + UUID.randomUUID(); configuration.set(BUFFER_DIR, bufferDir); + // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used + configuration.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return configuration; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java index 4998cbc946e12c..b97be9d18e9146 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java @@ -34,8 +34,7 @@ import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.test.LambdaTestUtils; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; +import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticMaximum; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValue; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticGaugeValue; @@ -75,6 +74,7 @@ public ITestS3APrefetchingInputStream() { private static final int INTERVAL_MILLIS = 500; private static final int BLOCK_SIZE = S_1K * 10; + @Override public Configuration createConfiguration() { Configuration conf = super.createConfiguration(); @@ -82,6 +82,8 @@ public Configuration createConfiguration() { S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_BLOCK_SIZE_KEY); conf.setBoolean(PREFETCH_ENABLED_KEY, true); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); + // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used + conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return conf; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java index 0fa08f37cf9091..8aefcc8535af6a 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java @@ -42,9 +42,7 @@ import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.test.LambdaTestUtils; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_MAX_BLOCKS_COUNT; +import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticCounter; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValues; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticGaugeValue; @@ -93,6 +91,8 @@ public Configuration createConfiguration() { conf.setBoolean(PREFETCH_ENABLED_KEY, true); conf.setInt(PREFETCH_MAX_BLOCKS_COUNT, Integer.parseInt(maxBlocks)); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); + // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used + conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return conf; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java new file mode 100644 index 00000000000000..c6ecee95051010 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java @@ -0,0 +1,130 @@ +/* + * 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.apache.hadoop.fs.s3a; + +import java.io.IOException; + +import org.junit.Test; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FSDataInputStream; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; + +import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX; +import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_ENABLED_KEY; +import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_CRT_ENABLED; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; + +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; +import software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration; +import software.amazon.s3.analyticsaccelerator.util.PrefetchMode; + +public class ITestS3AS3SeekableStream extends AbstractS3ATestBase { + + private static final String PHYSICAL_IO_PREFIX = "physicalio"; + private static final String LOGICAL_IO_PREFIX = "logicalio"; + + public void testConnectorFrameWorkIntegration(boolean useCrtClient) throws IOException { + describe("Verify S3 connector framework integration"); + + Configuration conf = getConfiguration(); + removeBaseAndBucketOverrides(conf, ANALYTICS_ACCELERATOR_ENABLED_KEY); + conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, true); + conf.setBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, useCrtClient); + + String testFile = "s3a://noaa-cors-pds/raw/2023/017/ohfh/OHFH017d.23_.gz"; + S3AFileSystem s3AFileSystem = + (S3AFileSystem) FileSystem.newInstance(new Path(testFile).toUri(), conf); + byte[] buffer = new byte[500]; + + try (FSDataInputStream inputStream = s3AFileSystem.open(new Path(testFile))) { + inputStream.seek(5); + inputStream.read(buffer, 0, 500); + } + + } + + @Test + public void testConnectorFrameWorkIntegrationWithCrtClient() throws IOException { + testConnectorFrameWorkIntegration(true); + } + + @Test + public void testConnectorFrameWorkIntegrationWithoutCrtClient() throws IOException { + testConnectorFrameWorkIntegration(false); + } + + public void testConnectorFrameworkConfigurable(boolean useCrtClient) { + describe("Verify S3 connector framework reads configuration"); + + Configuration conf = getConfiguration(); + removeBaseAndBucketOverrides(conf); + + //Disable Predictive Prefetching + conf.set(ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX + + "." + LOGICAL_IO_PREFIX + ".prefetching.mode", "all"); + + //Set Blobstore Capacity + conf.setInt(ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX + + "." + PHYSICAL_IO_PREFIX + ".blobstore.capacity", 1); + + conf.setBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, useCrtClient); + + ConnectorConfiguration connectorConfiguration = + new ConnectorConfiguration(conf, ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); + + S3SeekableInputStreamConfiguration configuration = + S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration); + + assertSame("S3ASeekableStream configuration is not set to expected value", + PrefetchMode.ALL, configuration.getLogicalIOConfiguration().getPrefetchingMode()); + + assertEquals("S3ASeekableStream configuration is not set to expected value", + 1, configuration.getPhysicalIOConfiguration().getBlobStoreCapacity()); + } + + @Test + public void testConnectorFrameworkConfigurableWithoutCrtClient() throws IOException { + testConnectorFrameworkConfigurable(false); + } + + @Test + public void testConnectorFrameworkConfigurableWithCrtClient() throws IOException { + testConnectorFrameworkConfigurable(true); + } + + @Test + public void testInvalidConfigurationThrows() { + describe("Verify S3 connector framework throws with invalid configuration"); + + Configuration conf = getConfiguration(); + removeBaseAndBucketOverrides(conf); + //Disable Sequential Prefetching + conf.setInt(ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX + + "." + PHYSICAL_IO_PREFIX + ".blobstore.capacity", -1); + + ConnectorConfiguration connectorConfiguration = + new ConnectorConfiguration(conf, ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); + assertThrows("S3ASeekableStream illegal configuration does not throw", + IllegalArgumentException.class, () -> + S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration)); + } +} diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java index 308838c2927fa6..e9ebd98169fa4c 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java @@ -574,6 +574,21 @@ public static boolean isS3ExpressTestBucket(final Configuration conf) { return S3ExpressStorage.isS3ExpressStore(getTestBucketName(conf), ""); } + /** + * Skip a test if the Analytics Accelerator Library for Amazon S3 is enabled. + * @param configuration configuration to probe + */ + public static void skipIfAnalyticsAcceleratorEnabled( + Configuration configuration, String message) { + assume(message, + !isAnalyticsAcceleratorEnabled(configuration)); + } + + public static boolean isAnalyticsAcceleratorEnabled(final Configuration conf) { + return conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, + ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); + } + /** * Skip a test if the filesystem lacks a required capability. * @param fs filesystem diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java index fbe1a0a3120bc3..9041a20aeeb6c1 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java @@ -40,6 +40,7 @@ import org.apache.hadoop.fs.s3a.performance.AbstractS3ACostTest; import org.apache.hadoop.fs.statistics.IOStatisticsLogging; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.Statistic.ACTION_HTTP_GET_REQUEST; import static org.apache.hadoop.fs.s3a.Statistic.COMMITTER_MAGIC_FILES_CREATED; import static org.apache.hadoop.fs.s3a.Statistic.COMMITTER_MAGIC_MARKER_PUT; @@ -203,6 +204,9 @@ private void abortActiveStream() throws IOException { @Test public void testCostOfCreatingMagicFile() throws Throwable { describe("Files created under magic paths skip existence checks and marker deletes"); + + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3ASeekableInputStream does not support InputStreamStatistics"); S3AFileSystem fs = getFileSystem(); Path destFile = methodSubPath("file.txt"); fs.delete(destFile.getParent(), true); @@ -282,6 +286,8 @@ public void testCostOfCreatingMagicFile() throws Throwable { public void testCostOfSavingLoadingPendingFile() throws Throwable { describe("Verify costs of saving .pending file under a magic path"); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3ASeekableInputStream does not support InputStreamStatistics"); S3AFileSystem fs = getFileSystem(); Path partDir = methodSubPath("file.pending"); Path destFile = new Path(partDir, "file.pending"); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java index 2561a69f60b59c..a500bfb76a322d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java @@ -47,6 +47,7 @@ import org.apache.hadoop.security.UserGroupInformation; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.*; import static org.apache.hadoop.fs.s3a.commit.InternalCommitterConstants.COMMITTER_NAME_STAGING; import static org.apache.hadoop.test.LambdaTestUtils.intercept; @@ -182,6 +183,8 @@ public void setup() throws Exception { // destroy all filesystems from previous runs. FileSystem.closeAllForUGI(UserGroupInformation.getCurrentUser()); super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3ASeekableInputStream does not support InputStreamStatistics"); jobId = randomJobId(); attempt0 = "attempt_" + jobId + "_m_000000_0"; taskAttempt0 = TaskAttemptID.forName(attempt0); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java index cbfc23a2a29b6d..b89740ae3120cf 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java @@ -46,6 +46,7 @@ import org.junit.runners.Parameterized; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.S3AUtils.listAndFilter; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.*; import static org.apache.hadoop.fs.s3a.commit.impl.CommitUtilsWithMR.getMagicJobPath; @@ -77,6 +78,8 @@ protected String getCommitterName() { @Override public void setup() throws Exception { super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3ASeekableInputStream does not support InputStreamStatistics"); CommitUtils.verifyIsMagicCommitFS(getFileSystem()); } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestDirectoryCommitProtocol.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestDirectoryCommitProtocol.java index b19662c0117fd9..cbd41fd1c93e6f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestDirectoryCommitProtocol.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestDirectoryCommitProtocol.java @@ -35,6 +35,7 @@ import org.apache.hadoop.mapreduce.JobStatus; import org.apache.hadoop.mapreduce.TaskAttemptContext; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.CONFLICT_MODE_APPEND; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.FS_S3A_COMMITTER_STAGING_CONFLICT_MODE; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.S3A_COMMITTER_EXPERIMENTAL_COLLECT_IOSTATISTICS; @@ -42,6 +43,14 @@ /** ITest of the low level protocol methods. */ public class ITestDirectoryCommitProtocol extends ITestStagingCommitProtocol { + + @Override + public void setup() throws Exception { + super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Skipping because these tests will fail when using CRT client"); + } + @Override protected String suitename() { return "ITestDirectoryCommitProtocol"; diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestPartitionedCommitProtocol.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestPartitionedCommitProtocol.java index e3bc1500dab7c2..b6438157e4e36d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestPartitionedCommitProtocol.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestPartitionedCommitProtocol.java @@ -32,10 +32,19 @@ import org.apache.hadoop.mapreduce.TaskAttemptContext; import static org.apache.hadoop.fs.contract.ContractTestUtils.skip; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; /** ITest of the low level protocol methods. */ public class ITestPartitionedCommitProtocol extends ITestStagingCommitProtocol { + + @Override + public void setup() throws Exception { + super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Skipping because these tests will fail when using CRT client"); + } + @Override protected String suitename() { return "ITestPartitionedCommitProtocol"; diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocol.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocol.java index 81c3af812ab95d..d2b4e1c52956b4 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocol.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocol.java @@ -41,6 +41,7 @@ import org.apache.hadoop.mapreduce.JobStatus; import org.apache.hadoop.mapreduce.TaskAttemptContext; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.*; /** Test the staging committer's handling of the base protocol operations. */ @@ -65,6 +66,9 @@ protected Configuration createConfiguration() { @Override public void setup() throws Exception { super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Skipping because these tests will fail when using CRT client"); + // identify working dir for staging and delete Configuration conf = getConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocolFailure.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocolFailure.java index 08b6c21a863d5b..5604aa76369680 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocolFailure.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/staging/integration/ITestStagingCommitProtocolFailure.java @@ -32,9 +32,7 @@ import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl; import static org.apache.hadoop.fs.s3a.Constants.MULTIPART_UPLOADS_ENABLED; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.disableFilesystemCaching; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.FS_S3A_COMMITTER_NAME; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.S3A_COMMITTER_FACTORY_KEY; import static org.apache.hadoop.test.LambdaTestUtils.intercept; @@ -45,6 +43,14 @@ */ public class ITestStagingCommitProtocolFailure extends AbstractS3ATestBase { + + @Override + public void setup() throws Exception { + super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Skipping because these tests will fail when using CRT client"); + } + @Override protected Configuration createConfiguration() { Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/fileContext/ITestS3AFileContextStatistics.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/fileContext/ITestS3AFileContextStatistics.java index 1724006a831985..dc086f7c4237f9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/fileContext/ITestS3AFileContextStatistics.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/fileContext/ITestS3AFileContextStatistics.java @@ -30,6 +30,8 @@ import org.junit.Assert; import org.junit.Before; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; + /** * S3a implementation of FCStatisticsBaseTest. */ @@ -44,6 +46,8 @@ public class ITestS3AFileContextStatistics extends FCStatisticsBaseTest { @Before public void setUp() throws Exception { conf = new Configuration(); + skipIfAnalyticsAcceleratorEnabled(conf, + "S3SeekableStream does not support File Context Statistics"); fc = S3ATestUtils.createTestFileContext(conf); testRootPath = fileContextTestHelper.getTestRootPath(fc, "test"); fc.mkdir(testRootPath, diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java index a4cc5cadc5da0f..2a6605b93421ff 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java @@ -60,6 +60,7 @@ import static org.apache.hadoop.fs.s3a.Constants.RETRY_LIMIT; import static org.apache.hadoop.fs.s3a.Constants.SOCKET_TIMEOUT; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.MAGIC_PATH_PREFIX; import static org.apache.hadoop.fs.s3a.impl.ConfigurationHelper.setDurationAsMillis; import static org.apache.hadoop.test.LambdaTestUtils.intercept; @@ -146,6 +147,11 @@ public void teardown() throws Exception { @Test public void testGeneratePoolTimeouts() throws Throwable { skipIfClientSideEncryption(); + + // Assertions will fail when using CRTClient with Analytics Accelerator. + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Assertions will fail when using CRTClient with Analytics Accelerator"); + AWSClientConfig.setMinimumOperationDuration(Duration.ZERO); Configuration conf = timingOutConfiguration(); Path path = methodPath(); @@ -188,6 +194,11 @@ public void testGeneratePoolTimeouts() throws Throwable { @Test public void testObjectUploadTimeouts() throws Throwable { skipIfClientSideEncryption(); + + // Assertions will fail when using CRTClient with Analytics Accelerator. + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Assertions will fail when using CRTClient with Analytics Accelerator"); + AWSClientConfig.setMinimumOperationDuration(Duration.ZERO); final Path dir = methodPath(); Path file = new Path(dir, "file"); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java index 8e61225e17ef54..c07c5dd5086c04 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java @@ -54,10 +54,7 @@ import static org.apache.hadoop.fs.s3a.Constants.CHECKSUM_VALIDATION; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_DEFAULT; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.assertStreamIsNotChecksummed; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.disableFilesystemCaching; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.getS3AInputStream; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.fs.s3a.Statistic.STREAM_READ_BYTES_READ_CLOSE; import static org.apache.hadoop.fs.s3a.Statistic.STREAM_READ_OPENED; import static org.apache.hadoop.fs.s3a.Statistic.STREAM_READ_SEEK_BYTES_SKIPPED; @@ -114,6 +111,8 @@ public Configuration createConfiguration() { @Override public void setup() throws Exception { super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Assertions will fail as S3SeekableStream does not support Stream Statistics"); S3AFileSystem fs = getFileSystem(); testFile = methodPath(); @@ -392,7 +391,6 @@ public void testPositionedReadableReadPastEOF() throws Throwable { describe("PositionedReadable.read() past the end of the file"); assumeNoPrefetching(); - verifyMetrics(() -> { try (FSDataInputStream in = openFile(longLen, FS_OPTION_OPENFILE_READ_POLICY_RANDOM)) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java index 00bae1519f5ebe..a0dec8d476bda9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java @@ -54,6 +54,7 @@ import static org.apache.hadoop.fs.s3a.Constants.RETRY_LIMIT; import static org.apache.hadoop.fs.s3a.Constants.SOCKET_TIMEOUT; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.impl.ConfigurationHelper.setDurationAsSeconds; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValue; import static org.apache.hadoop.fs.statistics.IOStatisticsSupport.retrieveIOStatistics; @@ -125,6 +126,9 @@ public Configuration createConfiguration() { @Override public void setup() throws Exception { super.setup(); + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "Skipping because getS3AInputStream will " + + "try to cast S3SeekableStream to S3AInputStream"); // now create a new FS with minimal http capacity and recovery // a separate one is used to avoid test teardown suffering diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AContractStreamIOStatistics.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AContractStreamIOStatistics.java index 0f6b69cd54d890..2b332b2b3ee248 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AContractStreamIOStatistics.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AContractStreamIOStatistics.java @@ -27,6 +27,7 @@ import org.apache.hadoop.fs.contract.s3a.S3AContract; import org.apache.hadoop.fs.statistics.StreamStatisticNames; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.statistics.StreamStatisticNames.*; /** @@ -78,4 +79,11 @@ public List outputStreamStatisticKeys() { STREAM_WRITE_EXCEPTIONS); } + @Override + public void setup() throws Exception { + super.setup(); + skipIfAnalyticsAcceleratorEnabled(createConfiguration(), + "S3SeekableStream does not support Stream Statistics"); + } + } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java index 0d5d2a789a02a5..5a3f7bb8fdbb28 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java @@ -31,6 +31,8 @@ import org.apache.hadoop.fs.statistics.IOStatisticAssertions; import org.apache.hadoop.fs.statistics.StreamStatisticNames; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; + public class ITestS3AFileSystemStatistic extends AbstractS3ATestBase { private static final int ONE_KB = 1024; @@ -42,6 +44,10 @@ public class ITestS3AFileSystemStatistic extends AbstractS3ATestBase { */ @Test public void testBytesReadWithStream() throws IOException { + // Assertions will fail as {@link S3ASeekableInputStream} + // do not support S3AFileSystemStatistics yet. + skipIfAnalyticsAcceleratorEnabled(getConfiguration(), + "S3SeekableStream does not support File System Statistics"); S3AFileSystem fs = getFileSystem(); Path filePath = path(getMethodName()); byte[] oneKbBuf = new byte[ONE_KB]; From d6db6b2b430e07ade0e2ca5fbbea5e5ba7c59c6d Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Fri, 6 Dec 2024 18:37:40 +0000 Subject: [PATCH 02/13] HADOOP-19354. S3AInputStream to be created by factory under S3AStore First iteration * Factory interface with a parameter object creation method * Base class AbstractS3AInputStream for all streams to create * S3AInputStream subclasses that and has a factory * Production and test code to use it Not done * Input stream callbacks pushed down to S3Store * S3Store to dynamically choose factory at startup, stop in close() * S3Store to implement the factory interface, completing final binding operations (callbacks, stats) Change-Id: I8d0f86ca1f3463d4987a43924f155ce0c0644180 --- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 127 +++--- .../apache/hadoop/fs/s3a/S3AInputStream.java | 361 +++++------------- .../hadoop/fs/s3a/S3AReadOpContext.java | 2 +- .../org/apache/hadoop/fs/s3a/S3AStore.java | 31 +- .../hadoop/fs/s3a/impl/ClientManager.java | 4 - .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 68 +++- .../s3a/prefetch/S3ACachingInputStream.java | 4 +- .../s3a/prefetch/S3AInMemoryInputStream.java | 4 +- .../prefetch/S3APrefetchingInputStream.java | 4 +- .../fs/s3a/prefetch/S3ARemoteInputStream.java | 6 +- .../fs/s3a/prefetch/S3ARemoteObject.java | 5 +- .../s3a/streams/AbstractS3AInputStream.java | 320 ++++++++++++++++ .../streams/ClassicInputStreamFactory.java | 41 ++ .../s3a/streams/FactoryStreamParameters.java | 148 +++++++ .../fs/s3a/streams/InputStreamFactory.java | 49 +++ .../fs/s3a/streams/StreamReadCallbacks.java | 64 ++++ .../hadoop/fs/s3a/streams/package-info.java | 28 ++ .../fs/contract/s3a/ITestS3AContractSeek.java | 2 +- .../hadoop/fs/s3a/ITestS3AConfiguration.java | 18 +- .../fs/s3a/TestS3AInputStreamRetry.java | 26 +- .../fs/s3a/prefetch/MockS3ARemoteObject.java | 6 +- .../fs/s3a/prefetch/S3APrefetchFakes.java | 12 +- .../prefetch/TestS3ARemoteInputStream.java | 4 +- .../fs/s3a/prefetch/TestS3ARemoteObject.java | 4 +- .../src/test/resources/log4j.properties | 4 + 25 files changed, 963 insertions(+), 379 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java 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 e85cae3942b84d..bd35594a557a8a 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 @@ -159,6 +159,10 @@ import org.apache.hadoop.fs.s3a.impl.UploadContentProviders; import org.apache.hadoop.fs.s3a.impl.CSEUtils; import org.apache.hadoop.fs.s3a.prefetch.S3APrefetchingInputStream; +import org.apache.hadoop.fs.s3a.streams.ClassicInputStreamFactory; +import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; +import org.apache.hadoop.fs.s3a.streams.InputStreamFactory; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperations; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperationsImpl; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -312,9 +316,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, private String username; - /** - * Store back end. - */ private S3AStore store; /** @@ -376,7 +377,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, /** Log to warn of storage class configuration problems. */ private static final LogExactlyOnce STORAGE_CLASS_WARNING = new LogExactlyOnce(LOG); - private LocalDirAllocator directoryAllocator; private String cannedACL; /** @@ -840,12 +840,12 @@ public void initialize(URI name, Configuration originalConf) s3AccessGrantsEnabled = conf.getBoolean(AWS_S3_ACCESS_GRANTS_ENABLED, false); int rateLimitCapacity = intOption(conf, S3A_IO_RATE_LIMIT, DEFAULT_S3A_IO_RATE_LIMIT, 0); - // now create the store + // now create and initialize the store store = createS3AStore(clientManager, rateLimitCapacity); // the s3 client is created through the store, rather than // directly through the client manager. // this is to aid mocking. - s3Client = store.getOrCreateS3Client(); + s3Client = getStore().getOrCreateS3Client(); if (this.analyticsAcceleratorEnabled) { LOG.info("Using S3SeekableInputStream"); @@ -909,7 +909,7 @@ private S3AFileSystemOperations createFileSystemHandler() { /** - * Create the S3AStore instance. + * Create and start the S3AStore instance. * This is protected so that tests can override it. * @param clientManager client manager * @param rateLimitCapacity rate limit @@ -918,7 +918,7 @@ private S3AFileSystemOperations createFileSystemHandler() { @VisibleForTesting protected S3AStore createS3AStore(final ClientManager clientManager, final int rateLimitCapacity) { - return new S3AStoreBuilder() + final S3AStore st = new S3AStoreBuilder() .withAuditSpanSource(getAuditManager()) .withClientManager(clientManager) .withDurationTrackerFactory(getDurationTrackerFactory()) @@ -930,6 +930,9 @@ protected S3AStore createS3AStore(final ClientManager clientManager, .withReadRateLimiter(unlimitedRate()) .withWriteRateLimiter(RateLimitingFactory.create(rateLimitCapacity)) .build(); + st.init(getConf()); + st.start(); + return st; } /** @@ -1402,6 +1405,15 @@ public FlagSet getPerformanceFlags() { return performanceFlags; } + + /** + * Get the store for low-level operations. + * @return the store the S3A FS is working through. + */ + private S3AStore getStore() { + return store; + } + /** * Implementation of all operations used by delegation tokens. */ @@ -1607,7 +1619,7 @@ public S3Client getAmazonS3Client(String reason) { @Override public S3AStore getStore() { - return store; + return S3AFileSystem.this.getStore(); } /** @@ -1736,28 +1748,8 @@ public S3AEncryptionMethods getS3EncryptionAlgorithm() { */ File createTmpFileForWrite(String pathStr, long size, Configuration conf) throws IOException { - initLocalDirAllocatorIfNotInitialized(conf); - Path path = directoryAllocator.getLocalPathForWrite(pathStr, - size, conf); - File dir = new File(path.getParent().toUri().getPath()); - String prefix = path.getName(); - // create a temp file on this directory - return File.createTempFile(prefix, null, dir); - } - /** - * Initialize dir allocator if not already initialized. - * - * @param conf The Configuration object. - */ - private void initLocalDirAllocatorIfNotInitialized(Configuration conf) { - if (directoryAllocator == null) { - synchronized (this) { - String bufferDir = conf.get(BUFFER_DIR) != null - ? BUFFER_DIR : HADOOP_TMP_DIR; - directoryAllocator = new LocalDirAllocator(bufferDir); - } - } + return getS3AInternals().getStore().createTemporaryFileForWriting(pathStr, size, conf); } /** @@ -1934,8 +1926,6 @@ private FSDataInputStream executeOpen( final Path path, final OpenFileSupport.OpenFileInformation fileInformation) throws IOException { - - // create the input stream statistics before opening // the file so that the time to prepare to open the file is included. S3AInputStreamStatistics inputStreamStats = @@ -1962,7 +1952,7 @@ private FSDataInputStream executeOpen( if (this.prefetchEnabled) { Configuration configuration = getConf(); - initLocalDirAllocatorIfNotInitialized(configuration); + return new FSDataInputStream( new S3APrefetchingInputStream( readContext.build(), @@ -1970,19 +1960,30 @@ private FSDataInputStream executeOpen( createInputStreamCallbacks(auditSpan), inputStreamStats, configuration, - directoryAllocator)); + getStore().getDirectoryAllocator())); } else { + + // create the factory. + // TODO: move into S3AStore and export the factory API through + // the store, which will add some of the features (callbacks, stats) + // before invoking the real factory + InputStreamFactory factory = new ClassicInputStreamFactory(); + factory.init(getConf()); + factory.start(); + FactoryStreamParameters parameters = new FactoryStreamParameters() + .withCallbacks(createInputStreamCallbacks(auditSpan)) + .withObjectAttributes(createObjectAttributes(path, fileStatus)) + .withContext(readContext.build()) + .withStreamStatistics(inputStreamStats) + .withBoundedThreadPool(new SemaphoredDelegatingExecutor( + boundedThreadPool, + vectoredActiveRangeReads, + true, + inputStreamStats)) + .build(); + return new FSDataInputStream( - new S3AInputStream( - readContext.build(), - createObjectAttributes(path, fileStatus), - createInputStreamCallbacks(auditSpan), - inputStreamStats, - new SemaphoredDelegatingExecutor( - boundedThreadPool, - vectoredActiveRangeReads, - true, - inputStreamStats))); + factory.create(parameters)); } } @@ -1990,7 +1991,7 @@ private FSDataInputStream executeOpen( * Override point: create the callbacks for S3AInputStream. * @return an implementation of the InputStreamCallbacks, */ - private S3AInputStream.InputStreamCallbacks createInputStreamCallbacks( + private StreamReadCallbacks createInputStreamCallbacks( final AuditSpan auditSpan) { return new InputStreamCallbacksImpl(auditSpan); } @@ -1999,7 +2000,7 @@ private S3AInputStream.InputStreamCallbacks createInputStreamCallbacks( * Operations needed by S3AInputStream to read data. */ private final class InputStreamCallbacksImpl implements - S3AInputStream.InputStreamCallbacks { + StreamReadCallbacks { /** * Audit span to activate before each call. @@ -2035,7 +2036,7 @@ public ResponseInputStream getObject(GetObjectRequest request IOException { // active the audit span used for the operation try (AuditSpan span = auditSpan.activate()) { - return fsHandler.getObject(store, request, getRequestFactory()); + return fsHandler.getObject(getStore(), request, getRequestFactory()); } } @@ -2065,7 +2066,7 @@ private final class WriteOperationHelperCallbacksImpl @Retries.OnceRaw public CompleteMultipartUploadResponse completeMultipartUpload( CompleteMultipartUploadRequest request) { - return store.completeMultipartUpload(request); + return getStore().completeMultipartUpload(request); } @Override @@ -2075,7 +2076,7 @@ public UploadPartResponse uploadPart( final RequestBody body, final DurationTrackerFactory durationTrackerFactory) throws AwsServiceException, UncheckedIOException { - return store.uploadPart(request, body, durationTrackerFactory); + return getStore().uploadPart(request, body, durationTrackerFactory); } /** @@ -2872,7 +2873,7 @@ public long getDefaultBlockSize(Path path) { */ @Override public long getObjectSize(S3Object s3Object) throws IOException { - return fsHandler.getS3ObjectSize(s3Object.key(), s3Object.size(), store, null); + return fsHandler.getS3ObjectSize(s3Object.key(), s3Object.size(), getStore(), null); } @Override @@ -3103,7 +3104,7 @@ protected DurationTrackerFactory getDurationTrackerFactory() { */ protected DurationTrackerFactory nonNullDurationTrackerFactory( DurationTrackerFactory factory) { - return store.nonNullDurationTrackerFactory(factory); + return getStore().nonNullDurationTrackerFactory(factory); } /** @@ -3141,7 +3142,7 @@ protected HeadObjectResponse getObjectMetadata(String key, ChangeTracker changeTracker, Invoker changeInvoker, String operation) throws IOException { - return store.headObject(key, changeTracker, changeInvoker, fsHandler, operation); + return getStore().headObject(key, changeTracker, changeInvoker, fsHandler, operation); } /** @@ -3289,7 +3290,7 @@ public void incrementWriteOperations() { protected void deleteObject(String key) throws SdkException, IOException { incrementWriteOperations(); - store.deleteObject(getRequestFactory() + getStore().deleteObject(getRequestFactory() .newDeleteObjectRequestBuilder(key) .build()); } @@ -3343,7 +3344,7 @@ void deleteObjectAtPath(Path f, private DeleteObjectsResponse deleteObjects(DeleteObjectsRequest deleteRequest) throws MultiObjectDeleteException, SdkException, IOException { incrementWriteOperations(); - DeleteObjectsResponse response = store.deleteObjects(deleteRequest).getValue(); + DeleteObjectsResponse response = getStore().deleteObjects(deleteRequest).getValue(); if (!response.errors().isEmpty()) { throw new MultiObjectDeleteException(response.errors()); } @@ -3386,7 +3387,7 @@ public PutObjectRequest.Builder newPutObjectRequestBuilder(String key, @Retries.OnceRaw public UploadInfo putObject(PutObjectRequest putObjectRequest, File file, ProgressableProgressListener listener) throws IOException { - return store.putObject(putObjectRequest, file, listener); + return getStore().putObject(putObjectRequest, file, listener); } /** @@ -3487,7 +3488,7 @@ UploadPartResponse uploadPart(UploadPartRequest request, RequestBody body, * @param bytes bytes in the request. */ protected void incrementPutStartStatistics(long bytes) { - store.incrementPutStartStatistics(bytes); + getStore().incrementPutStartStatistics(bytes); } /** @@ -3498,7 +3499,7 @@ protected void incrementPutStartStatistics(long bytes) { * @param bytes bytes in the request. */ protected void incrementPutCompletedStatistics(boolean success, long bytes) { - store.incrementPutCompletedStatistics(success, bytes); + getStore().incrementPutCompletedStatistics(success, bytes); } /** @@ -3509,7 +3510,7 @@ protected void incrementPutCompletedStatistics(boolean success, long bytes) { * @param bytes bytes successfully uploaded. */ protected void incrementPutProgressStatistics(String key, long bytes) { - store.incrementPutProgressStatistics(key, bytes); + getStore().incrementPutProgressStatistics(key, bytes); } /** @@ -4389,9 +4390,9 @@ PutObjectResponse executePut( String key = putObjectRequest.key(); long len = getPutRequestLength(putObjectRequest); ProgressableProgressListener listener = - new ProgressableProgressListener(store, putObjectRequest.key(), progress); + new ProgressableProgressListener(getStore(), putObjectRequest.key(), progress); UploadInfo info = putObject(putObjectRequest, file, listener); - PutObjectResponse result = store.waitForUploadCompletion(key, info).response(); + PutObjectResponse result = getStore().waitForUploadCompletion(key, info).response(); listener.uploadCompleted(info.getFileUpload()); // post-write actions @@ -4489,7 +4490,7 @@ public void close() throws IOException { protected synchronized void stopAllServices() { try { trackDuration(getDurationTrackerFactory(), FILESYSTEM_CLOSE.getSymbol(), () -> { - closeAutocloseables(LOG, store, s3SeekableInputStreamFactory); + closeAutocloseables(LOG, getStore()); store = null; s3Client = null; s3AsyncClient = null; @@ -4712,7 +4713,7 @@ private CopyObjectResponse copyFile(String srcKey, String dstKey, long size, () -> { incrementStatistic(OBJECT_COPY_REQUESTS); - Copy copy = store.getOrCreateTransferManager().copy( + Copy copy = getStore().getOrCreateTransferManager().copy( CopyRequest.builder() .copyObjectRequest(copyRequest) .build()); @@ -5927,7 +5928,7 @@ public BulkDelete createBulkDelete(final Path path) */ protected BulkDeleteOperation.BulkDeleteOperationCallbacks createBulkDeleteCallbacks( Path path, int pageSize, AuditSpanS3A span) { - return new BulkDeleteOperationCallbacksImpl(store, pathToKey(path), pageSize, span); + return new BulkDeleteOperationCallbacksImpl(getStore(), pathToKey(path), pageSize, span); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java index c620ca042dc82c..c61cc2bd358dc6 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java @@ -19,7 +19,6 @@ package org.apache.hadoop.fs.s3a; import javax.annotation.Nullable; -import java.io.Closeable; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; @@ -30,7 +29,6 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.IntFunction; @@ -41,6 +39,8 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.fs.impl.LeakReporter; +import org.apache.hadoop.fs.s3a.streams.AbstractS3AInputStream; +import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; import org.apache.hadoop.fs.statistics.StreamStatisticNames; import org.apache.hadoop.util.Preconditions; import org.apache.hadoop.classification.InterfaceAudience; @@ -49,7 +49,6 @@ import org.apache.hadoop.fs.CanSetReadahead; import org.apache.hadoop.fs.CanUnbuffer; import org.apache.hadoop.fs.FSExceptionMessages; -import org.apache.hadoop.fs.FSInputStream; import org.apache.hadoop.fs.FileRange; import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.impl.CombinedFileRange; @@ -57,17 +56,11 @@ import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.InternalConstants; import org.apache.hadoop.fs.s3a.impl.SDKStreamDrainer; -import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; import org.apache.hadoop.fs.statistics.DurationTracker; -import org.apache.hadoop.fs.statistics.IOStatistics; -import org.apache.hadoop.fs.statistics.IOStatisticsAggregator; import org.apache.hadoop.fs.statistics.IOStatisticsSource; import org.apache.hadoop.io.IOUtils; -import org.apache.hadoop.util.functional.CallableRaisingIOE; -import static java.util.Objects.requireNonNull; -import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.apache.hadoop.fs.VectoredReadUtils.isOrderedDisjoint; import static org.apache.hadoop.fs.VectoredReadUtils.mergeSortedRanges; import static org.apache.hadoop.fs.VectoredReadUtils.validateAndSortRanges; @@ -94,7 +87,7 @@ */ @InterfaceAudience.Private @InterfaceStability.Evolving -public class S3AInputStream extends FSInputStream implements CanSetReadahead, +public class S3AInputStream extends AbstractS3AInputStream implements CanSetReadahead, CanUnbuffer, StreamCapabilities, IOStatisticsSource { public static final String E_NEGATIVE_READAHEAD_VALUE @@ -134,6 +127,7 @@ public class S3AInputStream extends FSInputStream implements CanSetReadahead, * and returned in {@link #getPos()}. */ private long pos; + /** * Closed bit. Volatile so reads are non-blocking. * Updates must be in a synchronized block to guarantee an atomic check and @@ -144,30 +138,12 @@ public class S3AInputStream extends FSInputStream implements CanSetReadahead, * Input stream returned by a getObject call. */ private ResponseInputStream wrappedStream; - private final S3AReadOpContext context; - private final InputStreamCallbacks client; - - /** - * Thread pool used for vectored IO operation. - */ - private final ExecutorService boundedThreadPool; - private final String bucket; - private final String key; - private final String pathStr; - - /** - * Content length from HEAD or openFile option. - */ - private final long contentLength; /** * Content length in format for vector IO. */ private final Optional fileLength; - private final String uri; - private final S3AInputStreamStatistics streamStatistics; - private S3AInputPolicy inputPolicy; private long readahead = Constants.DEFAULT_READAHEAD_RANGE; /** Vectored IO context. */ @@ -193,96 +169,31 @@ public class S3AInputStream extends FSInputStream implements CanSetReadahead, /** change tracker. */ private final ChangeTracker changeTracker; - /** - * IOStatistics report. - */ - private final IOStatistics ioStatistics; - /** * Threshold for stream reads to switch to * asynchronous draining. */ - private long asyncDrainThreshold; - - /** Aggregator used to aggregate per thread IOStatistics. */ - private final IOStatisticsAggregator threadIOStatistics; - - /** - * Report of leaks. - * with report and abort unclosed streams in finalize(). - */ - private final LeakReporter leakReporter; + private final long asyncDrainThreshold; /** * Create the stream. * This does not attempt to open it; that is only done on the first * actual read() operation. - * @param ctx operation context - * @param s3Attributes object attributes - * @param client S3 client to use - * @param streamStatistics stream io stats. - * @param boundedThreadPool thread pool to use. */ - public S3AInputStream(S3AReadOpContext ctx, - S3ObjectAttributes s3Attributes, - InputStreamCallbacks client, - S3AInputStreamStatistics streamStatistics, - ExecutorService boundedThreadPool) { - Preconditions.checkArgument(isNotEmpty(s3Attributes.getBucket()), - "No Bucket"); - Preconditions.checkArgument(isNotEmpty(s3Attributes.getKey()), "No Key"); - long l = s3Attributes.getLen(); - Preconditions.checkArgument(l >= 0, "Negative content length"); - this.context = ctx; - this.bucket = s3Attributes.getBucket(); - this.key = s3Attributes.getKey(); - this.pathStr = s3Attributes.getPath().toString(); - this.contentLength = l; - this.fileLength = Optional.of(contentLength); - this.client = client; - this.uri = "s3a://" + this.bucket + "/" + this.key; - this.streamStatistics = streamStatistics; - this.ioStatistics = streamStatistics.getIOStatistics(); - this.changeTracker = new ChangeTracker(uri, - ctx.getChangeDetectionPolicy(), - streamStatistics.getChangeTrackerStatistics(), - s3Attributes); - setInputPolicy(ctx.getInputPolicy()); - setReadahead(ctx.getReadahead()); - this.asyncDrainThreshold = ctx.getAsyncDrainThreshold(); - this.boundedThreadPool = boundedThreadPool; - this.vectoredIOContext = context.getVectoredIOContext(); - this.threadIOStatistics = requireNonNull(ctx.getIOStatisticsAggregator()); - // build the leak reporter - this.leakReporter = new LeakReporter( - "Stream not closed while reading " + uri, - this::isStreamOpen, - () -> abortInFinalizer()); - } + public S3AInputStream(FactoryStreamParameters parameters) { - /** - * Finalizer. - *

- * Verify that the inner stream is closed. - *

- * If it is not, it means streams are being leaked in application code. - * Log a warning, including the stack trace of the caller, - * then abort the stream. - *

- * This does not attempt to invoke {@link #close()} as that is - * a more complex operation, and this method is being executed - * during a GC finalization phase. - *

- * Applications MUST close their streams; this is a defensive - * operation to return http connections and warn the end users - * that their applications are at risk of running out of connections. - * - * {@inheritDoc} - */ - @Override - protected void finalize() throws Throwable { - leakReporter.close(); - super.finalize(); + super(parameters); + + + this.fileLength = Optional.of(getContentLength()); + S3AReadOpContext context = getContext(); + this.changeTracker = new ChangeTracker(getUri(), + context.getChangeDetectionPolicy(), + getStreamStatistics().getChangeTrackerStatistics(), + getObjectAttributes()); + setReadahead(context.getReadahead()); + this.asyncDrainThreshold = context.getAsyncDrainThreshold(); + this.vectoredIOContext = this.getContext().getVectoredIOContext(); } /** @@ -290,7 +201,8 @@ protected void finalize() throws Throwable { * Not synchronized; the flag is volatile. * @return true if the stream is still open. */ - private boolean isStreamOpen() { + @Override + protected boolean isStreamOpen() { return !closed; } @@ -298,10 +210,11 @@ private boolean isStreamOpen() { * Brute force stream close; invoked by {@link LeakReporter}. * All exceptions raised are ignored. */ - private void abortInFinalizer() { + @Override + protected void abortInFinalizer() { try { // stream was leaked: update statistic - streamStatistics.streamLeaked(); + getS3AStreamStatistics().streamLeaked(); // abort the stream. This merges statistics into the filesystem. closeStream("finalize()", true, true).get(); } catch (InterruptedException | ExecutionException ignroed) { @@ -309,32 +222,12 @@ private void abortInFinalizer() { } } - /** - * Set/update the input policy of the stream. - * This updates the stream statistics. - * @param inputPolicy new input policy. - */ - private void setInputPolicy(S3AInputPolicy inputPolicy) { - LOG.debug("Switching to input policy {}", inputPolicy); - this.inputPolicy = inputPolicy; - streamStatistics.inputPolicySet(inputPolicy.ordinal()); - } - - /** - * Get the current input policy. - * @return input policy. - */ - @VisibleForTesting - public S3AInputPolicy getInputPolicy() { - return inputPolicy; - } - /** * If the stream is in Adaptive mode, switch to random IO at this * point. Unsynchronized. */ private void maybeSwitchToRandomIO() { - if (inputPolicy.isAdaptive()) { + if (getInputPolicy().isAdaptive()) { setInputPolicy(S3AInputPolicy.Random); } } @@ -355,24 +248,24 @@ private synchronized void reopen(String reason, long targetPos, long length, closeStream("reopen(" + reason + ")", forceAbort, false); } - contentRangeFinish = calculateRequestLimit(inputPolicy, targetPos, - length, contentLength, readahead); + contentRangeFinish = calculateRequestLimit(getInputPolicy(), targetPos, + length, getContentLength(), readahead); LOG.debug("reopen({}) for {} range[{}-{}], length={}," + " streamPosition={}, nextReadPosition={}, policy={}", - uri, reason, targetPos, contentRangeFinish, length, pos, nextReadPos, - inputPolicy); + getUri(), reason, targetPos, contentRangeFinish, length, pos, nextReadPos, + getInputPolicy()); - GetObjectRequest request = client.newGetRequestBuilder(key) + GetObjectRequest request = getCallbacks().newGetRequestBuilder(getKey()) .range(S3AUtils.formatRange(targetPos, contentRangeFinish - 1)) .applyMutation(changeTracker::maybeApplyConstraint) .build(); - long opencount = streamStatistics.streamOpened(); + long opencount = getS3AStreamStatistics().streamOpened(); String operation = opencount == 0 ? OPERATION_OPEN : OPERATION_REOPEN; String text = String.format("%s %s at %d", - operation, uri, targetPos); - wrappedStream = onceTrackingDuration(text, uri, - streamStatistics.initiateGetRequest(), () -> - client.getObject(request)); + operation, getUri(), targetPos); + wrappedStream = onceTrackingDuration(text, getUri(), + getS3AStreamStatistics().initiateGetRequest(), () -> + getCallbacks().getObject(request)); changeTracker.processResponse(wrappedStream.response(), operation, targetPos); @@ -396,7 +289,7 @@ public synchronized void seek(long targetPos) throws IOException { + " " + targetPos); } - if (this.contentLength <= 0) { + if (this.getContentLength() <= 0) { return; } @@ -414,7 +307,7 @@ private void seekQuietly(long positiveTargetPos) { seek(positiveTargetPos); } catch (IOException ioe) { LOG.debug("Ignoring IOE on seek of {} to {}", - uri, positiveTargetPos, ioe); + getUri(), positiveTargetPos, ioe); } } @@ -449,12 +342,12 @@ private void seekInStream(long targetPos, long length) throws IOException { && diff < forwardSeekLimit; if (skipForward) { // the forward seek range is within the limits - LOG.debug("Forward seek on {}, of {} bytes", uri, diff); + LOG.debug("Forward seek on {}, of {} bytes", getUri(), diff); long skipped = wrappedStream.skip(diff); if (skipped > 0) { pos += skipped; } - streamStatistics.seekForwards(diff, skipped); + getS3AStreamStatistics().seekForwards(diff, skipped); if (pos == targetPos) { // all is well @@ -464,15 +357,15 @@ private void seekInStream(long targetPos, long length) throws IOException { } else { // log a warning; continue to attempt to re-open LOG.warn("Failed to seek on {} to {}. Current position {}", - uri, targetPos, pos); + getUri(), targetPos, pos); } } else { // not attempting to read any bytes from the stream - streamStatistics.seekForwards(diff, 0); + getS3AStreamStatistics().seekForwards(diff, 0); } } else if (diff < 0) { // backwards seek - streamStatistics.seekBackwards(diff); + getS3AStreamStatistics().seekBackwards(diff); // if the stream is in "Normal" mode, switch to random IO at this // point, as it is indicative of columnar format IO maybeSwitchToRandomIO(); @@ -513,8 +406,8 @@ public boolean seekToNewSource(long targetPos) throws IOException { @Retries.RetryTranslated private void lazySeek(long targetPos, long len) throws IOException { - Invoker invoker = context.getReadInvoker(); - invoker.retry("lazySeek to " + targetPos, pathStr, true, + Invoker invoker = getContext().getReadInvoker(); + invoker.retry("lazySeek to " + targetPos, getPathStr(), true, () -> { //For lazy seek seekInStream(targetPos, len); @@ -532,9 +425,9 @@ private void lazySeek(long targetPos, long len) throws IOException { * @param bytesRead number of bytes read */ private void incrementBytesRead(long bytesRead) { - streamStatistics.bytesRead(bytesRead); - if (context.stats != null && bytesRead > 0) { - context.stats.incrementBytesRead(bytesRead); + getS3AStreamStatistics().bytesRead(bytesRead); + if (getContext().stats != null && bytesRead > 0) { + getContext().stats.incrementBytesRead(bytesRead); } } @@ -542,7 +435,7 @@ private void incrementBytesRead(long bytesRead) { @Retries.RetryTranslated public synchronized int read() throws IOException { checkNotClosed(); - if (this.contentLength == 0 || (nextReadPos >= contentLength)) { + if (this.getContentLength() == 0 || (nextReadPos >= getContentLength())) { return -1; } @@ -554,8 +447,8 @@ public synchronized int read() throws IOException { return -1; } - Invoker invoker = context.getReadInvoker(); - int byteRead = invoker.retry("read", pathStr, true, + Invoker invoker = getContext().getReadInvoker(); + int byteRead = invoker.retry("read", getPathStr(), true, () -> { int b; // When exception happens before re-setting wrappedStream in "reopen" called @@ -597,13 +490,13 @@ private void onReadFailure(IOException ioe, boolean forceAbort) { if (LOG.isDebugEnabled()) { LOG.debug("Got exception while trying to read from stream {}, " + "client: {} object: {}, trying to recover: ", - uri, client, objectResponse, ioe); + getUri(), getCallbacks(), objectResponse, ioe); } else { LOG.info("Got exception while trying to read from stream {}, " + "client: {} object: {}, trying to recover: " + ioe, - uri, client, objectResponse); + getUri(), getCallbacks(), objectResponse); } - streamStatistics.readException(); + getS3AStreamStatistics().readException(); closeStream("failure recovery", forceAbort, false); } @@ -638,7 +531,7 @@ public synchronized int read(byte[] buf, int off, int len) return 0; } - if (this.contentLength == 0 || (nextReadPos >= contentLength)) { + if (this.getContentLength() == 0 || (nextReadPos >= getContentLength())) { return -1; } @@ -649,10 +542,10 @@ public synchronized int read(byte[] buf, int off, int len) return -1; } - Invoker invoker = context.getReadInvoker(); + Invoker invoker = getContext().getReadInvoker(); - streamStatistics.readOperationStarted(nextReadPos, len); - int bytesRead = invoker.retry("read", pathStr, true, + getS3AStreamStatistics().readOperationStarted(nextReadPos, len); + int bytesRead = invoker.retry("read", getPathStr(), true, () -> { int bytes; // When exception happens before re-setting wrappedStream in "reopen" called @@ -685,7 +578,7 @@ public synchronized int read(byte[] buf, int off, int len) } else { streamReadResultNegative(); } - streamStatistics.readOperationCompleted(len, bytesRead); + getS3AStreamStatistics().readOperationCompleted(len, bytesRead); return bytesRead; } @@ -696,7 +589,7 @@ public synchronized int read(byte[] buf, int off, int len) */ private void checkNotClosed() throws IOException { if (closed) { - throw new IOException(uri + ": " + FSExceptionMessages.STREAM_IS_CLOSED); + throw new IOException(getUri() + ": " + FSExceptionMessages.STREAM_IS_CLOSED); } } @@ -717,28 +610,14 @@ public synchronized void close() throws IOException { // close or abort the stream; blocking closeStream("close() operation", false, true); // end the client+audit span. - client.close(); - // this is actually a no-op - super.close(); + getCallbacks().close(); + } finally { - // merge the statistics back into the FS statistics. - streamStatistics.close(); - // Collect ThreadLevel IOStats - mergeThreadIOStatistics(streamStatistics.getIOStatistics()); + super.close(); } } } - /** - * Merging the current thread's IOStatistics with the current IOStatistics - * context. - * - * @param streamIOStats Stream statistics to be merged into thread - * statistics aggregator. - */ - private void mergeThreadIOStatistics(IOStatistics streamIOStats) { - threadIOStatistics.aggregate(streamIOStats); - } /** * Close a stream: decide whether to abort or close, based on @@ -776,11 +655,11 @@ private CompletableFuture closeStream( boolean shouldAbort = forceAbort || remaining > readahead; CompletableFuture operation; SDKStreamDrainer> drainer = new SDKStreamDrainer<>( - uri, + getUri(), wrappedStream, shouldAbort, (int) remaining, - streamStatistics, + getS3AStreamStatistics(), reason); if (blocking || shouldAbort || remaining <= asyncDrainThreshold) { @@ -792,7 +671,7 @@ private CompletableFuture closeStream( } else { LOG.debug("initiating asynchronous drain of {} bytes", remaining); // schedule an async drain/abort - operation = client.submit(drainer); + operation = getCallbacks().submit(drainer); } // either the stream is closed in the blocking call or the async call is @@ -817,7 +696,7 @@ private CompletableFuture closeStream( @InterfaceStability.Unstable public synchronized boolean resetConnection() throws IOException { checkNotClosed(); - LOG.info("Forcing reset of connection to {}", uri); + LOG.info("Forcing reset of connection to {}", getUri()); return awaitFuture(closeStream("reset()", true, true)); } @@ -839,7 +718,7 @@ public synchronized int available() throws IOException { @InterfaceAudience.Private @InterfaceStability.Unstable public synchronized long remainingInFile() { - return this.contentLength - this.pos; + return this.getContentLength() - this.pos; } /** @@ -879,17 +758,17 @@ public boolean markSupported() { @Override @InterfaceStability.Unstable public String toString() { - String s = streamStatistics.toString(); + String s = getS3AStreamStatistics().toString(); synchronized (this) { final StringBuilder sb = new StringBuilder( "S3AInputStream{"); - sb.append(uri); + sb.append(getUri()); sb.append(" wrappedStream=") .append(isObjectStreamOpen() ? "open" : "closed"); - sb.append(" read policy=").append(inputPolicy); + sb.append(" read policy=").append(getInputPolicy()); sb.append(" pos=").append(pos); sb.append(" nextReadPos=").append(nextReadPos); - sb.append(" contentLength=").append(contentLength); + sb.append(" contentLength=").append(getContentLength()); sb.append(" contentRangeStart=").append(contentRangeStart); sb.append(" contentRangeFinish=").append(contentRangeFinish); sb.append(" remainingInCurrentRequest=") @@ -920,7 +799,7 @@ public void readFully(long position, byte[] buffer, int offset, int length) throws IOException { checkNotClosed(); validatePositionedReadArgs(position, buffer, offset, length); - streamStatistics.readFullyOperationStarted(position, length); + getS3AStreamStatistics().readFullyOperationStarted(position, length); if (length == 0) { return; } @@ -971,10 +850,10 @@ public int maxReadSizeForVectorReads() { @Override public synchronized void readVectored(List ranges, IntFunction allocate) throws IOException { - LOG.debug("Starting vectored read on path {} for ranges {} ", pathStr, ranges); + LOG.debug("Starting vectored read on path {} for ranges {} ", getPathStr(), ranges); checkNotClosed(); if (stopVectoredIOOperations.getAndSet(false)) { - LOG.debug("Reinstating vectored read operation for path {} ", pathStr); + LOG.debug("Reinstating vectored read operation for path {} ", getPathStr()); } // prepare to read @@ -992,26 +871,26 @@ public synchronized void readVectored(List ranges, if (isOrderedDisjoint(sortedRanges, 1, minSeekForVectorReads())) { LOG.debug("Not merging the ranges as they are disjoint"); - streamStatistics.readVectoredOperationStarted(sortedRanges.size(), sortedRanges.size()); + getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), sortedRanges.size()); for (FileRange range: sortedRanges) { ByteBuffer buffer = allocate.apply(range.getLength()); - boundedThreadPool.submit(() -> readSingleRange(range, buffer)); + getBoundedThreadPool().submit(() -> readSingleRange(range, buffer)); } } else { LOG.debug("Trying to merge the ranges as they are not disjoint"); List combinedFileRanges = mergeSortedRanges(sortedRanges, 1, minSeekForVectorReads(), maxReadSizeForVectorReads()); - streamStatistics.readVectoredOperationStarted(sortedRanges.size(), combinedFileRanges.size()); + getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), combinedFileRanges.size()); LOG.debug("Number of original ranges size {} , Number of combined ranges {} ", ranges.size(), combinedFileRanges.size()); for (CombinedFileRange combinedFileRange: combinedFileRanges) { - boundedThreadPool.submit( + getBoundedThreadPool().submit( () -> readCombinedRangeAndUpdateChildren(combinedFileRange, allocate)); } } LOG.debug("Finished submitting vectored read to threadpool" + - " on path {} for ranges {} ", pathStr, ranges); + " on path {} for ranges {} ", getPathStr(), ranges); } /** @@ -1022,7 +901,7 @@ public synchronized void readVectored(List ranges, */ private void readCombinedRangeAndUpdateChildren(CombinedFileRange combinedFileRange, IntFunction allocate) { - LOG.debug("Start reading {} from path {} ", combinedFileRange, pathStr); + LOG.debug("Start reading {} from path {} ", combinedFileRange, getPathStr()); ResponseInputStream rangeContent = null; try { rangeContent = getS3ObjectInputStream("readCombinedFileRange", @@ -1030,7 +909,7 @@ private void readCombinedRangeAndUpdateChildren(CombinedFileRange combinedFileRa combinedFileRange.getLength()); populateChildBuffers(combinedFileRange, rangeContent, allocate); } catch (Exception ex) { - LOG.debug("Exception while reading {} from path {} ", combinedFileRange, pathStr, ex); + LOG.debug("Exception while reading {} from path {} ", combinedFileRange, getPathStr(), ex); // complete exception all the underlying ranges which have not already // finished. for(FileRange child : combinedFileRange.getUnderlying()) { @@ -1041,7 +920,7 @@ private void readCombinedRangeAndUpdateChildren(CombinedFileRange combinedFileRa } finally { IOUtils.cleanupWithLogger(LOG, rangeContent); } - LOG.debug("Finished reading {} from path {} ", combinedFileRange, pathStr); + LOG.debug("Finished reading {} from path {} ", combinedFileRange, getPathStr()); } /** @@ -1129,7 +1008,7 @@ private void drainUnnecessaryData( remaining -= readCount; } } finally { - streamStatistics.readVectoredBytesDiscarded(drainBytes); + getS3AStreamStatistics().readVectoredBytesDiscarded(drainBytes); LOG.debug("{} bytes drained from stream ", drainBytes); } } @@ -1140,7 +1019,7 @@ private void drainUnnecessaryData( * @param buffer buffer to fill. */ private void readSingleRange(FileRange range, ByteBuffer buffer) { - LOG.debug("Start reading {} from {} ", range, pathStr); + LOG.debug("Start reading {} from {} ", range, getPathStr()); if (range.getLength() == 0) { // a zero byte read. buffer.flip(); @@ -1155,12 +1034,12 @@ private void readSingleRange(FileRange range, ByteBuffer buffer) { populateBuffer(range, buffer, objectRange); range.getData().complete(buffer); } catch (Exception ex) { - LOG.warn("Exception while reading a range {} from path {} ", range, pathStr, ex); + LOG.warn("Exception while reading a range {} from path {} ", range, getPathStr(), ex); range.getData().completeExceptionally(ex); } finally { IOUtils.cleanupWithLogger(LOG, objectRange); } - LOG.debug("Finished reading range {} from path {} ", range, pathStr); + LOG.debug("Finished reading range {} from path {} ", range, getPathStr()); } /** @@ -1274,18 +1153,18 @@ private ResponseInputStream getS3Object(String operationName, long position, int length) throws IOException { - final GetObjectRequest request = client.newGetRequestBuilder(key) + final GetObjectRequest request = getCallbacks().newGetRequestBuilder(getKey()) .range(S3AUtils.formatRange(position, position + length - 1)) .applyMutation(changeTracker::maybeApplyConstraint) .build(); - DurationTracker tracker = streamStatistics.initiateGetRequest(); + DurationTracker tracker = getS3AStreamStatistics().initiateGetRequest(); ResponseInputStream objectRange; - Invoker invoker = context.getReadInvoker(); + Invoker invoker = getContext().getReadInvoker(); try { - objectRange = invoker.retry(operationName, pathStr, true, + objectRange = invoker.retry(operationName, getPathStr(), true, () -> { checkIfVectoredIOStopped(); - return client.getObject(request); + return getCallbacks().getObject(request); }); } catch (IOException ex) { @@ -1312,18 +1191,6 @@ private void checkIfVectoredIOStopped() throws InterruptedIOException { } } - /** - * Access the input stream statistics. - * This is for internal testing and may be removed without warning. - * @return the statistics for this input stream - */ - @InterfaceAudience.Private - @InterfaceStability.Unstable - @VisibleForTesting - public S3AInputStreamStatistics getS3AStreamStatistics() { - return streamStatistics; - } - @Override public synchronized void setReadahead(Long readahead) { this.readahead = validateReadahead(readahead); @@ -1409,8 +1276,8 @@ public synchronized void unbuffer() { stopVectoredIOOperations.set(true); closeStream("unbuffer()", false, false); } finally { - streamStatistics.unbuffered(); - if (inputPolicy.isAdaptive()) { + getS3AStreamStatistics().unbuffered(); + if (getInputPolicy().isAdaptive()) { S3AInputPolicy policy = S3AInputPolicy.Random; setInputPolicy(policy); } @@ -1423,12 +1290,9 @@ public boolean hasCapability(String capability) { case StreamCapabilities.IOSTATISTICS: case StreamCapabilities.IOSTATISTICS_CONTEXT: case StreamStatisticNames.STREAM_LEAKS: - case StreamCapabilities.READAHEAD: - case StreamCapabilities.UNBUFFER: - case StreamCapabilities.VECTOREDIO: return true; default: - return false; + return super.hasCapability(capability); } } @@ -1441,11 +1305,6 @@ public boolean isObjectStreamOpen() { return wrappedStream != null; } - @Override - public IOStatistics getIOStatistics() { - return ioStatistics; - } - /** * Get the wrapped stream. * This is for testing only. @@ -1457,38 +1316,4 @@ public ResponseInputStream getWrappedStream() { return wrappedStream; } - /** - * Callbacks for input stream IO. - */ - public interface InputStreamCallbacks extends Closeable { - - /** - * Create a GET request builder. - * @param key object key - * @return the request builder - */ - GetObjectRequest.Builder newGetRequestBuilder(String key); - - /** - * Execute the request. - * When CSE is enabled with reading of unencrypted data, The object is checked if it is - * encrypted and if so, the request is made with encrypted S3 client. If the object is - * not encrypted, the request is made with unencrypted s3 client. - * @param request the request - * @return the response - * @throws IOException on any failure. - */ - @Retries.OnceRaw - ResponseInputStream getObject(GetObjectRequest request) throws IOException; - - /** - * Submit some asynchronous work, for example, draining a stream. - * @param operation operation to invoke - * @param return type - * @return a future. - */ - CompletableFuture submit(CallableRaisingIOE operation); - - } - } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java index 55351f0c81396f..67fc38d2c1ef8b 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java @@ -34,7 +34,7 @@ import static java.util.Objects.requireNonNull; /** - * Read-specific operation context struct. + * Read-specific operation context structure. */ public class S3AReadOpContext extends S3AOpContext { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java index ab8785e01dafda..c1cdc172600d6c 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java @@ -45,6 +45,8 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.ClientManager; @@ -54,6 +56,7 @@ import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.fs.statistics.IOStatisticsSource; +import org.apache.hadoop.service.Service; /** * Interface for the S3A Store; @@ -63,10 +66,14 @@ * The {@link ClientManager} interface is used to create the AWS clients; * the base implementation forwards to the implementation of this interface * passed in at construction time. + *

+ * The interface extends the Hadoop {@link Service} interface + * and follows its lifecycle: it MUST NOT be used until + * {@link Service#init(Configuration)} has been invoked. */ @InterfaceAudience.LimitedPrivate("Extensions") @InterfaceStability.Unstable -public interface S3AStore extends IOStatisticsSource, ClientManager { +public interface S3AStore extends Service, IOStatisticsSource, ClientManager { /** * Acquire write capacity for operations. @@ -302,4 +309,26 @@ CompletedFileUpload waitForUploadCompletion(String key, UploadInfo uploadInfo) @Retries.OnceRaw CompleteMultipartUploadResponse completeMultipartUpload( CompleteMultipartUploadRequest request); + + /** + * Get the directory allocator. + * @return the directory allocator + */ + LocalDirAllocator getDirectoryAllocator(); + + /** + * Demand create the directory allocator, then create a temporary file. + * This does not mark the file for deletion when a process exits. + * Pass in a file size of {@link LocalDirAllocator#SIZE_UNKNOWN} if the + * size is unknown. + * {@link LocalDirAllocator#createTmpFileForWrite(String, long, Configuration)}. + * @param pathStr prefix for the temporary file + * @param size the size of the file that is going to be written + * @param conf the Configuration object + * @return a unique temporary file + * @throws IOException IO problems + */ + File createTemporaryFileForWriting(String pathStr, + long size, + Configuration conf) throws IOException; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java index ad7afc732387ff..d29fd14cbdf464 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java @@ -76,8 +76,4 @@ S3TransferManager getOrCreateTransferManager() */ S3Client getOrCreateAsyncS3ClientUnchecked() throws UncheckedIOException; - /** - * Close operation is required to not raise exceptions. - */ - void close(); } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index db078813455009..f0f82359345701 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -57,7 +57,10 @@ import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.LocalDirAllocator; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.s3a.Invoker; import org.apache.hadoop.fs.s3a.ProgressableProgressListener; import org.apache.hadoop.fs.s3a.Retries; @@ -74,11 +77,14 @@ import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.store.audit.AuditSpanSource; +import org.apache.hadoop.service.CompositeService; import org.apache.hadoop.util.DurationInfo; import org.apache.hadoop.util.RateLimiting; import org.apache.hadoop.util.functional.Tuples; import static java.util.Objects.requireNonNull; +import static org.apache.hadoop.fs.s3a.Constants.BUFFER_DIR; +import static org.apache.hadoop.fs.s3a.Constants.HADOOP_TMP_DIR; import static org.apache.hadoop.fs.s3a.S3AUtils.extractException; import static org.apache.hadoop.fs.s3a.S3AUtils.getPutRequestLength; import static org.apache.hadoop.fs.s3a.S3AUtils.isThrottleException; @@ -109,7 +115,8 @@ * This is where lower level storage operations are intended * to move. */ -public class S3AStoreImpl implements S3AStore { +public class S3AStoreImpl extends CompositeService + implements S3AStore { private static final Logger LOG = LoggerFactory.getLogger(S3AStoreImpl.class); @@ -165,6 +172,11 @@ public class S3AStoreImpl implements S3AStore { */ private final FileSystem.Statistics fsStatistics; + /** + * Allocator of local FS storage. + */ + private LocalDirAllocator directoryAllocator; + /** Constructor to create S3A store. */ S3AStoreImpl(StoreContextFactory storeContextFactory, ClientManager clientManager, @@ -176,6 +188,7 @@ public class S3AStoreImpl implements S3AStore { RateLimiting writeRateLimiter, AuditSpanSource auditSpanSource, @Nullable FileSystem.Statistics fsStatistics) { + super("S3AStore"); this.storeContextFactory = requireNonNull(storeContextFactory); this.clientManager = requireNonNull(clientManager); this.durationTrackerFactory = requireNonNull(durationTrackerFactory); @@ -193,10 +206,26 @@ public class S3AStoreImpl implements S3AStore { } @Override - public void close() { + protected void serviceStart() throws Exception { + super.serviceStart(); + initLocalDirAllocator(); + } + + @Override + protected void serviceStop() throws Exception { + super.serviceStop(); clientManager.close(); } + /** + * Initialize dir allocator if not already initialized. + */ + private void initLocalDirAllocator() { + String bufferDir = getConfig().get(BUFFER_DIR) != null + ? BUFFER_DIR : HADOOP_TMP_DIR; + directoryAllocator = new LocalDirAllocator(bufferDir); + } + /** Acquire write capacity for rate limiting {@inheritDoc}. */ @Override public Duration acquireWriteCapacity(final int capacity) { @@ -808,4 +837,39 @@ public CompleteMultipartUploadResponse completeMultipartUpload( return getS3Client().completeMultipartUpload(request); } + + /** + * Get the directory allocator. + * @return the directory allocator + */ + @Override + public LocalDirAllocator getDirectoryAllocator() { + return directoryAllocator; + } + + /** + * Demand create the directory allocator, then create a temporary file. + * This does not mark the file for deletion when a process exits. + * Pass in a file size of {@link LocalDirAllocator#SIZE_UNKNOWN} if the + * size is unknown. + * {@link LocalDirAllocator#createTmpFileForWrite(String, long, Configuration)}. + * @param pathStr prefix for the temporary file + * @param size the size of the file that is going to be written + * @param conf the Configuration object + * @return a unique temporary file + * @throws IOException IO problems + */ + @Override + public File createTemporaryFileForWriting(String pathStr, + long size, + Configuration conf) throws IOException { + requireNonNull(directoryAllocator, "directory allocator not initialized"); + Path path = directoryAllocator.getLocalPathForWrite(pathStr, + size, conf); + File dir = new File(path.getParent().toUri().getPath()); + String prefix = path.getName(); + // create a temp file on this directory + return File.createTempFile(prefix, null, dir); + } + } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java index e05ad7e38b5b88..3a0fd6d247fa86 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java @@ -32,10 +32,10 @@ import org.apache.hadoop.fs.impl.prefetch.BlockManagerParameters; import org.apache.hadoop.fs.impl.prefetch.BufferData; import org.apache.hadoop.fs.impl.prefetch.FilePosition; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import static org.apache.hadoop.fs.s3a.Constants.DEFAULT_PREFETCH_MAX_BLOCKS_COUNT; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_MAX_BLOCKS_COUNT; @@ -75,7 +75,7 @@ public class S3ACachingInputStream extends S3ARemoteInputStream { public S3ACachingInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics, Configuration conf, LocalDirAllocator localDirAllocator) { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java index e8bfe946f4abf2..a64f48dfaa2ec0 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java @@ -27,10 +27,10 @@ import org.apache.hadoop.fs.impl.prefetch.BufferData; import org.apache.hadoop.fs.impl.prefetch.FilePosition; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; /** * Provides an {@code InputStream} that allows reading from an S3 file. @@ -61,7 +61,7 @@ public class S3AInMemoryInputStream extends S3ARemoteInputStream { public S3AInMemoryInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics); int fileSize = (int) s3Attributes.getLen(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java index 9b9ee12ad75026..f59b5b912ac2fa 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java @@ -34,10 +34,10 @@ import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.impl.prefetch.Validate; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -90,7 +90,7 @@ public class S3APrefetchingInputStream public S3APrefetchingInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics, Configuration conf, LocalDirAllocator localDirAllocator) { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java index 38d740bd74f94d..3f609b1b9532b4 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java @@ -36,11 +36,11 @@ import org.apache.hadoop.fs.impl.prefetch.FilePosition; import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.fs.s3a.S3AInputPolicy; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -98,7 +98,7 @@ public abstract class S3ARemoteInputStream private S3ObjectAttributes s3Attributes; /** Callbacks used for interacting with the underlying S3 client. */ - private S3AInputStream.InputStreamCallbacks client; + private StreamReadCallbacks client; /** Used for reporting input stream access statistics. */ private final S3AInputStreamStatistics streamStatistics; @@ -124,7 +124,7 @@ public abstract class S3ARemoteInputStream public S3ARemoteInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics) { this.context = requireNonNull(context); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java index ec6e3700226e08..446db4f88ac64e 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java @@ -36,6 +36,7 @@ import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.SDKStreamDrainer; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -60,7 +61,7 @@ public class S3ARemoteObject { /** * Callbacks used for interacting with the underlying S3 client. */ - private final S3AInputStream.InputStreamCallbacks client; + private final StreamReadCallbacks client; /** * Used for reporting input stream access statistics. @@ -100,7 +101,7 @@ public class S3ARemoteObject { public S3ARemoteObject( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics, ChangeTracker changeTracker) { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java new file mode 100644 index 00000000000000..645df6a113ef41 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java @@ -0,0 +1,320 @@ +/* + * 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.apache.hadoop.fs.s3a.streams; + +import java.io.IOException; +import java.util.concurrent.ExecutorService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.classification.VisibleForTesting; +import org.apache.hadoop.fs.FSInputStream; +import org.apache.hadoop.fs.StreamCapabilities; +import org.apache.hadoop.fs.impl.LeakReporter; +import org.apache.hadoop.fs.s3a.S3AInputPolicy; +import org.apache.hadoop.fs.s3a.S3AReadOpContext; +import org.apache.hadoop.fs.s3a.S3ObjectAttributes; +import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.statistics.IOStatistics; +import org.apache.hadoop.fs.statistics.IOStatisticsAggregator; +import org.apache.hadoop.fs.statistics.IOStatisticsSource; +import org.apache.hadoop.fs.statistics.StreamStatisticNames; +import org.apache.hadoop.util.Preconditions; + +import static java.util.Objects.requireNonNull; +import static org.apache.commons.lang3.StringUtils.isNotEmpty; +import static org.apache.hadoop.util.StringUtils.toLowerCase; + +/** + * Base class for input streams returned by the factory, and therefore + * used within S3A code. + */ +public abstract class AbstractS3AInputStream extends FSInputStream + implements StreamCapabilities, IOStatisticsSource { + + private static final Logger LOG = + LoggerFactory.getLogger(AbstractS3AInputStream.class); + + /** + * IOStatistics report. + */ + protected final IOStatistics ioStatistics; + + /** + * Read-specific operation context structure. + */ + private final S3AReadOpContext context; + + /** + * Callbacks for reading input stream data from the S3 Store. + */ + private final StreamReadCallbacks callbacks; + + /** + * Thread pool used for vectored IO operation. + */ + private final ExecutorService boundedThreadPool; + + /** + * URI of path. + */ + private final String uri; + + /** + * Store bucket. + */ + private final String bucket; + + /** + * Store key. + */ + private final String key; + + /** + * Path URI as a string. + */ + private final String pathStr; + + /** + * Content length from HEAD or openFile option. + */ + private final long contentLength; + + private final S3ObjectAttributes objectAttributes; + + /** + * Stream statistics. + */ + private final S3AInputStreamStatistics streamStatistics; + + /** Aggregator used to aggregate per thread IOStatistics. */ + private final IOStatisticsAggregator threadIOStatistics; + + /** + * Report of leaks. + * with report and abort unclosed streams in finalize(). + */ + private final LeakReporter leakReporter; + + /** + * Requested input policy. + */ + private S3AInputPolicy inputPolicy; + + /** + * Constructor. + * @param parameters extensible parameter list. + */ + protected AbstractS3AInputStream( + FactoryStreamParameters parameters) { + + objectAttributes = parameters.getObjectAttributes(); + Preconditions.checkArgument(isNotEmpty(objectAttributes.getBucket()), + "No Bucket"); + Preconditions.checkArgument(isNotEmpty(objectAttributes.getKey()), "No Key"); + long l = objectAttributes.getLen(); + Preconditions.checkArgument(l >= 0, "Negative content length"); + this.context = parameters.getContext(); + this.contentLength = l; + + this.bucket = objectAttributes.getBucket(); + this.key = objectAttributes.getKey(); + this.pathStr = objectAttributes.getPath().toString(); + this.callbacks = parameters.getCallbacks(); + this.uri = "s3a://" + bucket + "/" + key; + this.streamStatistics = parameters.getStreamStatistics(); + this.ioStatistics = streamStatistics.getIOStatistics(); + this.inputPolicy = context.getInputPolicy(); + streamStatistics.inputPolicySet(inputPolicy.ordinal()); + this.boundedThreadPool = parameters.getBoundedThreadPool(); + this.threadIOStatistics = requireNonNull(context.getIOStatisticsAggregator()); + // build the leak reporter + this.leakReporter = new LeakReporter( + "Stream not closed while reading " + uri, + this::isStreamOpen, + () -> abortInFinalizer()); + } + + /** + * Probe for stream being open. + * Not synchronized; the flag is volatile. + * @return true if the stream is still open. + */ + protected abstract boolean isStreamOpen(); + + /** + * Brute force stream close; invoked by {@link LeakReporter}. + * All exceptions raised are ignored. + */ + protected abstract void abortInFinalizer(); + + /** + * Close the stream. + * This triggers publishing of the stream statistics back to the filesystem + * statistics. + * This operation is synchronized, so that only one thread can attempt to + * @throws IOException on any problem + */ + @Override + public synchronized void close() throws IOException { + // end the client+audit span. + callbacks.close(); + // merge the statistics back into the FS statistics. + streamStatistics.close(); + // Collect ThreadLevel IOStats + mergeThreadIOStatistics(streamStatistics.getIOStatistics()); + } + + /** + * Merging the current thread's IOStatistics with the current IOStatistics + * context. + * @param streamIOStats Stream statistics to be merged into thread + * statistics aggregator. + */ + protected void mergeThreadIOStatistics(IOStatistics streamIOStats) { + threadIOStatistics.aggregate(streamIOStats); + } + + /** + * Finalizer. + *

+ * Verify that the inner stream is closed. + *

+ * If it is not, it means streams are being leaked in application code. + * Log a warning, including the stack trace of the caller, + * then abort the stream. + *

+ * This does not attempt to invoke {@link #close()} as that is + * a more complex operation, and this method is being executed + * during a GC finalization phase. + *

+ * Applications MUST close their streams; this is a defensive + * operation to return http connections and warn the end users + * that their applications are at risk of running out of connections. + * + * {@inheritDoc} + */ + @Override + protected void finalize() throws Throwable { + leakReporter.close(); + super.finalize(); + } + + /** + * Get the current input policy. + * @return input policy. + */ + @VisibleForTesting + public S3AInputPolicy getInputPolicy() { + return inputPolicy; + } + + /** + * Set/update the input policy of the stream. + * This updates the stream statistics. + * @param inputPolicy new input policy. + */ + protected void setInputPolicy(S3AInputPolicy inputPolicy) { + LOG.debug("Switching to input policy {}", inputPolicy); + this.inputPolicy = inputPolicy; + streamStatistics.inputPolicySet(inputPolicy.ordinal()); + } + + /** + * Access the input stream statistics. + * This is for internal testing and may be removed without warning. + * @return the statistics for this input stream + */ + @InterfaceAudience.Private + @InterfaceStability.Unstable + @VisibleForTesting + public S3AInputStreamStatistics getS3AStreamStatistics() { + return streamStatistics; + } + + @Override + public IOStatistics getIOStatistics() { + return ioStatistics; + } + + @Override + public boolean hasCapability(String capability) { + switch (toLowerCase(capability)) { + case StreamCapabilities.IOSTATISTICS: + case StreamCapabilities.IOSTATISTICS_CONTEXT: + case StreamStatisticNames.STREAM_LEAKS: + case StreamCapabilities.READAHEAD: + case StreamCapabilities.UNBUFFER: + case StreamCapabilities.VECTOREDIO: + return true; + default: + return false; + } + } + + + protected S3AReadOpContext getContext() { + return context; + } + + protected StreamReadCallbacks getCallbacks() { + return callbacks; + } + + protected ExecutorService getBoundedThreadPool() { + return boundedThreadPool; + } + + protected String getUri() { + return uri; + } + + protected String getBucket() { + return bucket; + } + + protected String getKey() { + return key; + } + + protected String getPathStr() { + return pathStr; + } + + protected long getContentLength() { + return contentLength; + } + + protected S3AInputStreamStatistics getStreamStatistics() { + return streamStatistics; + } + + protected IOStatisticsAggregator getThreadIOStatistics() { + return threadIOStatistics; + } + + protected S3ObjectAttributes getObjectAttributes() { + return objectAttributes; + } +} + + diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java new file mode 100644 index 00000000000000..a2720b0d050580 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java @@ -0,0 +1,41 @@ +/* + * 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.apache.hadoop.fs.s3a.streams; + +import java.io.IOException; + +import org.apache.hadoop.fs.s3a.S3AInputStream; +import org.apache.hadoop.service.AbstractService; + +/** + * Factory of classic {@link S3AInputStream} instances. + */ +public class ClassicInputStreamFactory extends AbstractService + implements InputStreamFactory { + + public ClassicInputStreamFactory() { + super("ClassicInputStreamFactory"); + } + + @Override + public AbstractS3AInputStream create(final FactoryStreamParameters parameters) + throws IOException { + return new S3AInputStream(parameters); + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java new file mode 100644 index 00000000000000..c9f2208c505d98 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java @@ -0,0 +1,148 @@ +/* + * 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.apache.hadoop.fs.s3a.streams; + +import java.util.concurrent.ExecutorService; + +import org.apache.hadoop.fs.s3a.S3AReadOpContext; +import org.apache.hadoop.fs.s3a.S3ObjectAttributes; +import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; + +import static java.util.Objects.requireNonNull; + +/** + * Parameters for input streams created through + * {@link InputStreamFactory}. + * It is designed to be extensible; the {@link #build()} + * operation does not freeze the parameters -instead it simply + * verifies that all required values are set. + */ +public final class FactoryStreamParameters { + + private S3AReadOpContext context; + + private S3ObjectAttributes objectAttributes; + + private StreamReadCallbacks callbacks; + + private S3AInputStreamStatistics streamStatistics; + + private ExecutorService boundedThreadPool; + + /** + * Read operation context. + */ + public S3AReadOpContext getContext() { + return context; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public FactoryStreamParameters withContext(S3AReadOpContext value) { + context = value; + return this; + } + + /** + * Attributes of the object. + */ + public S3ObjectAttributes getObjectAttributes() { + return objectAttributes; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public FactoryStreamParameters withObjectAttributes(S3ObjectAttributes value) { + objectAttributes = value; + return this; + } + + /** + * Callbacks to the store. + */ + public StreamReadCallbacks getCallbacks() { + return callbacks; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public FactoryStreamParameters withCallbacks(StreamReadCallbacks value) { + callbacks = value; + return this; + } + + /** + * Stream statistics. + */ + public S3AInputStreamStatistics getStreamStatistics() { + return streamStatistics; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public FactoryStreamParameters withStreamStatistics(S3AInputStreamStatistics value) { + streamStatistics = value; + return this; + } + + /** + * Bounded thread pool for submitting asynchronous + * work. + */ + public ExecutorService getBoundedThreadPool() { + return boundedThreadPool; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public FactoryStreamParameters withBoundedThreadPool(ExecutorService value) { + boundedThreadPool = value; + return this; + } + + /** + * Validate that all attributes are as expected. + * Mock tests can skip this if required. + * @return the object. + */ + public FactoryStreamParameters build() { + requireNonNull(boundedThreadPool, "boundedThreadPool"); + requireNonNull(callbacks, "callbacks"); + requireNonNull(context, "context"); + requireNonNull(objectAttributes, "objectAttributes"); + requireNonNull(streamStatistics, "streamStatistics"); + requireNonNull(boundedThreadPool, "boundedThreadPool"); + return this; + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java new file mode 100644 index 00000000000000..56b158e50f6912 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java @@ -0,0 +1,49 @@ +/* + * 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.apache.hadoop.fs.s3a.streams; + +import java.io.IOException; + +import org.apache.hadoop.service.Service; + +/** + * A Factory for input streams. + *

+ * This class is instantiated during initialization of + * {@code S3AStore}, it then follows the same service + * lifecycle. + *

+ * Note for maintainers: do try and keep this mostly stable. + * If new parameters need to be added, expand the + * {@link FactoryStreamParameters} class, rather than change the + * interface signature. + */ +public interface InputStreamFactory extends Service { + + /** + * Create a new input stream. + * @param parameters parameters. + * @return the input stream + * @throws problem creating the stream. + */ + AbstractS3AInputStream create(FactoryStreamParameters parameters) + throws IOException; + +} + diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java new file mode 100644 index 00000000000000..c4441af07a2e2e --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java @@ -0,0 +1,64 @@ +/* + * 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.apache.hadoop.fs.s3a.streams; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.CompletableFuture; + +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; + +import org.apache.hadoop.fs.s3a.Retries; +import org.apache.hadoop.util.functional.CallableRaisingIOE; + +/** + * Callbacks for reading input stream data from the S3 Store. + */ +public interface StreamReadCallbacks extends Closeable { + + /** + * Create a GET request builder. + * @param key object key + * @return the request builder + */ + GetObjectRequest.Builder newGetRequestBuilder(String key); + + /** + * Execute the request. + * When CSE is enabled with reading of unencrypted data, The object is checked if it is + * encrypted and if so, the request is made with encrypted S3 client. If the object is + * not encrypted, the request is made with unencrypted s3 client. + * @param request the request + * @return the response + * @throws IOException on any failure. + */ + @Retries.OnceRaw + ResponseInputStream getObject(GetObjectRequest request) throws IOException; + + /** + * Submit some asynchronous work, for example, draining a stream. + * @param operation operation to invoke + * @param return type + * @return a future. + */ + CompletableFuture submit(CallableRaisingIOE operation); + +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java new file mode 100644 index 00000000000000..bb79fb129ef2b5 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java @@ -0,0 +1,28 @@ +/* + * 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. + */ + +/** + * Stream factory and support. + */ + +@InterfaceAudience.LimitedPrivate("Extension Libraries") +@InterfaceStability.Unstable +package org.apache.hadoop.fs.s3a.streams; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractSeek.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractSeek.java index dd41583de3fe42..60e3d66317a4c8 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractSeek.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/contract/s3a/ITestS3AContractSeek.java @@ -84,7 +84,7 @@ public class ITestS3AContractSeek extends AbstractContractSeekTest { * which S3A Supports. * @return a list of seek policies to test. */ - @Parameterized.Parameters + @Parameterized.Parameters(name="policy={0}") public static Collection params() { return Arrays.asList(new Object[][]{ {FS_OPTION_OPENFILE_READ_POLICY_SEQUENTIAL, Default_JSSE}, diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AConfiguration.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AConfiguration.java index 24115177f35a22..97af80e70a5426 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AConfiguration.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AConfiguration.java @@ -58,6 +58,7 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.alias.CredentialProvider; import org.apache.hadoop.security.alias.CredentialProviderFactory; +import org.apache.hadoop.test.AbstractHadoopTestBase; import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.util.VersionInfo; import org.apache.http.HttpStatus; @@ -75,7 +76,7 @@ /** * S3A tests for configuration, especially credentials. */ -public class ITestS3AConfiguration { +public class ITestS3AConfiguration extends AbstractHadoopTestBase { private static final String EXAMPLE_ID = "AKASOMEACCESSKEY"; private static final String EXAMPLE_KEY = "RGV0cm9pdCBSZ/WQgY2xl/YW5lZCB1cAEXAMPLE"; @@ -487,11 +488,20 @@ public void testDirectoryAllocatorDefval() throws Throwable { conf = new Configuration(); conf.unset(Constants.BUFFER_DIR); fs = S3ATestUtils.createTestFileSystem(conf); - File tmp = fs.createTmpFileForWrite("out-", 1024, conf); + File tmp = createTemporaryFileForWriting(); assertTrue("not found: " + tmp, tmp.exists()); tmp.delete(); } + /** + * Create a temporary file for writing; requires the FS to have been created/initialized. + * @return a temporary file + * @throws IOException creation issues. + */ + private File createTemporaryFileForWriting() throws IOException { + return fs.getS3AInternals().getStore().createTemporaryFileForWriting("out-", 1024, conf); + } + @Test public void testDirectoryAllocatorRR() throws Throwable { File dir1 = GenericTestUtils.getRandomizedTestDir(); @@ -501,9 +511,9 @@ public void testDirectoryAllocatorRR() throws Throwable { conf = new Configuration(); conf.set(Constants.BUFFER_DIR, dir1 + ", " + dir2); fs = S3ATestUtils.createTestFileSystem(conf); - File tmp1 = fs.createTmpFileForWrite("out-", 1024, conf); + File tmp1 = createTemporaryFileForWriting(); tmp1.delete(); - File tmp2 = fs.createTmpFileForWrite("out-", 1024, conf); + File tmp2 = createTemporaryFileForWriting(); tmp2.delete(); assertNotEquals("round robin not working", tmp1.getParent(), tmp2.getParent()); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java index 6eccdc23dd5d5d..a0a12eb1b38999 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java @@ -40,6 +40,8 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.s3a.audit.impl.NoopSpan; import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecrets; +import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; import org.apache.http.NoHttpResponseException; @@ -164,7 +166,7 @@ private static void assertReadValueMatchesOffset( * @return a stream. */ private S3AInputStream getMockedS3AInputStream( - S3AInputStream.InputStreamCallbacks streamCallback) { + StreamReadCallbacks streamCallback) { Path path = new Path("test-path"); String eTag = "test-etag"; String versionId = "test-version-id"; @@ -187,12 +189,14 @@ private S3AInputStream getMockedS3AInputStream( s3AFileStatus, NoopSpan.INSTANCE); - return new S3AInputStream( - s3AReadOpContext, - s3ObjectAttributes, - streamCallback, - s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics(), - null); + FactoryStreamParameters parameters = new FactoryStreamParameters() + .withCallbacks(streamCallback) + .withObjectAttributes(s3ObjectAttributes) + .withContext(s3AReadOpContext) + .withStreamStatistics( s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics()) + .withBoundedThreadPool(null); + + return new S3AInputStream(parameters); } /** @@ -203,7 +207,7 @@ private S3AInputStream getMockedS3AInputStream( * @param ex exception to raise on failure * @return mocked object. */ - private S3AInputStream.InputStreamCallbacks failingInputStreamCallbacks( + private StreamReadCallbacks failingInputStreamCallbacks( final RuntimeException ex) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -238,7 +242,7 @@ private S3AInputStream.InputStreamCallbacks failingInputStreamCallbacks( * @param ex exception to raise on failure * @return mocked object. */ - private S3AInputStream.InputStreamCallbacks maybeFailInGetCallback( + private StreamReadCallbacks maybeFailInGetCallback( final RuntimeException ex, final Function failurePredicate) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -259,13 +263,13 @@ private S3AInputStream.InputStreamCallbacks maybeFailInGetCallback( * @param streamFactory factory for the stream to return on the given attempt. * @return mocked object. */ - private S3AInputStream.InputStreamCallbacks mockInputStreamCallback( + private StreamReadCallbacks mockInputStreamCallback( final RuntimeException ex, final Function failurePredicate, final Function> streamFactory) { - return new S3AInputStream.InputStreamCallbacks() { + return new StreamReadCallbacks() { private int attempt = 0; @Override diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java index 5fbbc3a1279972..4a572441c56b7d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java @@ -29,8 +29,8 @@ import software.amazon.awssdk.services.s3.model.GetObjectResponse; import org.apache.hadoop.fs.impl.prefetch.Validate; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; /** @@ -95,8 +95,8 @@ public static byte byteAtOffset(int offset) { return (byte) (offset % 128); } - public static S3AInputStream.InputStreamCallbacks createClient(String bucketName) { - return new S3AInputStream.InputStreamCallbacks() { + public static StreamReadCallbacks createClient(String bucketName) { + return new StreamReadCallbacks() { @Override public ResponseInputStream getObject( GetObjectRequest request) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java index 1c509702188f39..eb7ed4fcaabfe4 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java @@ -52,7 +52,6 @@ import org.apache.hadoop.fs.s3a.S3AEncryptionMethods; import org.apache.hadoop.fs.s3a.S3AFileStatus; import org.apache.hadoop.fs.s3a.S3AInputPolicy; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.VectoredIOContext; @@ -62,6 +61,7 @@ import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.s3a.statistics.impl.CountingChangeTracker; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.io.retry.RetryPolicies; import org.apache.hadoop.io.retry.RetryPolicy; @@ -187,7 +187,7 @@ public static ResponseInputStream createS3ObjectInputStream( AbortableInputStream.create(new ByteArrayInputStream(buffer), () -> {})); } - public static S3AInputStream.InputStreamCallbacks createInputStreamCallbacks( + public static StreamReadCallbacks createInputStreamCallbacks( String bucket) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -197,7 +197,7 @@ public static S3AInputStream.InputStreamCallbacks createInputStreamCallbacks( ResponseInputStream responseInputStream = createS3ObjectInputStream(objectResponse, new byte[8]); - return new S3AInputStream.InputStreamCallbacks() { + return new StreamReadCallbacks() { @Override public ResponseInputStream getObject(GetObjectRequest request) { return responseInputStream; @@ -238,7 +238,7 @@ public static S3ARemoteInputStream createInputStream( prefetchBlockSize, prefetchBlockCount); - S3AInputStream.InputStreamCallbacks callbacks = + StreamReadCallbacks callbacks = createInputStreamCallbacks(bucket); S3AInputStreamStatistics stats = s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics(); @@ -289,7 +289,7 @@ public static class FakeS3AInMemoryInputStream public FakeS3AInMemoryInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics); } @@ -391,7 +391,7 @@ public static class FakeS3ACachingInputStream extends S3ACachingInputStream { public FakeS3ACachingInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - S3AInputStream.InputStreamCallbacks client, + StreamReadCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics, CONF, new LocalDirAllocator( diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java index 8ce26033c1182d..35a08cc792a981 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java @@ -31,11 +31,11 @@ import org.apache.hadoop.fs.FSExceptionMessages; import org.apache.hadoop.fs.impl.prefetch.ExceptionAsserts; import org.apache.hadoop.fs.impl.prefetch.ExecutorServiceFuturePool; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ATestUtils; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; import static org.assertj.core.api.Assertions.assertThat; @@ -53,7 +53,7 @@ public class TestS3ARemoteInputStream extends AbstractHadoopTestBase { private final ExecutorServiceFuturePool futurePool = new ExecutorServiceFuturePool(threadPool); - private final S3AInputStream.InputStreamCallbacks client = + private final StreamReadCallbacks client = MockS3ARemoteObject.createClient("bucket"); @Test diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java index b3788aac80834b..6cee43bb6c6b5d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java @@ -26,11 +26,11 @@ import org.apache.hadoop.fs.impl.prefetch.ExceptionAsserts; import org.apache.hadoop.fs.impl.prefetch.ExecutorServiceFuturePool; -import org.apache.hadoop.fs.s3a.S3AInputStream; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; +import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; public class TestS3ARemoteObject extends AbstractHadoopTestBase { @@ -40,7 +40,7 @@ public class TestS3ARemoteObject extends AbstractHadoopTestBase { private final ExecutorServiceFuturePool futurePool = new ExecutorServiceFuturePool(threadPool); - private final S3AInputStream.InputStreamCallbacks client = + private final StreamReadCallbacks client = MockS3ARemoteObject.createClient("bucket"); @Test diff --git a/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties b/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties index 7442a357f97771..f548e7c98f9eb4 100644 --- a/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties +++ b/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties @@ -98,3 +98,7 @@ log4j.logger.org.apache.hadoop.fs.s3a.S3AStorageStatistics=INFO # uncomment this to get S3 Delete requests to return the list of deleted objects # log4.logger.org.apache.hadoop.fs.s3a.impl.RequestFactoryImpl=TRACE +# debug service lifecycle of components such as S3AStore and +# services it launches itself. +log4.logger.org.apache.hadoop.service=DEBUG + From 560ee2e05d9a85efdaf826070a9b622ac22f1788 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Sun, 8 Dec 2024 18:07:14 +0000 Subject: [PATCH 03/13] HADOOP-19354. S3AInputStream to be created by factory under S3AStore Revision API: Make clear this is part of the fundamental store Model: * abstract stream class is now ObjectInputStream * interface is ObjectInputStreamFactory * move to package org.apache.hadoop.fs.s3a.impl.model Implementation: Prefetching stream is created this way too; adds one extra parameter. Maybe we should pass conf down too Change-Id: I5bbb5dfe585528b047a649b6c82a9d0318c7e91e --- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 95 +++++++++---------- .../apache/hadoop/fs/s3a/S3AInputStream.java | 10 +- .../ClassicObjectInputStreamFactory.java} | 15 +-- .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 1 - .../model/ObjectInputStream.java} | 19 ++-- .../model/ObjectInputStreamCallbacks.java} | 6 +- .../model/ObjectInputStreamFactory.java} | 14 +-- .../model/ObjectReadParameters.java} | 51 +++++++--- .../{streams => impl/model}/package-info.java | 14 +-- .../PrefetchingInputStreamFactory.java | 42 ++++++++ .../s3a/prefetch/S3ACachingInputStream.java | 4 +- .../s3a/prefetch/S3AInMemoryInputStream.java | 4 +- .../prefetch/S3APrefetchingInputStream.java | 47 +++++---- .../fs/s3a/prefetch/S3ARemoteInputStream.java | 6 +- .../fs/s3a/prefetch/S3ARemoteObject.java | 6 +- .../fs/s3a/TestS3AInputStreamRetry.java | 16 ++-- .../fs/s3a/prefetch/MockS3ARemoteObject.java | 6 +- .../fs/s3a/prefetch/S3APrefetchFakes.java | 12 +-- .../prefetch/TestS3ARemoteInputStream.java | 4 +- .../fs/s3a/prefetch/TestS3ARemoteObject.java | 4 +- 20 files changed, 229 insertions(+), 147 deletions(-) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams/ClassicInputStreamFactory.java => impl/ClassicObjectInputStreamFactory.java} (68%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams/AbstractS3AInputStream.java => impl/model/ObjectInputStream.java} (94%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams/StreamReadCallbacks.java => impl/model/ObjectInputStreamCallbacks.java} (92%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams/InputStreamFactory.java => impl/model/ObjectInputStreamFactory.java} (75%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams/FactoryStreamParameters.java => impl/model/ObjectReadParameters.java} (69%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{streams => impl/model}/package-info.java (69%) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java 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 bd35594a557a8a..1d5017576c4969 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 @@ -158,11 +158,11 @@ import org.apache.hadoop.fs.s3a.impl.StoreContextFactory; import org.apache.hadoop.fs.s3a.impl.UploadContentProviders; import org.apache.hadoop.fs.s3a.impl.CSEUtils; -import org.apache.hadoop.fs.s3a.prefetch.S3APrefetchingInputStream; -import org.apache.hadoop.fs.s3a.streams.ClassicInputStreamFactory; -import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; -import org.apache.hadoop.fs.s3a.streams.InputStreamFactory; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.ClassicObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperations; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperationsImpl; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -178,6 +178,7 @@ import org.apache.hadoop.fs.store.audit.ActiveThreadSpanSource; import org.apache.hadoop.fs.store.audit.AuditSpan; import org.apache.hadoop.fs.store.audit.AuditSpanSource; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.token.DelegationTokenIssuer; @@ -1941,66 +1942,62 @@ private FSDataInputStream executeOpen( auditSpan); fileInformation.applyOptions(readContext); LOG.debug("Opening '{}'", readContext); + final SemaphoredDelegatingExecutor pool = new SemaphoredDelegatingExecutor( + boundedThreadPool, + vectoredActiveRangeReads, + true, + inputStreamStats); + ObjectReadParameters parameters = new ObjectReadParameters() + .withBoundedThreadPool(pool) + .withCallbacks(createInputStreamCallbacks(auditSpan)) + .withContext(readContext.build()) + .withDirectoryAllocator(getStore().getDirectoryAllocator()) + .withObjectAttributes(createObjectAttributes(path, fileStatus)) + .withStreamStatistics(inputStreamStats) + .build(); + if (this.analyticsAcceleratorEnabled) { + return new FSDataInputStream( + new S3ASeekableStream( + this.bucket, + pathToKey(path), + s3SeekableInputStreamFactory)); + } - if (this.analyticsAcceleratorEnabled) { - return new FSDataInputStream( - new S3ASeekableStream( - this.bucket, - pathToKey(path), - s3SeekableInputStreamFactory)); - } - - if (this.prefetchEnabled) { - Configuration configuration = getConf(); - - return new FSDataInputStream( - new S3APrefetchingInputStream( - readContext.build(), - createObjectAttributes(path, fileStatus), - createInputStreamCallbacks(auditSpan), - inputStreamStats, - configuration, - getStore().getDirectoryAllocator())); - } else { - // create the factory. - // TODO: move into S3AStore and export the factory API through - // the store, which will add some of the features (callbacks, stats) - // before invoking the real factory - InputStreamFactory factory = new ClassicInputStreamFactory(); + // TODO: move into S3AStore and export the factory API through + // the store, which will add some of the features (callbacks, stats) + // before invoking the real factory + ObjectInputStreamFactory factory = null; + try { + // Choose factory. + if (prefetchEnabled) { + factory = new PrefetchingInputStreamFactory(); + } else { + factory = new ClassicObjectInputStreamFactory(); + } factory.init(getConf()); factory.start(); - FactoryStreamParameters parameters = new FactoryStreamParameters() - .withCallbacks(createInputStreamCallbacks(auditSpan)) - .withObjectAttributes(createObjectAttributes(path, fileStatus)) - .withContext(readContext.build()) - .withStreamStatistics(inputStreamStats) - .withBoundedThreadPool(new SemaphoredDelegatingExecutor( - boundedThreadPool, - vectoredActiveRangeReads, - true, - inputStreamStats)) - .build(); - - return new FSDataInputStream( - factory.create(parameters)); + return new FSDataInputStream(factory.readObject(parameters)); + } finally { + IOUtils.cleanupWithLogger(LOG, factory); } + } /** - * Override point: create the callbacks for S3AInputStream. - * @return an implementation of the InputStreamCallbacks, + * Override point: create the callbacks for ObjectInputStream. + * @return an implementation of callbacks, */ - private StreamReadCallbacks createInputStreamCallbacks( + private ObjectInputStreamCallbacks createInputStreamCallbacks( final AuditSpan auditSpan) { return new InputStreamCallbacksImpl(auditSpan); } /** - * Operations needed by S3AInputStream to read data. + * Operations needed by ObjectInputStreams to read data. */ private final class InputStreamCallbacksImpl implements - StreamReadCallbacks { + ObjectInputStreamCallbacks { /** * Audit span to activate before each call. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java index c61cc2bd358dc6..9e9b3ca96dbd49 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java @@ -39,8 +39,8 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.fs.impl.LeakReporter; -import org.apache.hadoop.fs.s3a.streams.AbstractS3AInputStream; -import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; import org.apache.hadoop.fs.statistics.StreamStatisticNames; import org.apache.hadoop.util.Preconditions; import org.apache.hadoop.classification.InterfaceAudience; @@ -87,7 +87,7 @@ */ @InterfaceAudience.Private @InterfaceStability.Evolving -public class S3AInputStream extends AbstractS3AInputStream implements CanSetReadahead, +public class S3AInputStream extends ObjectInputStream implements CanSetReadahead, CanUnbuffer, StreamCapabilities, IOStatisticsSource { public static final String E_NEGATIVE_READAHEAD_VALUE @@ -179,8 +179,10 @@ public class S3AInputStream extends AbstractS3AInputStream implements CanSetRead * Create the stream. * This does not attempt to open it; that is only done on the first * actual read() operation. + * + * @param parameters creation parameters. */ - public S3AInputStream(FactoryStreamParameters parameters) { + public S3AInputStream(ObjectReadParameters parameters) { super(parameters); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java similarity index 68% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java index a2720b0d050580..76b91821e691c9 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/ClassicInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java @@ -16,25 +16,28 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.streams; +package org.apache.hadoop.fs.s3a.impl; import java.io.IOException; import org.apache.hadoop.fs.s3a.S3AInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; import org.apache.hadoop.service.AbstractService; /** * Factory of classic {@link S3AInputStream} instances. */ -public class ClassicInputStreamFactory extends AbstractService - implements InputStreamFactory { +public class ClassicObjectInputStreamFactory extends AbstractService + implements ObjectInputStreamFactory { - public ClassicInputStreamFactory() { - super("ClassicInputStreamFactory"); + public ClassicObjectInputStreamFactory() { + super("ClassicObjectInputStreamFactory"); } @Override - public AbstractS3AInputStream create(final FactoryStreamParameters parameters) + public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { return new S3AInputStream(parameters); } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index f0f82359345701..8ca3bead0f161b 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -837,7 +837,6 @@ public CompleteMultipartUploadResponse completeMultipartUpload( return getS3Client().completeMultipartUpload(request); } - /** * Get the directory allocator. * @return the directory allocator diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java similarity index 94% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java index 645df6a113ef41..2a9bde9bf3422f 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/AbstractS3AInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.streams; +package org.apache.hadoop.fs.s3a.impl.model; import java.io.IOException; import java.util.concurrent.ExecutorService; @@ -45,14 +45,15 @@ import static org.apache.hadoop.util.StringUtils.toLowerCase; /** - * Base class for input streams returned by the factory, and therefore - * used within S3A code. + * A stream of data from an S3 object. + * The blase class includes common methods, stores + * common data and incorporates leak tracking. */ -public abstract class AbstractS3AInputStream extends FSInputStream +public abstract class ObjectInputStream extends FSInputStream implements StreamCapabilities, IOStatisticsSource { private static final Logger LOG = - LoggerFactory.getLogger(AbstractS3AInputStream.class); + LoggerFactory.getLogger(ObjectInputStream.class); /** * IOStatistics report. @@ -67,7 +68,7 @@ public abstract class AbstractS3AInputStream extends FSInputStream /** * Callbacks for reading input stream data from the S3 Store. */ - private final StreamReadCallbacks callbacks; + private final ObjectInputStreamCallbacks callbacks; /** * Thread pool used for vectored IO operation. @@ -124,8 +125,8 @@ public abstract class AbstractS3AInputStream extends FSInputStream * Constructor. * @param parameters extensible parameter list. */ - protected AbstractS3AInputStream( - FactoryStreamParameters parameters) { + protected ObjectInputStream( + ObjectReadParameters parameters) { objectAttributes = parameters.getObjectAttributes(); Preconditions.checkArgument(isNotEmpty(objectAttributes.getBucket()), @@ -276,7 +277,7 @@ protected S3AReadOpContext getContext() { return context; } - protected StreamReadCallbacks getCallbacks() { + protected ObjectInputStreamCallbacks getCallbacks() { return callbacks; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java similarity index 92% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java index c4441af07a2e2e..44fb0f068ee024 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/StreamReadCallbacks.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.streams; +package org.apache.hadoop.fs.s3a.impl.model; import java.io.Closeable; import java.io.IOException; @@ -30,9 +30,9 @@ import org.apache.hadoop.util.functional.CallableRaisingIOE; /** - * Callbacks for reading input stream data from the S3 Store. + * Callbacks for reading objectd data from the S3 Store. */ -public interface StreamReadCallbacks extends Closeable { +public interface ObjectInputStreamCallbacks extends Closeable { /** * Create a GET request builder. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java similarity index 75% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java index 56b158e50f6912..a817291606fb78 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/InputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java @@ -16,14 +16,14 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.streams; +package org.apache.hadoop.fs.s3a.impl.model; import java.io.IOException; import org.apache.hadoop.service.Service; /** - * A Factory for input streams. + * A Factory for {@link ObjectInputStream} streams. *

* This class is instantiated during initialization of * {@code S3AStore}, it then follows the same service @@ -31,18 +31,20 @@ *

* Note for maintainers: do try and keep this mostly stable. * If new parameters need to be added, expand the - * {@link FactoryStreamParameters} class, rather than change the + * {@link ObjectReadParameters} class, rather than change the * interface signature. */ -public interface InputStreamFactory extends Service { +public interface ObjectInputStreamFactory extends Service { /** * Create a new input stream. + * There is no requirement to actually contact the store; this is generally done + * lazily. * @param parameters parameters. * @return the input stream - * @throws problem creating the stream. + * @throws IOException problem creating the stream. */ - AbstractS3AInputStream create(FactoryStreamParameters parameters) + ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java similarity index 69% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java index c9f2208c505d98..e8114d7e5e7ddd 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/FactoryStreamParameters.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java @@ -16,10 +16,11 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.streams; +package org.apache.hadoop.fs.s3a.impl.model; import java.util.concurrent.ExecutorService; +import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; @@ -27,24 +28,31 @@ import static java.util.Objects.requireNonNull; /** - * Parameters for input streams created through - * {@link InputStreamFactory}. - * It is designed to be extensible; the {@link #build()} + * Parameters for object input streams created through + * {@link ObjectInputStreamFactory}. + * It is designed to support extra parameters added + * in future. + *

Note that the {@link #build()} * operation does not freeze the parameters -instead it simply * verifies that all required values are set. */ -public final class FactoryStreamParameters { +public final class ObjectReadParameters { private S3AReadOpContext context; private S3ObjectAttributes objectAttributes; - private StreamReadCallbacks callbacks; + private ObjectInputStreamCallbacks callbacks; private S3AInputStreamStatistics streamStatistics; private ExecutorService boundedThreadPool; + /** + * Allocator of local FS storage. + */ + private LocalDirAllocator directoryAllocator; + /** * Read operation context. */ @@ -57,7 +65,7 @@ public S3AReadOpContext getContext() { * @param value new value * @return the builder */ - public FactoryStreamParameters withContext(S3AReadOpContext value) { + public ObjectReadParameters withContext(S3AReadOpContext value) { context = value; return this; } @@ -74,7 +82,7 @@ public S3ObjectAttributes getObjectAttributes() { * @param value new value * @return the builder */ - public FactoryStreamParameters withObjectAttributes(S3ObjectAttributes value) { + public ObjectReadParameters withObjectAttributes(S3ObjectAttributes value) { objectAttributes = value; return this; } @@ -82,7 +90,7 @@ public FactoryStreamParameters withObjectAttributes(S3ObjectAttributes value) { /** * Callbacks to the store. */ - public StreamReadCallbacks getCallbacks() { + public ObjectInputStreamCallbacks getCallbacks() { return callbacks; } @@ -91,7 +99,7 @@ public StreamReadCallbacks getCallbacks() { * @param value new value * @return the builder */ - public FactoryStreamParameters withCallbacks(StreamReadCallbacks value) { + public ObjectReadParameters withCallbacks(ObjectInputStreamCallbacks value) { callbacks = value; return this; } @@ -108,7 +116,7 @@ public S3AInputStreamStatistics getStreamStatistics() { * @param value new value * @return the builder */ - public FactoryStreamParameters withStreamStatistics(S3AInputStreamStatistics value) { + public ObjectReadParameters withStreamStatistics(S3AInputStreamStatistics value) { streamStatistics = value; return this; } @@ -126,23 +134,38 @@ public ExecutorService getBoundedThreadPool() { * @param value new value * @return the builder */ - public FactoryStreamParameters withBoundedThreadPool(ExecutorService value) { + public ObjectReadParameters withBoundedThreadPool(ExecutorService value) { boundedThreadPool = value; return this; } + public LocalDirAllocator getDirectoryAllocator() { + return directoryAllocator; + } + + /** + * Set builder value. + * @param value new value + * @return the builder + */ + public ObjectReadParameters withDirectoryAllocator(final LocalDirAllocator value) { + directoryAllocator = value; + return this; + } + /** * Validate that all attributes are as expected. * Mock tests can skip this if required. * @return the object. */ - public FactoryStreamParameters build() { + public ObjectReadParameters build() { + // please keep in alphabetical order. requireNonNull(boundedThreadPool, "boundedThreadPool"); requireNonNull(callbacks, "callbacks"); requireNonNull(context, "context"); + requireNonNull(directoryAllocator, "directoryAllocator"); requireNonNull(objectAttributes, "objectAttributes"); requireNonNull(streamStatistics, "streamStatistics"); - requireNonNull(boundedThreadPool, "boundedThreadPool"); return this; } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java similarity index 69% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java index bb79fb129ef2b5..82bb61c2313c49 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/streams/package-info.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java @@ -17,12 +17,14 @@ */ /** - * Stream factory and support. + * This describes the model of S3 for layers above to interact with, and + * possibly extend. + *

+ * This intended for internal use, as a way of separating the layers + * above from how the store is actually interacted with. */ -@InterfaceAudience.LimitedPrivate("Extension Libraries") -@InterfaceStability.Unstable -package org.apache.hadoop.fs.s3a.streams; +@InterfaceAudience.Private +package org.apache.hadoop.fs.s3a.impl.model; -import org.apache.hadoop.classification.InterfaceAudience; -import org.apache.hadoop.classification.InterfaceStability; \ No newline at end of file +import org.apache.hadoop.classification.InterfaceAudience; \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java new file mode 100644 index 00000000000000..d2a0685c64dfa8 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java @@ -0,0 +1,42 @@ +/* + * 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.apache.hadoop.fs.s3a.prefetch; + +import java.io.IOException; + +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.service.AbstractService; + +/** + * Factory for prefetching streams. + */ +public class PrefetchingInputStreamFactory extends AbstractService + implements ObjectInputStreamFactory { + + public PrefetchingInputStreamFactory() { + super("PrefetchingInputStreamFactory"); + } + + @Override + public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { + return new S3APrefetchingInputStream(parameters, getConfig()); + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java index 3a0fd6d247fa86..544e3af8499599 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java @@ -35,7 +35,7 @@ import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import static org.apache.hadoop.fs.s3a.Constants.DEFAULT_PREFETCH_MAX_BLOCKS_COUNT; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_MAX_BLOCKS_COUNT; @@ -75,7 +75,7 @@ public class S3ACachingInputStream extends S3ARemoteInputStream { public S3ACachingInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics, Configuration conf, LocalDirAllocator localDirAllocator) { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java index a64f48dfaa2ec0..ede6a493324c3d 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; /** * Provides an {@code InputStream} that allows reading from an S3 file. @@ -61,7 +61,7 @@ public class S3AInMemoryInputStream extends S3ARemoteInputStream { public S3AInMemoryInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics); int fileSize = (int) s3Attributes.getLen(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java index f59b5b912ac2fa..0bd8d0ed5bdc4b 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java @@ -30,14 +30,15 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.CanSetReadahead; import org.apache.hadoop.fs.FSExceptionMessages; -import org.apache.hadoop.fs.FSInputStream; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -48,7 +49,7 @@ * blocks of configurable size from the underlying S3 file. */ public class S3APrefetchingInputStream - extends FSInputStream + extends ObjectInputStream implements CanSetReadahead, StreamCapabilities, IOStatisticsSource { private static final Logger LOG = LoggerFactory.getLogger( @@ -74,26 +75,21 @@ public class S3APrefetchingInputStream */ private S3AInputStreamStatistics inputStreamStatistics = null; + /** * Initializes a new instance of the {@code S3APrefetchingInputStream} class. * - * @param context read-specific operation context. - * @param s3Attributes attributes of the S3 object being read. - * @param client callbacks used for interacting with the underlying S3 client. - * @param streamStatistics statistics for this stream. + * @param parameters creation parameters. * @param conf the configuration. - * @param localDirAllocator the local dir allocator instance retrieved from S3A FS. - * @throws IllegalArgumentException if context is null. - * @throws IllegalArgumentException if s3Attributes is null. - * @throws IllegalArgumentException if client is null. + * @throws IllegalArgumentException required parameterss are null */ - public S3APrefetchingInputStream( - S3AReadOpContext context, - S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, - S3AInputStreamStatistics streamStatistics, - Configuration conf, - LocalDirAllocator localDirAllocator) { + public S3APrefetchingInputStream(final ObjectReadParameters parameters, Configuration conf) { + super(parameters); + S3ObjectAttributes s3Attributes = parameters.getObjectAttributes(); + ObjectInputStreamCallbacks client = parameters.getCallbacks(); + S3AInputStreamStatistics streamStatistics = parameters.getStreamStatistics(); + final S3AReadOpContext context = parameters.getContext(); + LocalDirAllocator localDirAllocator = parameters.getDirectoryAllocator(); Validate.checkNotNull(context, "context"); Validate.checkNotNull(s3Attributes, "s3Attributes"); @@ -198,6 +194,21 @@ public synchronized void close() throws IOException { } } + + @Override + protected boolean isStreamOpen() { + return !isClosed(); + } + + @Override + protected void abortInFinalizer() { + try { + close(); + } catch (IOException ignored) { + + } + } + /** * Updates internal data such that the next read will take place at the given {@code pos}. * diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java index 3f609b1b9532b4..63762d063228c1 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java @@ -40,7 +40,7 @@ import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -98,7 +98,7 @@ public abstract class S3ARemoteInputStream private S3ObjectAttributes s3Attributes; /** Callbacks used for interacting with the underlying S3 client. */ - private StreamReadCallbacks client; + private ObjectInputStreamCallbacks client; /** Used for reporting input stream access statistics. */ private final S3AInputStreamStatistics streamStatistics; @@ -124,7 +124,7 @@ public abstract class S3ARemoteInputStream public S3ARemoteInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { this.context = requireNonNull(context); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java index 446db4f88ac64e..a35291033da473 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java @@ -36,7 +36,7 @@ import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.SDKStreamDrainer; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -61,7 +61,7 @@ public class S3ARemoteObject { /** * Callbacks used for interacting with the underlying S3 client. */ - private final StreamReadCallbacks client; + private final ObjectInputStreamCallbacks client; /** * Used for reporting input stream access statistics. @@ -101,7 +101,7 @@ public class S3ARemoteObject { public S3ARemoteObject( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics, ChangeTracker changeTracker) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java index a0a12eb1b38999..b86206b0b2ccaa 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java @@ -40,8 +40,8 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.s3a.audit.impl.NoopSpan; import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecrets; -import org.apache.hadoop.fs.s3a.streams.FactoryStreamParameters; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; import org.apache.http.NoHttpResponseException; @@ -166,7 +166,7 @@ private static void assertReadValueMatchesOffset( * @return a stream. */ private S3AInputStream getMockedS3AInputStream( - StreamReadCallbacks streamCallback) { + ObjectInputStreamCallbacks streamCallback) { Path path = new Path("test-path"); String eTag = "test-etag"; String versionId = "test-version-id"; @@ -189,7 +189,7 @@ private S3AInputStream getMockedS3AInputStream( s3AFileStatus, NoopSpan.INSTANCE); - FactoryStreamParameters parameters = new FactoryStreamParameters() + ObjectReadParameters parameters = new ObjectReadParameters() .withCallbacks(streamCallback) .withObjectAttributes(s3ObjectAttributes) .withContext(s3AReadOpContext) @@ -207,7 +207,7 @@ private S3AInputStream getMockedS3AInputStream( * @param ex exception to raise on failure * @return mocked object. */ - private StreamReadCallbacks failingInputStreamCallbacks( + private ObjectInputStreamCallbacks failingInputStreamCallbacks( final RuntimeException ex) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -242,7 +242,7 @@ private StreamReadCallbacks failingInputStreamCallbacks( * @param ex exception to raise on failure * @return mocked object. */ - private StreamReadCallbacks maybeFailInGetCallback( + private ObjectInputStreamCallbacks maybeFailInGetCallback( final RuntimeException ex, final Function failurePredicate) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -263,13 +263,13 @@ private StreamReadCallbacks maybeFailInGetCallback( * @param streamFactory factory for the stream to return on the given attempt. * @return mocked object. */ - private StreamReadCallbacks mockInputStreamCallback( + private ObjectInputStreamCallbacks mockInputStreamCallback( final RuntimeException ex, final Function failurePredicate, final Function> streamFactory) { - return new StreamReadCallbacks() { + return new ObjectInputStreamCallbacks() { private int attempt = 0; @Override diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java index 4a572441c56b7d..3ac9863ab2e85b 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; /** @@ -95,8 +95,8 @@ public static byte byteAtOffset(int offset) { return (byte) (offset % 128); } - public static StreamReadCallbacks createClient(String bucketName) { - return new StreamReadCallbacks() { + public static ObjectInputStreamCallbacks createClient(String bucketName) { + return new ObjectInputStreamCallbacks() { @Override public ResponseInputStream getObject( GetObjectRequest request) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java index eb7ed4fcaabfe4..6f030681295852 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java @@ -61,7 +61,7 @@ import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.s3a.statistics.impl.CountingChangeTracker; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.io.retry.RetryPolicies; import org.apache.hadoop.io.retry.RetryPolicy; @@ -187,7 +187,7 @@ public static ResponseInputStream createS3ObjectInputStream( AbortableInputStream.create(new ByteArrayInputStream(buffer), () -> {})); } - public static StreamReadCallbacks createInputStreamCallbacks( + public static ObjectInputStreamCallbacks createInputStreamCallbacks( String bucket) { GetObjectResponse objectResponse = GetObjectResponse.builder() @@ -197,7 +197,7 @@ public static StreamReadCallbacks createInputStreamCallbacks( ResponseInputStream responseInputStream = createS3ObjectInputStream(objectResponse, new byte[8]); - return new StreamReadCallbacks() { + return new ObjectInputStreamCallbacks() { @Override public ResponseInputStream getObject(GetObjectRequest request) { return responseInputStream; @@ -238,7 +238,7 @@ public static S3ARemoteInputStream createInputStream( prefetchBlockSize, prefetchBlockCount); - StreamReadCallbacks callbacks = + ObjectInputStreamCallbacks callbacks = createInputStreamCallbacks(bucket); S3AInputStreamStatistics stats = s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics(); @@ -289,7 +289,7 @@ public static class FakeS3AInMemoryInputStream public FakeS3AInMemoryInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics); } @@ -391,7 +391,7 @@ public static class FakeS3ACachingInputStream extends S3ACachingInputStream { public FakeS3ACachingInputStream( S3AReadOpContext context, S3ObjectAttributes s3Attributes, - StreamReadCallbacks client, + ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { super(context, s3Attributes, client, streamStatistics, CONF, new LocalDirAllocator( diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java index 35a08cc792a981..f779840b090291 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java @@ -35,7 +35,7 @@ import org.apache.hadoop.fs.s3a.S3ATestUtils; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; import static org.assertj.core.api.Assertions.assertThat; @@ -53,7 +53,7 @@ public class TestS3ARemoteInputStream extends AbstractHadoopTestBase { private final ExecutorServiceFuturePool futurePool = new ExecutorServiceFuturePool(threadPool); - private final StreamReadCallbacks client = + private final ObjectInputStreamCallbacks client = MockS3ARemoteObject.createClient("bucket"); @Test diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java index 6cee43bb6c6b5d..4818df284f6617 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.streams.StreamReadCallbacks; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; public class TestS3ARemoteObject extends AbstractHadoopTestBase { @@ -40,7 +40,7 @@ public class TestS3ARemoteObject extends AbstractHadoopTestBase { private final ExecutorServiceFuturePool futurePool = new ExecutorServiceFuturePool(threadPool); - private final StreamReadCallbacks client = + private final ObjectInputStreamCallbacks client = MockS3ARemoteObject.createClient("bucket"); @Test From 99c29fb6cce7a76aeb69b17f03d8dec64a773ce9 Mon Sep 17 00:00:00 2001 From: Ahmar Suhail Date: Fri, 20 Dec 2024 07:18:07 +0000 Subject: [PATCH 04/13] initial commit Change-Id: If42bdd0b227c4da07c62a410a998e6d8c35581f6 --- .../org/apache/hadoop/fs/s3a/Constants.java | 5 ++ .../apache/hadoop/fs/s3a/InputStreamType.java | 29 +++++++ .../apache/hadoop/fs/s3a/S3AFileSystem.java | 79 +---------------- .../org/apache/hadoop/fs/s3a/S3AStore.java | 5 +- .../fs/s3a/impl/InputStreamCallbacksImpl.java | 87 +++++++++++++++++++ .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 40 ++++++++- 6 files changed, 168 insertions(+), 77 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index d563181bb6155c..75f3183e964bc2 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -1560,6 +1560,11 @@ private Constants() { */ public static final String AWS_AUTH_CLASS_PREFIX = "com.amazonaws.auth"; + + public static final String INPUT_STREAM_TYPE = "fs.s3a.input.stream.type"; + + public static final String INPUT_STREAM_TYPE_DEFAULT = "classic"; + /** * Controls whether the prefetching input stream is enabled. */ diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java new file mode 100644 index 00000000000000..a6fdde8a05e8df --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java @@ -0,0 +1,29 @@ +package org.apache.hadoop.fs.s3a; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public enum InputStreamType { + CLASSIC("classic"), + PREFETCH("prefetch"), + ANALYTICS("analytics"); + + private final String name; + + private static final Logger LOG = LoggerFactory.getLogger(InputStreamType.class); + + InputStreamType(String name) { + this.name = name; + } + + public static InputStreamType fromString(String inputStreamType) { + for (InputStreamType value : values()) { + if (value.name.equalsIgnoreCase(inputStreamType)) { + return value; + } + } + LOG.warn("Unknown input stream type {}, using default classic stream.", inputStreamType); + + return CLASSIC; + } +} 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 1d5017576c4969..261c5db7369c9e 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 @@ -133,6 +133,7 @@ import org.apache.hadoop.fs.s3a.impl.ContextAccessors; import org.apache.hadoop.fs.s3a.impl.CopyFromLocalOperation; import org.apache.hadoop.fs.s3a.impl.CreateFileBuilder; +import org.apache.hadoop.fs.s3a.impl.InputStreamCallbacksImpl; import org.apache.hadoop.fs.s3a.impl.S3AFileSystemOperations; import org.apache.hadoop.fs.s3a.impl.CSEV1CompatibleS3AFileSystemOperations; import org.apache.hadoop.fs.s3a.impl.CSEMaterials; @@ -1942,6 +1943,7 @@ private FSDataInputStream executeOpen( auditSpan); fileInformation.applyOptions(readContext); LOG.debug("Opening '{}'", readContext); + // QUESTION: why are we creating a new executor on each open? final SemaphoredDelegatingExecutor pool = new SemaphoredDelegatingExecutor( boundedThreadPool, vectoredActiveRangeReads, @@ -1967,21 +1969,7 @@ private FSDataInputStream executeOpen( // TODO: move into S3AStore and export the factory API through // the store, which will add some of the features (callbacks, stats) // before invoking the real factory - ObjectInputStreamFactory factory = null; - try { - // Choose factory. - if (prefetchEnabled) { - factory = new PrefetchingInputStreamFactory(); - } else { - factory = new ClassicObjectInputStreamFactory(); - } - factory.init(getConf()); - factory.start(); - return new FSDataInputStream(factory.readObject(parameters)); - } finally { - IOUtils.cleanupWithLogger(LOG, factory); - } - + return new FSDataInputStream(getStore().readObject(parameters)); } /** @@ -1990,68 +1978,9 @@ private FSDataInputStream executeOpen( */ private ObjectInputStreamCallbacks createInputStreamCallbacks( final AuditSpan auditSpan) { - return new InputStreamCallbacksImpl(auditSpan); + return new InputStreamCallbacksImpl(auditSpan, getStore(), fsHandler, unboundedThreadPool); } - /** - * Operations needed by ObjectInputStreams to read data. - */ - private final class InputStreamCallbacksImpl implements - ObjectInputStreamCallbacks { - - /** - * Audit span to activate before each call. - */ - private final AuditSpan auditSpan; - - /** - * Create. - * @param auditSpan Audit span to activate before each call. - */ - private InputStreamCallbacksImpl(final AuditSpan auditSpan) { - this.auditSpan = requireNonNull(auditSpan); - } - - /** - * Closes the audit span. - */ - @Override - public void close() { - auditSpan.close(); - } - - @Override - public GetObjectRequest.Builder newGetRequestBuilder(final String key) { - // active the audit span used for the operation - try (AuditSpan span = auditSpan.activate()) { - return getRequestFactory().newGetObjectRequestBuilder(key); - } - } - - @Override - public ResponseInputStream getObject(GetObjectRequest request) throws - IOException { - // active the audit span used for the operation - try (AuditSpan span = auditSpan.activate()) { - return fsHandler.getObject(getStore(), request, getRequestFactory()); - } - } - - @Override - public CompletableFuture submit(final CallableRaisingIOE operation) { - CompletableFuture result = new CompletableFuture<>(); - unboundedThreadPool.submit(() -> - LambdaUtils.eval(result, () -> { - LOG.debug("Starting submitted operation in {}", auditSpan.getSpanId()); - try (AuditSpan span = auditSpan.activate()) { - return operation.apply(); - } finally { - LOG.debug("Completed submitted operation in {}", auditSpan.getSpanId()); - } - })); - return result; - } - } /** * Callbacks for WriteOperationHelper. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java index c1cdc172600d6c..44f3bff604319e 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java @@ -46,6 +46,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; @@ -53,6 +54,8 @@ import org.apache.hadoop.fs.s3a.impl.MultiObjectDeleteException; import org.apache.hadoop.fs.s3a.impl.S3AFileSystemOperations; import org.apache.hadoop.fs.s3a.impl.StoreContext; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -73,7 +76,7 @@ */ @InterfaceAudience.LimitedPrivate("Extensions") @InterfaceStability.Unstable -public interface S3AStore extends Service, IOStatisticsSource, ClientManager { +public interface S3AStore extends Service, IOStatisticsSource, ClientManager, ObjectInputStreamFactory { /** * Acquire write capacity for operations. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java new file mode 100644 index 00000000000000..c8c0c720b70757 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java @@ -0,0 +1,87 @@ +package org.apache.hadoop.fs.s3a.impl; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadPoolExecutor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; + +import org.apache.hadoop.fs.s3a.S3AStore; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.store.audit.AuditSpan; +import org.apache.hadoop.util.LambdaUtils; +import org.apache.hadoop.util.functional.CallableRaisingIOE; + +import static java.util.Objects.requireNonNull; + +public class InputStreamCallbacksImpl implements ObjectInputStreamCallbacks { + + /** + * Audit span to activate before each call. + */ + private final AuditSpan auditSpan; + + private final S3AStore store; + + private final S3AFileSystemOperations fsHandler; + + private static final Logger LOG = LoggerFactory.getLogger(InputStreamCallbacksImpl.class); + + private final ThreadPoolExecutor unboundedThreadPool; + + /** + * Create. + * @param auditSpan Audit span to activate before each call. + */ + public InputStreamCallbacksImpl(final AuditSpan auditSpan, final S3AStore store, + S3AFileSystemOperations fsHandler, ThreadPoolExecutor unboundedThreadPool) { + this.auditSpan = requireNonNull(auditSpan); + this.store = requireNonNull(store); + this.fsHandler = requireNonNull(fsHandler); + this.unboundedThreadPool = requireNonNull(unboundedThreadPool); + } + + /** + * Closes the audit span. + */ + @Override + public void close() { + auditSpan.close(); + } + + @Override + public GetObjectRequest.Builder newGetRequestBuilder(final String key) { + // active the audit span used for the operation + try (AuditSpan span = auditSpan.activate()) { + return store.getRequestFactory().newGetObjectRequestBuilder(key); + } + } + + @Override + public ResponseInputStream getObject(GetObjectRequest request) throws + IOException { + // active the audit span used for the operation + try (AuditSpan span = auditSpan.activate()) { + return fsHandler.getObject(store, request, store.getRequestFactory()); + } + } + + @Override + public CompletableFuture submit(final CallableRaisingIOE operation) { + CompletableFuture result = new CompletableFuture<>(); + unboundedThreadPool.submit(() -> + LambdaUtils.eval(result, () -> { + LOG.debug("Starting submitted operation in {}", auditSpan.getSpanId()); + try (AuditSpan span = auditSpan.activate()) { + return operation.apply(); + } finally { + LOG.debug("Completed submitted operation in {}", auditSpan.getSpanId()); + } + })); + return result; + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index 8ca3bead0f161b..f32b97c154abde 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -58,9 +58,11 @@ import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.s3a.InputStreamType; import org.apache.hadoop.fs.s3a.Invoker; import org.apache.hadoop.fs.s3a.ProgressableProgressListener; import org.apache.hadoop.fs.s3a.Retries; @@ -72,6 +74,10 @@ import org.apache.hadoop.fs.s3a.UploadInfo; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.audit.AuditSpanS3A; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTracker; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; @@ -85,6 +91,8 @@ import static java.util.Objects.requireNonNull; import static org.apache.hadoop.fs.s3a.Constants.BUFFER_DIR; import static org.apache.hadoop.fs.s3a.Constants.HADOOP_TMP_DIR; +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE; +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_DEFAULT; import static org.apache.hadoop.fs.s3a.S3AUtils.extractException; import static org.apache.hadoop.fs.s3a.S3AUtils.getPutRequestLength; import static org.apache.hadoop.fs.s3a.S3AUtils.isThrottleException; @@ -108,6 +116,7 @@ import static org.apache.hadoop.fs.statistics.StoreStatisticNames.ACTION_HTTP_GET_REQUEST; import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfOperation; import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfSupplier; +import static org.apache.hadoop.io.IOUtils.cleanupWithLogger; import static org.apache.hadoop.util.Preconditions.checkArgument; /** @@ -116,7 +125,7 @@ * to move. */ public class S3AStoreImpl extends CompositeService - implements S3AStore { + implements S3AStore, ObjectInputStreamFactory { private static final Logger LOG = LoggerFactory.getLogger(S3AStoreImpl.class); @@ -177,6 +186,8 @@ public class S3AStoreImpl extends CompositeService */ private LocalDirAllocator directoryAllocator; + private ObjectInputStreamFactory objectInputStreamFactory; + /** Constructor to create S3A store. */ S3AStoreImpl(StoreContextFactory storeContextFactory, ClientManager clientManager, @@ -209,12 +220,14 @@ public class S3AStoreImpl extends CompositeService protected void serviceStart() throws Exception { super.serviceStart(); initLocalDirAllocator(); + initInputStreamFactory(); } @Override protected void serviceStop() throws Exception { super.serviceStop(); clientManager.close(); + cleanupWithLogger(LOG, objectInputStreamFactory); } /** @@ -226,6 +239,20 @@ private void initLocalDirAllocator() { directoryAllocator = new LocalDirAllocator(bufferDir); } + private void initInputStreamFactory() { + InputStreamType inputStreamType = InputStreamType.fromString(getConfig().get(INPUT_STREAM_TYPE, INPUT_STREAM_TYPE_DEFAULT)); + switch (inputStreamType) { + case PREFETCH: + this.objectInputStreamFactory = new PrefetchingInputStreamFactory(); + break; + default: + this.objectInputStreamFactory = new ClassicObjectInputStreamFactory(); + } + + this.objectInputStreamFactory.init(getConfig()); + this.objectInputStreamFactory.start(); + } + /** Acquire write capacity for rate limiting {@inheritDoc}. */ @Override public Duration acquireWriteCapacity(final int capacity) { @@ -871,4 +898,15 @@ public File createTemporaryFileForWriting(String pathStr, return File.createTempFile(prefix, null, dir); } + @Override + public ObjectInputStream readObject(ObjectReadParameters parameters) + throws IOException { + if (objectInputStreamFactory != null) { + return objectInputStreamFactory.readObject(parameters); + } else { + // TODO: Find the right exception to throw if factory has not yet been initialised, or closed. + throw new IOException("Factory not initialized!"); + } + } + } From 650c556146b11d1df5a282945f7b89adec32c5ea Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Mon, 30 Dec 2024 18:55:32 +0000 Subject: [PATCH 05/13] HADOOP-19354. stream factories Moves all prefetching stream related options into the prefetching stream factory; the standard ReadOpContext removes them, so a new PrefetchingOptions is passed around. Stream factories can now declare how many extra shared threads they want and whether or not to create a future pool around the bounded pool. This is used in S3AFileSystem when creating its thread pools -this class no longer reads in any of the prefetching options. All tests which enable/disable prefetching, or probe for its state, now use S3ATestUtils methods for this. This avoids them having to now explicitly unset two properties, set the new input stream type, and any more complications in test setup in future. Everything under S3AStore is a service, so service lifecycle matches everywhere -and store just adds to the list of managed services for start/stop/close integration. + adjust assertions in ITestS3AInputStreamLeakage for prefetching + update the prefetching.md doc for factory changs + javadocs + add string values of type names to Constants Once the analytics stream is in, a full doc on "stream performance" will be needed. package for this stuff is now impl.streams Change-Id: Id6356d2ded2c477ba16cbb9027ac0cfbece2a542 --- .../dev-support/findbugs-exclude.xml | 2 +- .../org/apache/hadoop/fs/s3a/Constants.java | 24 +++++- .../apache/hadoop/fs/s3a/InputStreamType.java | 29 ------- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 80 ++++++++---------- .../apache/hadoop/fs/s3a/S3AInputStream.java | 17 ++-- .../hadoop/fs/s3a/S3AReadOpContext.java | 42 ++-------- .../org/apache/hadoop/fs/s3a/S3AStore.java | 10 ++- .../impl/ClassicObjectInputStreamFactory.java | 6 +- .../hadoop/fs/s3a/impl/ClientManager.java | 5 +- .../hadoop/fs/s3a/impl/ClientManagerImpl.java | 56 +++++-------- .../fs/s3a/impl/InputStreamCallbacksImpl.java | 62 +++++++++++--- .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 81 +++++++++---------- .../fs/s3a/impl/streams/InputStreamType.java | 64 +++++++++++++++ .../{model => streams}/ObjectInputStream.java | 53 ++++++------ .../ObjectInputStreamCallbacks.java | 2 +- .../ObjectInputStreamFactory.java | 44 +++++++++- .../ObjectReadParameters.java | 29 +++++-- .../s3a/impl/streams/StreamIntegration.java | 71 ++++++++++++++++ .../impl/{model => streams}/package-info.java | 9 +-- .../fs/s3a/prefetch/PrefetchOptions.java | 67 +++++++++++++++ .../PrefetchingInputStreamFactory.java | 57 ++++++++++++- .../s3a/prefetch/S3ACachingInputStream.java | 14 ++-- .../s3a/prefetch/S3AInMemoryInputStream.java | 5 +- .../prefetch/S3APrefetchingInputStream.java | 37 +++++---- .../fs/s3a/prefetch/S3ARemoteInputStream.java | 10 +-- .../fs/s3a/prefetch/S3ARemoteObject.java | 2 +- .../markdown/tools/hadoop-aws/prefetching.md | 14 +++- .../fs/s3a/ITestS3AInputStreamLeakage.java | 42 ++++++---- .../fs/s3a/ITestS3APrefetchingCacheFiles.java | 5 +- .../s3a/ITestS3APrefetchingInputStream.java | 9 +-- .../s3a/ITestS3APrefetchingLruEviction.java | 10 +-- .../hadoop/fs/s3a/ITestS3ARequesterPays.java | 5 +- .../apache/hadoop/fs/s3a/S3ATestUtils.java | 33 +++++++- .../fs/s3a/TestS3AInputStreamRetry.java | 7 +- .../fs/s3a/impl/ITestConnectionTimeouts.java | 7 +- .../fs/s3a/performance/ITestS3AOpenCost.java | 6 +- .../performance/ITestUnbufferDraining.java | 5 +- .../fs/s3a/prefetch/MockS3ARemoteObject.java | 4 +- .../fs/s3a/prefetch/S3APrefetchFakes.java | 33 ++++---- .../prefetch/TestS3ARemoteInputStream.java | 17 ++-- .../fs/s3a/prefetch/TestS3ARemoteObject.java | 4 +- .../scale/ITestS3AInputStreamPerformance.java | 6 +- 42 files changed, 709 insertions(+), 376 deletions(-) delete mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{model => streams}/ObjectInputStream.java (86%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{model => streams}/ObjectInputStreamCallbacks.java (97%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{model => streams}/ObjectInputStreamFactory.java (58%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{model => streams}/ObjectReadParameters.java (92%) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{model => streams}/package-info.java (77%) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchOptions.java diff --git a/hadoop-tools/hadoop-aws/dev-support/findbugs-exclude.xml b/hadoop-tools/hadoop-aws/dev-support/findbugs-exclude.xml index 39a9e51ac8125a..11410a24c1ad22 100644 --- a/hadoop-tools/hadoop-aws/dev-support/findbugs-exclude.xml +++ b/hadoop-tools/hadoop-aws/dev-support/findbugs-exclude.xml @@ -30,7 +30,7 @@ - + diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index 75f3183e964bc2..da2dd9e2940728 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -1561,9 +1561,31 @@ private Constants() { public static final String AWS_AUTH_CLASS_PREFIX = "com.amazonaws.auth"; + /** + * Input stream type: {@value}. + */ public static final String INPUT_STREAM_TYPE = "fs.s3a.input.stream.type"; - public static final String INPUT_STREAM_TYPE_DEFAULT = "classic"; + /** + * The classic input stream: {@value}. + */ + public static final String INPUT_STREAM_TYPE_CLASSIC = "classic"; + + /** + * The prefetching input stream: {@value}. + */ + public static final String INPUT_STREAM_TYPE_PREFETCH = "prefetch"; + + /** + * The analytics input stream: {@value}. + */ + public static final String INPUT_STREAM_TYPE_ANALYTICS = "analytics"; + + /** + * The default input stream. + * Currently {@link #INPUT_STREAM_TYPE_CLASSIC} + */ + public static final String INPUT_STREAM_TYPE_DEFAULT = INPUT_STREAM_TYPE_CLASSIC; /** * Controls whether the prefetching input stream is enabled. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java deleted file mode 100644 index a6fdde8a05e8df..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/InputStreamType.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.apache.hadoop.fs.s3a; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public enum InputStreamType { - CLASSIC("classic"), - PREFETCH("prefetch"), - ANALYTICS("analytics"); - - private final String name; - - private static final Logger LOG = LoggerFactory.getLogger(InputStreamType.class); - - InputStreamType(String name) { - this.name = name; - } - - public static InputStreamType fromString(String inputStreamType) { - for (InputStreamType value : values()) { - if (value.name.equalsIgnoreCase(inputStreamType)) { - return value; - } - } - LOG.warn("Unknown input stream type {}, using default classic stream.", inputStreamType); - - return CLASSIC; - } -} 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 261c5db7369c9e..58c46197551b6f 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 @@ -52,7 +52,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; -import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Client; @@ -60,8 +59,6 @@ import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.GetBucketLocationRequest; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.HeadBucketResponse; import software.amazon.awssdk.services.s3.model.MultipartUpload; @@ -159,11 +156,9 @@ import org.apache.hadoop.fs.s3a.impl.StoreContextFactory; import org.apache.hadoop.fs.s3a.impl.UploadContentProviders; import org.apache.hadoop.fs.s3a.impl.CSEUtils; -import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.ClassicObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperations; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperationsImpl; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -179,7 +174,6 @@ import org.apache.hadoop.fs.store.audit.ActiveThreadSpanSource; import org.apache.hadoop.fs.store.audit.AuditSpan; import org.apache.hadoop.fs.store.audit.AuditSpanSource; -import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.token.DelegationTokenIssuer; @@ -355,24 +349,17 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, private ExecutorService boundedThreadPool; private ThreadPoolExecutor unboundedThreadPool; - // S3 reads are prefetched asynchronously using this future pool. + /** + * Future pool built on the bounded thread pool. + */ private ExecutorServiceFuturePool futurePool; - // If true, the prefetching input stream is used for reads. - private boolean prefetchEnabled; - - // If true, S3SeekableInputStream from Analytics Accelerator for Amazon S3 will be used. - private boolean analyticsAcceleratorEnabled; - - private boolean analyticsAcceleratorCRTEnabled; + // If true, S3SeekableInputStream from Analytics Accelerator for Amazon S3 will be used. + private boolean analyticsAcceleratorEnabled; - // Size in bytes of a single prefetch block. - private int prefetchBlockSize; + private boolean analyticsAcceleratorCRTEnabled; - // Size of prefetch queue (in number of blocks). - private int prefetchBlockCount; - - private int executorCapacity; + private int executorCapacity; private long multiPartThreshold; public static final Logger LOG = LoggerFactory.getLogger(S3AFileSystem.class); @@ -697,23 +684,14 @@ public void initialize(URI name, Configuration originalConf) dirOperationsPurgeUploads = conf.getBoolean(DIRECTORY_OPERATIONS_PURGE_UPLOADS, s3ExpressStore); - this.prefetchEnabled = conf.getBoolean(PREFETCH_ENABLED_KEY, PREFETCH_ENABLED_DEFAULT); - long prefetchBlockSizeLong = - longBytesOption(conf, PREFETCH_BLOCK_SIZE_KEY, PREFETCH_BLOCK_DEFAULT_SIZE, 1); - if (prefetchBlockSizeLong > (long) Integer.MAX_VALUE) { - throw new IOException("S3A prefatch block size exceeds int limit"); - } - this.prefetchBlockSize = (int) prefetchBlockSizeLong; - this.prefetchBlockCount = - intOption(conf, PREFETCH_BLOCK_COUNT_KEY, PREFETCH_BLOCK_DEFAULT_COUNT, 1); + this.analyticsAcceleratorEnabled = + conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); + this.analyticsAcceleratorCRTEnabled = + conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, + ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); - this.analyticsAcceleratorEnabled = - conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); - this.analyticsAcceleratorCRTEnabled = - conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, - ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); - this.isMultipartUploadEnabled = conf.getBoolean(MULTIPART_UPLOADS_ENABLED, + this.isMultipartUploadEnabled = conf.getBoolean(MULTIPART_UPLOADS_ENABLED, DEFAULT_MULTIPART_UPLOAD_ENABLED); if(this.analyticsAcceleratorEnabled && !analyticsAcceleratorCRTEnabled) { @@ -724,8 +702,6 @@ public void initialize(URI name, Configuration originalConf) // multipart copy and upload are the same; this just makes it explicit this.isMultipartCopyEnabled = isMultipartUploadEnabled; - initThreadPools(conf); - int listVersion = conf.getInt(LIST_VERSION, DEFAULT_LIST_VERSION); if (listVersion < 1 || listVersion > 2) { LOG.warn("Configured fs.s3a.list.version {} is invalid, forcing " + @@ -849,6 +825,10 @@ public void initialize(URI name, Configuration originalConf) // this is to aid mocking. s3Client = getStore().getOrCreateS3Client(); + // thread pool init requires store to be created + initThreadPools(); + + if (this.analyticsAcceleratorEnabled) { LOG.info("Using S3SeekableInputStream"); if(this.analyticsAcceleratorCRTEnabled) { @@ -1017,12 +997,15 @@ public Statistics getInstanceStatistics() { } /** - * Initialize the thread pool. + * Initialize the thread pools. * This must be re-invoked after replacing the S3Client during test * runs. * @param conf configuration. */ - private void initThreadPools(Configuration conf) { + private void initThreadPools() { + + Configuration conf = getConf(); + final String name = "s3a-transfer-" + getBucket(); int maxThreads = conf.getInt(MAX_THREADS, DEFAULT_MAX_THREADS); if (maxThreads < 2) { @@ -1038,7 +1021,9 @@ private void initThreadPools(Configuration conf) { TimeUnit.SECONDS, Duration.ZERO).getSeconds(); - int numPrefetchThreads = this.prefetchEnabled ? this.prefetchBlockCount : 0; + final ObjectInputStreamFactory.ThreadOptions requirements = + getStore().prefetchThreadRequirements(); + int numPrefetchThreads = requirements.sharedThreads(); int activeTasksForBoundedThreadPool = maxThreads; int waitingTasksForBoundedThreadPool = maxThreads + totalTasks + numPrefetchThreads; @@ -1056,7 +1041,7 @@ private void initThreadPools(Configuration conf) { unboundedThreadPool.allowCoreThreadTimeOut(true); executorCapacity = intOption(conf, EXECUTOR_CAPACITY, DEFAULT_EXECUTOR_CAPACITY, 1); - if (prefetchEnabled) { + if (requirements.createFuturePool()) { final S3AInputStreamStatistics s3AInputStreamStatistics = statisticsContext.newInputStreamStatistics(); futurePool = new ExecutorServiceFuturePool( @@ -2053,9 +2038,8 @@ protected S3AReadOpContext createReadContext( fileStatus, vectoredIOContext, IOStatisticsContext.getCurrentIOStatisticsContext().getAggregator(), - futurePool, - prefetchBlockSize, - prefetchBlockCount) + futurePool + ) .withAuditSpan(auditSpan); openFileHelper.applyDefaultOptions(roc); return roc.build(); @@ -5587,7 +5571,7 @@ public boolean hasPathCapability(final Path path, final String capability) // stream leak detection. case StreamStatisticNames.STREAM_LEAKS: - return !prefetchEnabled; + return true; default: // is it a performance flag? diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java index 9e9b3ca96dbd49..859eb8dfa0a4a8 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AInputStream.java @@ -39,9 +39,8 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.fs.impl.LeakReporter; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; -import org.apache.hadoop.fs.statistics.StreamStatisticNames; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.util.Preconditions; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -191,7 +190,7 @@ public S3AInputStream(ObjectReadParameters parameters) { S3AReadOpContext context = getContext(); this.changeTracker = new ChangeTracker(getUri(), context.getChangeDetectionPolicy(), - getStreamStatistics().getChangeTrackerStatistics(), + getS3AStreamStatistics().getChangeTrackerStatistics(), getObjectAttributes()); setReadahead(context.getReadahead()); this.asyncDrainThreshold = context.getAsyncDrainThreshold(); @@ -873,7 +872,8 @@ public synchronized void readVectored(List ranges, if (isOrderedDisjoint(sortedRanges, 1, minSeekForVectorReads())) { LOG.debug("Not merging the ranges as they are disjoint"); - getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), sortedRanges.size()); + getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), + sortedRanges.size()); for (FileRange range: sortedRanges) { ByteBuffer buffer = allocate.apply(range.getLength()); getBoundedThreadPool().submit(() -> readSingleRange(range, buffer)); @@ -883,7 +883,8 @@ public synchronized void readVectored(List ranges, List combinedFileRanges = mergeSortedRanges(sortedRanges, 1, minSeekForVectorReads(), maxReadSizeForVectorReads()); - getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), combinedFileRanges.size()); + getS3AStreamStatistics().readVectoredOperationStarted(sortedRanges.size(), + combinedFileRanges.size()); LOG.debug("Number of original ranges size {} , Number of combined ranges {} ", ranges.size(), combinedFileRanges.size()); for (CombinedFileRange combinedFileRange: combinedFileRanges) { @@ -1289,9 +1290,9 @@ public synchronized void unbuffer() { @Override public boolean hasCapability(String capability) { switch (toLowerCase(capability)) { - case StreamCapabilities.IOSTATISTICS: case StreamCapabilities.IOSTATISTICS_CONTEXT: - case StreamStatisticNames.STREAM_LEAKS: + case StreamCapabilities.READAHEAD: + case StreamCapabilities.UNBUFFER: return true; default: return super.hasCapability(capability); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java index 67fc38d2c1ef8b..0895e6a6c11550 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AReadOpContext.java @@ -75,15 +75,11 @@ public class S3AReadOpContext extends S3AOpContext { /** Thread-level IOStatistics aggregator. **/ private final IOStatisticsAggregator ioStatisticsAggregator; - // S3 reads are prefetched asynchronously using this future pool. + /** + * Pool for any future IO. + */ private ExecutorServiceFuturePool futurePool; - // Size in bytes of a single prefetch block. - private final int prefetchBlockSize; - - // Size of prefetch queue (in number of blocks). - private final int prefetchBlockCount; - /** * Instantiate. * @param path path of read @@ -93,9 +89,7 @@ public class S3AReadOpContext extends S3AOpContext { * @param dstFileStatus target file status * @param vectoredIOContext context for vectored read operation. * @param ioStatisticsAggregator IOStatistics aggregator for each thread. - * @param futurePool the ExecutorServiceFuturePool instance used by async prefetches. - * @param prefetchBlockSize the size (in number of bytes) of each prefetched block. - * @param prefetchBlockCount maximum number of prefetched blocks. + * @param futurePool Pool for any future IO */ public S3AReadOpContext( final Path path, @@ -105,9 +99,7 @@ public S3AReadOpContext( FileStatus dstFileStatus, VectoredIOContext vectoredIOContext, IOStatisticsAggregator ioStatisticsAggregator, - ExecutorServiceFuturePool futurePool, - int prefetchBlockSize, - int prefetchBlockCount) { + ExecutorServiceFuturePool futurePool) { super(invoker, stats, instrumentation, dstFileStatus); @@ -115,12 +107,7 @@ public S3AReadOpContext( this.vectoredIOContext = requireNonNull(vectoredIOContext, "vectoredIOContext"); this.ioStatisticsAggregator = ioStatisticsAggregator; this.futurePool = futurePool; - Preconditions.checkArgument( - prefetchBlockSize > 0, "invalid prefetchBlockSize %d", prefetchBlockSize); - this.prefetchBlockSize = prefetchBlockSize; - Preconditions.checkArgument( - prefetchBlockCount > 0, "invalid prefetchBlockCount %d", prefetchBlockCount); - this.prefetchBlockCount = prefetchBlockCount; + } /** @@ -265,23 +252,6 @@ public ExecutorServiceFuturePool getFuturePool() { return this.futurePool; } - /** - * Gets the size in bytes of a single prefetch block. - * - * @return the size in bytes of a single prefetch block. - */ - public int getPrefetchBlockSize() { - return this.prefetchBlockSize; - } - - /** - * Gets the size of prefetch queue (in number of blocks). - * - * @return the size of prefetch queue (in number of blocks). - */ - public int getPrefetchBlockCount() { - return this.prefetchBlockCount; - } @Override public String toString() { diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java index 44f3bff604319e..1dccd9d950869c 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java @@ -46,7 +46,6 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; @@ -54,8 +53,7 @@ import org.apache.hadoop.fs.s3a.impl.MultiObjectDeleteException; import org.apache.hadoop.fs.s3a.impl.S3AFileSystemOperations; import org.apache.hadoop.fs.s3a.impl.StoreContext; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -76,7 +74,11 @@ */ @InterfaceAudience.LimitedPrivate("Extensions") @InterfaceStability.Unstable -public interface S3AStore extends Service, IOStatisticsSource, ClientManager, ObjectInputStreamFactory { +public interface S3AStore extends + ClientManager, + IOStatisticsSource, + ObjectInputStreamFactory, + Service { /** * Acquire write capacity for operations. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java index 76b91821e691c9..7d401b11cb2a53 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java @@ -21,9 +21,9 @@ import java.io.IOException; import org.apache.hadoop.fs.s3a.S3AInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.service.AbstractService; /** diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java index d29fd14cbdf464..b60551088824ce 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManager.java @@ -18,7 +18,6 @@ package org.apache.hadoop.fs.s3a.impl; -import java.io.Closeable; import java.io.IOException; import java.io.UncheckedIOException; @@ -26,11 +25,13 @@ import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.transfer.s3.S3TransferManager; +import org.apache.hadoop.service.Service; + /** * Interface for on-demand/async creation of AWS clients * and extension services. */ -public interface ClientManager extends Closeable { +public interface ClientManager extends Service { /** * Get the transfer manager, creating it and any dependencies if needed. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManagerImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManagerImpl.java index 44383e381248fb..2632c0820e854a 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManagerImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClientManagerImpl.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +34,7 @@ import org.apache.hadoop.fs.s3a.S3ClientFactory; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; +import org.apache.hadoop.service.AbstractService; import org.apache.hadoop.util.functional.CallableRaisingIOE; import org.apache.hadoop.util.functional.LazyAutoCloseableReference; @@ -49,11 +49,13 @@ /** * Client manager for on-demand creation of S3 clients, - * with parallelized close of them in {@link #close()}. + * with parallelized close of them in {@link #serviceStop()}. * Updates {@link org.apache.hadoop.fs.s3a.Statistic#STORE_CLIENT_CREATION} * to track count and duration of client creation. */ -public class ClientManagerImpl implements ClientManager { +public class ClientManagerImpl + extends AbstractService + implements ClientManager { public static final Logger LOG = LoggerFactory.getLogger(ClientManagerImpl.class); @@ -67,11 +69,6 @@ public class ClientManagerImpl implements ClientManager { */ private final S3ClientFactory unencryptedClientFactory; - /** - * Closed flag. - */ - private final AtomicBoolean closed = new AtomicBoolean(false); - /** * Parameters to create sync/async clients. */ @@ -115,6 +112,7 @@ public ClientManagerImpl( final S3ClientFactory unencryptedClientFactory, final S3ClientFactory.S3ClientCreationParameters clientCreationParameters, final DurationTrackerFactory durationTrackerFactory) { + super("ClientManager"); this.clientFactory = requireNonNull(clientFactory); this.unencryptedClientFactory = unencryptedClientFactory; this.clientCreationParameters = requireNonNull(clientCreationParameters); @@ -226,26 +224,8 @@ public synchronized S3TransferManager getOrCreateTransferManager() throws IOExce return transferManager.eval(); } - /** - * Check that the client manager is not closed. - * @throws IllegalStateException if it is closed. - */ - private void checkNotClosed() { - checkState(!closed.get(), "Client manager is closed"); - } - - /** - * Close() is synchronized to avoid race conditions between - * slow client creation and this close operation. - *

- * The objects are all deleted in parallel - */ @Override - public synchronized void close() { - if (closed.getAndSet(true)) { - // re-entrant close. - return; - } + protected void serviceStop() throws Exception { // queue the closures. List> l = new ArrayList<>(); l.add(closeAsync(transferManager)); @@ -253,14 +233,18 @@ public synchronized void close() { l.add(closeAsync(s3Client)); l.add(closeAsync(unencryptedS3Client)); - // once all are queued, await their completion - // and swallow any exception. - try { - awaitAllFutures(l); - } catch (Exception e) { - // should never happen. - LOG.warn("Exception in close", e); - } + // once all are queued, await their completion; + // exceptions will be swallowed. + awaitAllFutures(l); + super.serviceStop(); + } + + /** + * Check that the client manager is not closed. + * @throws IllegalStateException if it is closed. + */ + private void checkNotClosed() { + checkState(!isInState(STATE.STOPPED), "Client manager is closed"); } /** @@ -297,7 +281,7 @@ private CompletableFuture closeAsync( @Override public String toString() { return "ClientManagerImpl{" + - "closed=" + closed.get() + + "state=" + getServiceState() + ", s3Client=" + s3Client + ", s3AsyncClient=" + s3AsyncClient + ", unencryptedS3Client=" + unencryptedS3Client + diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java index c8c0c720b70757..fde21f7a9b9200 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/InputStreamCallbacksImpl.java @@ -1,3 +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.apache.hadoop.fs.s3a.impl; import java.io.IOException; @@ -11,38 +29,56 @@ import software.amazon.awssdk.services.s3.model.GetObjectResponse; import org.apache.hadoop.fs.s3a.S3AStore; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.store.audit.AuditSpan; -import org.apache.hadoop.util.LambdaUtils; import org.apache.hadoop.util.functional.CallableRaisingIOE; import static java.util.Objects.requireNonNull; +import static org.apache.hadoop.util.LambdaUtils.eval; +/** + * Callbacks for object stream operations. + */ public class InputStreamCallbacksImpl implements ObjectInputStreamCallbacks { + private static final Logger LOG = LoggerFactory.getLogger(InputStreamCallbacksImpl.class); + /** * Audit span to activate before each call. */ private final AuditSpan auditSpan; + /** + * store operations. + */ private final S3AStore store; - private final S3AFileSystemOperations fsHandler; - - private static final Logger LOG = LoggerFactory.getLogger(InputStreamCallbacksImpl.class); + /** + * crypto FS operations. + */ + private final S3AFileSystemOperations fsOperations; - private final ThreadPoolExecutor unboundedThreadPool; + /** + * A (restricted) thread pool for asynchronous operations. + */ + private final ThreadPoolExecutor threadPool; /** * Create. * @param auditSpan Audit span to activate before each call. + * @param store store operations + * @param fsOperations crypto FS operations. + * @param threadPool thread pool for async operations. */ - public InputStreamCallbacksImpl(final AuditSpan auditSpan, final S3AStore store, - S3AFileSystemOperations fsHandler, ThreadPoolExecutor unboundedThreadPool) { + public InputStreamCallbacksImpl( + final AuditSpan auditSpan, + final S3AStore store, + final S3AFileSystemOperations fsOperations, + final ThreadPoolExecutor threadPool) { this.auditSpan = requireNonNull(auditSpan); this.store = requireNonNull(store); - this.fsHandler = requireNonNull(fsHandler); - this.unboundedThreadPool = requireNonNull(unboundedThreadPool); + this.fsOperations = requireNonNull(fsOperations); + this.threadPool = requireNonNull(threadPool); } /** @@ -66,15 +102,15 @@ public ResponseInputStream getObject(GetObjectRequest request IOException { // active the audit span used for the operation try (AuditSpan span = auditSpan.activate()) { - return fsHandler.getObject(store, request, store.getRequestFactory()); + return fsOperations.getObject(store, request, store.getRequestFactory()); } } @Override public CompletableFuture submit(final CallableRaisingIOE operation) { CompletableFuture result = new CompletableFuture<>(); - unboundedThreadPool.submit(() -> - LambdaUtils.eval(result, () -> { + threadPool.submit(() -> + eval(result, () -> { LOG.debug("Starting submitted operation in {}", auditSpan.getSpanId()); try (AuditSpan span = auditSpan.activate()) { return operation.apply(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index f32b97c154abde..ac84ae74859a98 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -58,11 +58,9 @@ import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.s3a.InputStreamType; import org.apache.hadoop.fs.s3a.Invoker; import org.apache.hadoop.fs.s3a.ProgressableProgressListener; import org.apache.hadoop.fs.s3a.Retries; @@ -74,10 +72,9 @@ import org.apache.hadoop.fs.s3a.UploadInfo; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.audit.AuditSpanS3A; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; -import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTracker; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; @@ -91,8 +88,6 @@ import static java.util.Objects.requireNonNull; import static org.apache.hadoop.fs.s3a.Constants.BUFFER_DIR; import static org.apache.hadoop.fs.s3a.Constants.HADOOP_TMP_DIR; -import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE; -import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_DEFAULT; import static org.apache.hadoop.fs.s3a.S3AUtils.extractException; import static org.apache.hadoop.fs.s3a.S3AUtils.getPutRequestLength; import static org.apache.hadoop.fs.s3a.S3AUtils.isThrottleException; @@ -113,10 +108,10 @@ import static org.apache.hadoop.fs.s3a.Statistic.STORE_IO_THROTTLE_RATE; import static org.apache.hadoop.fs.s3a.impl.ErrorTranslation.isObjectNotFound; import static org.apache.hadoop.fs.s3a.impl.InternalConstants.DELETE_CONSIDERED_IDEMPOTENT; +import static org.apache.hadoop.fs.s3a.impl.streams.StreamIntegration.createStreamFactory; import static org.apache.hadoop.fs.statistics.StoreStatisticNames.ACTION_HTTP_GET_REQUEST; import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfOperation; import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfSupplier; -import static org.apache.hadoop.io.IOUtils.cleanupWithLogger; import static org.apache.hadoop.util.Preconditions.checkArgument; /** @@ -124,7 +119,8 @@ * This is where lower level storage operations are intended * to move. */ -public class S3AStoreImpl extends CompositeService +public class S3AStoreImpl + extends CompositeService implements S3AStore, ObjectInputStreamFactory { private static final Logger LOG = LoggerFactory.getLogger(S3AStoreImpl.class); @@ -186,9 +182,15 @@ public class S3AStoreImpl extends CompositeService */ private LocalDirAllocator directoryAllocator; + /** + * Factory for input streams. + */ private ObjectInputStreamFactory objectInputStreamFactory; - /** Constructor to create S3A store. */ + /** + * Constructor to create S3A store. + * Package private, as {@link S3AStoreBuilder} creates them. + * */ S3AStoreImpl(StoreContextFactory storeContextFactory, ClientManager clientManager, DurationTrackerFactory durationTrackerFactory, @@ -200,34 +202,42 @@ public class S3AStoreImpl extends CompositeService AuditSpanSource auditSpanSource, @Nullable FileSystem.Statistics fsStatistics) { super("S3AStore"); - this.storeContextFactory = requireNonNull(storeContextFactory); + this.auditSpanSource = requireNonNull(auditSpanSource); this.clientManager = requireNonNull(clientManager); this.durationTrackerFactory = requireNonNull(durationTrackerFactory); + this.fsStatistics = fsStatistics; this.instrumentation = requireNonNull(instrumentation); this.statisticsContext = requireNonNull(statisticsContext); + this.storeContextFactory = requireNonNull(storeContextFactory); this.storageStatistics = requireNonNull(storageStatistics); this.readRateLimiter = requireNonNull(readRateLimiter); this.writeRateLimiter = requireNonNull(writeRateLimiter); - this.auditSpanSource = requireNonNull(auditSpanSource); this.storeContext = requireNonNull(storeContextFactory.createStoreContext()); - this.fsStatistics = fsStatistics; + this.invoker = storeContext.getInvoker(); this.bucket = storeContext.getBucket(); this.requestFactory = storeContext.getRequestFactory(); + addService(clientManager); } + /** + * Create and initialize any subsidiary services, including the input stream factory. + * @param conf configuration + */ @Override - protected void serviceStart() throws Exception { - super.serviceStart(); - initLocalDirAllocator(); - initInputStreamFactory(); + protected void serviceInit(final Configuration conf) throws Exception { + + objectInputStreamFactory = createStreamFactory(conf); + addService(objectInputStreamFactory); + + // init all child services + super.serviceInit(conf); } @Override - protected void serviceStop() throws Exception { - super.serviceStop(); - clientManager.close(); - cleanupWithLogger(LOG, objectInputStreamFactory); + protected void serviceStart() throws Exception { + super.serviceStart(); + initLocalDirAllocator(); } /** @@ -239,20 +249,6 @@ private void initLocalDirAllocator() { directoryAllocator = new LocalDirAllocator(bufferDir); } - private void initInputStreamFactory() { - InputStreamType inputStreamType = InputStreamType.fromString(getConfig().get(INPUT_STREAM_TYPE, INPUT_STREAM_TYPE_DEFAULT)); - switch (inputStreamType) { - case PREFETCH: - this.objectInputStreamFactory = new PrefetchingInputStreamFactory(); - break; - default: - this.objectInputStreamFactory = new ClassicObjectInputStreamFactory(); - } - - this.objectInputStreamFactory.init(getConfig()); - this.objectInputStreamFactory.start(); - } - /** Acquire write capacity for rate limiting {@inheritDoc}. */ @Override public Duration acquireWriteCapacity(final int capacity) { @@ -898,15 +894,14 @@ public File createTemporaryFileForWriting(String pathStr, return File.createTempFile(prefix, null, dir); } - @Override + @Override /* ObjectInputStreamFactory */ public ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException { - if (objectInputStreamFactory != null) { - return objectInputStreamFactory.readObject(parameters); - } else { - // TODO: Find the right exception to throw if factory has not yet been initialised, or closed. - throw new IOException("Factory not initialized!"); - } + return objectInputStreamFactory.readObject(parameters); } + @Override /* ObjectInputStreamFactory */ + public ThreadOptions prefetchThreadRequirements() { + return objectInputStreamFactory.prefetchThreadRequirements(); + } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java new file mode 100644 index 00000000000000..f2c6b4a920fe22 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -0,0 +1,64 @@ +/* + * 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.apache.hadoop.fs.s3a.impl.streams; + +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_ANALYTICS; +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_CLASSIC; +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_PREFETCH; + +/** + * Enum of input stream types. + */ +public enum InputStreamType { + /** + * The classic input stream. + */ + Classic(INPUT_STREAM_TYPE_CLASSIC), + /** + * The prefetching input stream. + */ + Prefetch(INPUT_STREAM_TYPE_PREFETCH), + /** + * The analytics input stream. + */ + Analytics(INPUT_STREAM_TYPE_ANALYTICS); + + /** + * Name. + */ + private final String name; + + /** + * String name. + * @return the name + */ + public String getName() { + return name; + } + + InputStreamType(String name) { + this.name = name; + } + + /** + * What is the default type? + */ + public static final InputStreamType DEFAULT_STREAM_TYPE = Classic; + +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStream.java similarity index 86% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStream.java index 2a9bde9bf3422f..e3e6a86cb57713 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStream.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.impl.model; +package org.apache.hadoop.fs.s3a.impl.streams; import java.io.IOException; import java.util.concurrent.ExecutorService; @@ -38,10 +38,10 @@ import org.apache.hadoop.fs.statistics.IOStatisticsAggregator; import org.apache.hadoop.fs.statistics.IOStatisticsSource; import org.apache.hadoop.fs.statistics.StreamStatisticNames; -import org.apache.hadoop.util.Preconditions; import static java.util.Objects.requireNonNull; import static org.apache.commons.lang3.StringUtils.isNotEmpty; +import static org.apache.hadoop.util.Preconditions.checkArgument; import static org.apache.hadoop.util.StringUtils.toLowerCase; /** @@ -58,7 +58,7 @@ public abstract class ObjectInputStream extends FSInputStream /** * IOStatistics report. */ - protected final IOStatistics ioStatistics; + private final IOStatistics ioStatistics; /** * Read-specific operation context structure. @@ -129,11 +129,11 @@ protected ObjectInputStream( ObjectReadParameters parameters) { objectAttributes = parameters.getObjectAttributes(); - Preconditions.checkArgument(isNotEmpty(objectAttributes.getBucket()), + checkArgument(isNotEmpty(objectAttributes.getBucket()), "No Bucket"); - Preconditions.checkArgument(isNotEmpty(objectAttributes.getKey()), "No Key"); + checkArgument(isNotEmpty(objectAttributes.getKey()), "No Key"); long l = objectAttributes.getLen(); - Preconditions.checkArgument(l >= 0, "Negative content length"); + checkArgument(l >= 0, "Negative content length"); this.context = parameters.getContext(); this.contentLength = l; @@ -152,7 +152,7 @@ protected ObjectInputStream( this.leakReporter = new LeakReporter( "Stream not closed while reading " + uri, this::isStreamOpen, - () -> abortInFinalizer()); + this::abortInFinalizer); } /** @@ -257,63 +257,64 @@ public IOStatistics getIOStatistics() { return ioStatistics; } + /** + * Declare the base capabilities implemented by this class and so by + * all subclasses. + *

+ * Subclasses MUST override this if they add more capabilities, + * or actually remove any of these. + * @param capability string to query the stream support for. + * @return true if all implementations are known to have the specific + * capability. + */ @Override public boolean hasCapability(String capability) { switch (toLowerCase(capability)) { case StreamCapabilities.IOSTATISTICS: - case StreamCapabilities.IOSTATISTICS_CONTEXT: case StreamStatisticNames.STREAM_LEAKS: - case StreamCapabilities.READAHEAD: - case StreamCapabilities.UNBUFFER: - case StreamCapabilities.VECTOREDIO: return true; default: return false; } } - - protected S3AReadOpContext getContext() { + protected final S3AReadOpContext getContext() { return context; } - protected ObjectInputStreamCallbacks getCallbacks() { + protected final ObjectInputStreamCallbacks getCallbacks() { return callbacks; } - protected ExecutorService getBoundedThreadPool() { + protected final ExecutorService getBoundedThreadPool() { return boundedThreadPool; } - protected String getUri() { + protected final String getUri() { return uri; } - protected String getBucket() { + protected final String getBucket() { return bucket; } - protected String getKey() { + protected final String getKey() { return key; } - protected String getPathStr() { + protected final String getPathStr() { return pathStr; } - protected long getContentLength() { + protected final long getContentLength() { return contentLength; } - protected S3AInputStreamStatistics getStreamStatistics() { - return streamStatistics; - } - - protected IOStatisticsAggregator getThreadIOStatistics() { + protected final IOStatisticsAggregator getThreadIOStatistics() { return threadIOStatistics; } - protected S3ObjectAttributes getObjectAttributes() { + protected final S3ObjectAttributes getObjectAttributes() { return objectAttributes; } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java similarity index 97% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java index 44fb0f068ee024..211b3476cd1ccb 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamCallbacks.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.impl.model; +package org.apache.hadoop.fs.s3a.impl.streams; import java.io.Closeable; import java.io.IOException; diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java similarity index 58% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java index a817291606fb78..b9bc86471fce1a 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.impl.model; +package org.apache.hadoop.fs.s3a.impl.streams; import java.io.IOException; @@ -47,5 +47,47 @@ public interface ObjectInputStreamFactory extends Service { ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException; + /** + * Get the number of prefetch threads required for this factory. + * @return the count of prefetch threads. + */ + default ThreadOptions prefetchThreadRequirements() { + return new ThreadOptions(0, false); + } + + /** + * Will streams created through this factory have the requested capability? + * @param capability capability to probe for. + * @return true if a capability is known to be supported. + */ + default boolean hasStreamCapability(String capability) { + return false; + } + + /** + * Options for threading. + */ + class ThreadOptions { + /** number of shared threads to included in the bounded pool. */ + private final int sharedThreads; + + /** + * flag to enable creation of a future pool around the bounded thread pool. + */ + private final boolean createFuturePool; + + public ThreadOptions(final int sharedThreads, final boolean createFuturePool) { + this.sharedThreads = sharedThreads; + this.createFuturePool = createFuturePool; + } + + public int sharedThreads() { + return sharedThreads; + } + + public boolean createFuturePool() { + return createFuturePool; + } + } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java similarity index 92% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java index e8114d7e5e7ddd..8ee16b1050a296 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/ObjectReadParameters.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java @@ -16,7 +16,7 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.impl.model; +package org.apache.hadoop.fs.s3a.impl.streams; import java.util.concurrent.ExecutorService; @@ -38,14 +38,30 @@ */ public final class ObjectReadParameters { + /** + * Read operation context. + */ private S3AReadOpContext context; + /** + * Attributes of the object. + */ private S3ObjectAttributes objectAttributes; + /** + * Callbacks to the store. + */ private ObjectInputStreamCallbacks callbacks; + /** + * Stream statistics. + */ private S3AInputStreamStatistics streamStatistics; + /** + * Bounded thread pool for submitting asynchronous + * work. + */ private ExecutorService boundedThreadPool; /** @@ -54,7 +70,7 @@ public final class ObjectReadParameters { private LocalDirAllocator directoryAllocator; /** - * Read operation context. + * @return Read operation context. */ public S3AReadOpContext getContext() { return context; @@ -71,7 +87,7 @@ public ObjectReadParameters withContext(S3AReadOpContext value) { } /** - * Attributes of the object. + * @return Attributes of the object. */ public S3ObjectAttributes getObjectAttributes() { return objectAttributes; @@ -88,7 +104,7 @@ public ObjectReadParameters withObjectAttributes(S3ObjectAttributes value) { } /** - * Callbacks to the store. + * @return callbacks to the store. */ public ObjectInputStreamCallbacks getCallbacks() { return callbacks; @@ -105,7 +121,7 @@ public ObjectReadParameters withCallbacks(ObjectInputStreamCallbacks value) { } /** - * Stream statistics. + * @return Stream statistics. */ public S3AInputStreamStatistics getStreamStatistics() { return streamStatistics; @@ -122,8 +138,7 @@ public ObjectReadParameters withStreamStatistics(S3AInputStreamStatistics value) } /** - * Bounded thread pool for submitting asynchronous - * work. + * @return Bounded thread pool for submitting asynchronous work. */ public ExecutorService getBoundedThreadPool() { return boundedThreadPool; diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java new file mode 100644 index 00000000000000..2b74ccc7aad4d1 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -0,0 +1,71 @@ +/* + * 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.apache.hadoop.fs.s3a.impl.streams; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.s3a.impl.ClassicObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; +import org.apache.hadoop.fs.store.LogExactlyOnce; + +import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; + +/** + * Stream integration, including S3AStoreImpl. + */ +public final class StreamIntegration { + + private static final Logger LOG_DEPRECATION = + LoggerFactory.getLogger( + "org.apache.hadoop.conf.Configuration.deprecation"); + + /** + * Warn once on use of prefetch boolean flag rather than enum. + */ + private static final LogExactlyOnce WARN_PREFETCH_KEY = new LogExactlyOnce(LOG_DEPRECATION); + + /** + * Create the input stream factory the configuration asks for. + * @param conf configuration + * @return a stream factory. + */ + public static ObjectInputStreamFactory createStreamFactory(final Configuration conf) { + ObjectInputStreamFactory objectInputStreamFactory; + InputStreamType defaultStream = InputStreamType.Classic; + if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { + WARN_PREFETCH_KEY.info("Using {} is deprecated: choose the appropriate stream in {}", + PREFETCH_ENABLED_KEY, INPUT_STREAM_TYPE); + defaultStream = InputStreamType.Prefetch; + } + InputStreamType inputStreamType = conf.getEnum(INPUT_STREAM_TYPE, + defaultStream); + switch (inputStreamType) { + case Prefetch: + objectInputStreamFactory = new PrefetchingInputStreamFactory(); + break; + case Classic: + default: + objectInputStreamFactory = new ClassicObjectInputStreamFactory(); + } + return objectInputStreamFactory; + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/package-info.java similarity index 77% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/package-info.java index 82bb61c2313c49..514e8dbd703766 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/model/package-info.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/package-info.java @@ -17,14 +17,13 @@ */ /** - * This describes the model of S3 for layers above to interact with, and - * possibly extend. + * Input and Output stream support. *

- * This intended for internal use, as a way of separating the layers - * above from how the store is actually interacted with. + * A lot of the existing stream work is elsewhere, + * this module is where ongoing work should take place. */ @InterfaceAudience.Private -package org.apache.hadoop.fs.s3a.impl.model; +package org.apache.hadoop.fs.s3a.impl.streams; import org.apache.hadoop.classification.InterfaceAudience; \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchOptions.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchOptions.java new file mode 100644 index 00000000000000..ee584418d61ac6 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchOptions.java @@ -0,0 +1,67 @@ +/* + * 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.apache.hadoop.fs.s3a.prefetch; + +import static org.apache.hadoop.util.Preconditions.checkArgument; + +/** + * Options for the prefetch stream which are built up in {@link PrefetchingInputStreamFactory} + * and passed down. + */ +public class PrefetchOptions { + + /** Size in bytes of a single prefetch block. */ + private final int prefetchBlockSize; + + /** Size of prefetch queue (in number of blocks). */ + private final int prefetchBlockCount; + + /** + * Constructor. + * @param prefetchBlockSize the size (in number of bytes) of each prefetched block. + * @param prefetchBlockCount maximum number of prefetched blocks. + */ + public PrefetchOptions(final int prefetchBlockSize, final int prefetchBlockCount) { + + checkArgument( + prefetchBlockSize > 0, "invalid prefetchBlockSize %d", prefetchBlockSize); + this.prefetchBlockSize = prefetchBlockSize; + checkArgument( + prefetchBlockCount > 0, "invalid prefetchBlockCount %d", prefetchBlockCount); + this.prefetchBlockCount = prefetchBlockCount; + } + + /** + * Gets the size in bytes of a single prefetch block. + * + * @return the size in bytes of a single prefetch block. + */ + public int getPrefetchBlockSize() { + return prefetchBlockSize; + } + + /** + * Gets the size of prefetch queue (in number of blocks). + * + * @return the size of prefetch queue (in number of blocks). + */ + public int getPrefetchBlockCount() { + return prefetchBlockCount; + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java index d2a0685c64dfa8..82e88810268db6 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java @@ -20,23 +20,72 @@ import java.io.IOException; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.service.AbstractService; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_COUNT_KEY; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_DEFAULT_COUNT; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_DEFAULT_SIZE; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; +import static org.apache.hadoop.fs.s3a.S3AUtils.intOption; +import static org.apache.hadoop.fs.s3a.S3AUtils.longBytesOption; +import static org.apache.hadoop.util.Preconditions.checkState; + /** * Factory for prefetching streams. + *

+ * Reads and validates prefetch configuration options during service init. */ public class PrefetchingInputStreamFactory extends AbstractService implements ObjectInputStreamFactory { + /** Size in bytes of a single prefetch block. */ + private int prefetchBlockSize; + + /** Size of prefetch queue (in number of blocks). */ + private int prefetchBlockCount; + + /** + * Shared prefetch options. + */ + private PrefetchOptions prefetchOptions; + public PrefetchingInputStreamFactory() { super("PrefetchingInputStreamFactory"); } + @Override + protected void serviceInit(final Configuration conf) throws Exception { + super.serviceInit(conf); + long prefetchBlockSizeLong = + longBytesOption(conf, PREFETCH_BLOCK_SIZE_KEY, PREFETCH_BLOCK_DEFAULT_SIZE, 1); + checkState(prefetchBlockSizeLong < Integer.MAX_VALUE, + "S3A prefatch block size exceeds int limit"); + prefetchBlockSize = (int) prefetchBlockSizeLong; + prefetchBlockCount = + intOption(conf, PREFETCH_BLOCK_COUNT_KEY, PREFETCH_BLOCK_DEFAULT_COUNT, 1); + + prefetchOptions = new PrefetchOptions( + prefetchBlockSize, + prefetchBlockCount); + } + @Override public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { - return new S3APrefetchingInputStream(parameters, getConfig()); + return new S3APrefetchingInputStream(parameters, + getConfig(), + prefetchOptions); + } + + /** + * The thread count is calculated from the configuration. + * @return a positive thread count. + */ + @Override + public ThreadOptions prefetchThreadRequirements() { + return new ThreadOptions(prefetchBlockCount, true); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java index 544e3af8499599..a183b9d1003b17 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ACachingInputStream.java @@ -35,7 +35,7 @@ import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import static org.apache.hadoop.fs.s3a.Constants.DEFAULT_PREFETCH_MAX_BLOCKS_COUNT; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_MAX_BLOCKS_COUNT; @@ -63,25 +63,25 @@ public class S3ACachingInputStream extends S3ARemoteInputStream { * Initializes a new instance of the {@code S3ACachingInputStream} class. * * @param context read-specific operation context. - * @param s3Attributes attributes of the S3 object being read. + * @param prefetchOptions prefetch stream specific options + * @param s3Attributes attributes of the S3a object being read. * @param client callbacks used for interacting with the underlying S3 client. * @param streamStatistics statistics for this stream. * @param conf the configuration. * @param localDirAllocator the local dir allocator instance. - * @throws IllegalArgumentException if context is null. - * @throws IllegalArgumentException if s3Attributes is null. - * @throws IllegalArgumentException if client is null. + * @throws NullPointerException if a required parameter is null. */ public S3ACachingInputStream( S3AReadOpContext context, + PrefetchOptions prefetchOptions, S3ObjectAttributes s3Attributes, ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics, Configuration conf, LocalDirAllocator localDirAllocator) { - super(context, s3Attributes, client, streamStatistics); + super(context, prefetchOptions, s3Attributes, client, streamStatistics); - this.numBlocksToPrefetch = this.getContext().getPrefetchBlockCount(); + this.numBlocksToPrefetch = prefetchOptions.getPrefetchBlockCount(); int bufferPoolSize = this.numBlocksToPrefetch + 1; BlockManagerParameters blockManagerParamsBuilder = new BlockManagerParameters() diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java index ede6a493324c3d..22de5015f96862 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3AInMemoryInputStream.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; /** * Provides an {@code InputStream} that allows reading from an S3 file. @@ -60,10 +60,11 @@ public class S3AInMemoryInputStream extends S3ARemoteInputStream { */ public S3AInMemoryInputStream( S3AReadOpContext context, + PrefetchOptions prefetchOptions, S3ObjectAttributes s3Attributes, ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { - super(context, s3Attributes, client, streamStatistics); + super(context, prefetchOptions, s3Attributes, client, streamStatistics); int fileSize = (int) s3Attributes.getLen(); this.buffer = ByteBuffer.allocate(fileSize); LOG.debug("Created in-memory input stream for {} (size = {})", diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java index 0bd8d0ed5bdc4b..49a30646bbf596 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchingInputStream.java @@ -35,13 +35,15 @@ import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.fs.s3a.S3AReadOpContext; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; +import static org.apache.hadoop.util.StringUtils.toLowerCase; + /** * Enhanced {@code InputStream} for reading from S3. * @@ -78,16 +80,19 @@ public class S3APrefetchingInputStream /** * Initializes a new instance of the {@code S3APrefetchingInputStream} class. - * * @param parameters creation parameters. * @param conf the configuration. - * @throws IllegalArgumentException required parameterss are null + * @param prefetchOptions prefetch stream specific options + * @throws NullPointerException if a required parameter is null. */ - public S3APrefetchingInputStream(final ObjectReadParameters parameters, Configuration conf) { + public S3APrefetchingInputStream( + final ObjectReadParameters parameters, + final Configuration conf, + final PrefetchOptions prefetchOptions) { super(parameters); - S3ObjectAttributes s3Attributes = parameters.getObjectAttributes(); - ObjectInputStreamCallbacks client = parameters.getCallbacks(); - S3AInputStreamStatistics streamStatistics = parameters.getStreamStatistics(); + S3ObjectAttributes s3Attributes = parameters.getObjectAttributes(); + ObjectInputStreamCallbacks client = parameters.getCallbacks(); + S3AInputStreamStatistics streamStatistics = parameters.getStreamStatistics(); final S3AReadOpContext context = parameters.getContext(); LocalDirAllocator localDirAllocator = parameters.getDirectoryAllocator(); @@ -102,10 +107,11 @@ public S3APrefetchingInputStream(final ObjectReadParameters parameters, Configur Validate.checkNotNull(streamStatistics, "streamStatistics"); long fileSize = s3Attributes.getLen(); - if (fileSize <= context.getPrefetchBlockSize()) { + if (fileSize <= prefetchOptions.getPrefetchBlockSize()) { LOG.debug("Creating in memory input stream for {}", context.getPath()); this.inputStream = new S3AInMemoryInputStream( context, + prefetchOptions, s3Attributes, client, streamStatistics); @@ -113,6 +119,7 @@ public S3APrefetchingInputStream(final ObjectReadParameters parameters, Configur LOG.debug("Creating in caching input stream for {}", context.getPath()); this.inputStream = new S3ACachingInputStream( context, + prefetchOptions, s3Attributes, client, streamStatistics, @@ -202,6 +209,7 @@ protected boolean isStreamOpen() { @Override protected void abortInFinalizer() { + getS3AStreamStatistics().streamLeaked(); try { close(); } catch (IOException ignored) { @@ -241,11 +249,12 @@ public synchronized void setReadahead(Long readahead) { */ @Override public boolean hasCapability(String capability) { - if (!isClosed()) { - return inputStream.hasCapability(capability); + switch (toLowerCase(capability)) { + case StreamCapabilities.READAHEAD: + return true; + default: + return super.hasCapability(capability); } - - return false; } /** diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java index 63762d063228c1..5ce0b7de074fd6 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteInputStream.java @@ -40,7 +40,7 @@ import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; @@ -113,16 +113,16 @@ public abstract class S3ARemoteInputStream * Initializes a new instance of the {@code S3ARemoteInputStream} class. * * @param context read-specific operation context. + * @param prefetchOptions prefetch stream specific options * @param s3Attributes attributes of the S3 object being read. * @param client callbacks used for interacting with the underlying S3 client. * @param streamStatistics statistics for this stream. * - * @throws IllegalArgumentException if context is null. - * @throws IllegalArgumentException if s3Attributes is null. - * @throws IllegalArgumentException if client is null. + * @throws NullPointerException if a required parameter is null. */ public S3ARemoteInputStream( S3AReadOpContext context, + PrefetchOptions prefetchOptions, S3ObjectAttributes s3Attributes, ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { @@ -143,7 +143,7 @@ public S3ARemoteInputStream( setReadahead(context.getReadahead()); long fileSize = s3Attributes.getLen(); - int bufferSize = context.getPrefetchBlockSize(); + int bufferSize = prefetchOptions.getPrefetchBlockSize(); this.blockData = new BlockData(fileSize, bufferSize); this.fpos = new FilePosition(fileSize, bufferSize); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java index a35291033da473..8a624c40c9afd2 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/S3ARemoteObject.java @@ -36,7 +36,7 @@ import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.SDKStreamDrainer; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.DurationTracker; diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/prefetching.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/prefetching.md index 8bb85008e36243..354db3a705fd9b 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/prefetching.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/prefetching.md @@ -39,7 +39,8 @@ Multiple blocks may be read in parallel. |Property |Meaning |Default | |---|---|---| -|`fs.s3a.prefetch.enabled` |Enable the prefetch input stream |`false` | +| `fs.s3a.input.stream.type` |Uses the prefetch input stream when set to `prefetch` |`classic` | +|(deprecated) `fs.s3a.prefetch.enabled` |Enable the prefetch input stream |`false` | |`fs.s3a.prefetch.block.size` |Size of a block |`8M` | |`fs.s3a.prefetch.block.count` |Number of blocks to prefetch |`8` | @@ -47,9 +48,18 @@ The default size of a block is 8MB, and the minimum allowed block size is 1 byte Decreasing block size will increase the number of blocks to be read for a file. A smaller block size may negatively impact performance as the number of prefetches required will increase. +The original option to enable prefetching was the boolean option `fs.s3a.prefetch.enabled`. + +This has been superseded by the option `fs.s3a.input.stream.type` which now takes an enumeration of values; `prefetch` selects the prefetching stream. + +1. The original option is deprecated. +2. It is supported *provided the option `fs.s3a.input.stream.type` is unset. +3. The first time a stream created through the `fs.s3a.input.stream.type` option, + a warning message is printed. + ### Key Components -`S3PrefetchingInputStream` - When prefetching is enabled, S3AFileSystem will return an instance of +`S3PrefetchingInputStream` - When the prefetch stream is used, S3AFileSystem will return an instance of this class as the input stream. Depending on the remote file size, it will either use the `S3InMemoryInputStream` or the `S3CachingInputStream` as the underlying input stream. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java index 4d8956d38e7bef..cbd183f080d997 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AInputStreamLeakage.java @@ -29,6 +29,8 @@ import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.contract.ContractTestUtils; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.test.GenericTestUtils; @@ -82,10 +84,6 @@ public void setup() throws Exception { *

* The stream leak counter of the FileSystem is also updated; this * is verified. - *

- * Note: if the stream under test is not an S3AInputStream (i.e. is a prefetching one, - * this test is skipped. If/when the prefetching stream adds the same code, - * this check can be removed. */ @Test public void testFinalizer() throws Throwable { @@ -105,7 +103,7 @@ public void testFinalizer() throws Throwable { try { Assertions.assertThat(in.hasCapability(STREAM_LEAKS)) - .describedAs("Stream leak detection not supported in: " + in.getClass()) + .describedAs("Stream leak detection not supported in: %s", in.getWrappedStream()) .isTrue(); Assertions.assertThat(in.read()) @@ -113,12 +111,12 @@ public void testFinalizer() throws Throwable { .isEqualTo(DATASET[0]); // get a weak ref so that after a GC we can look for it and verify it is gone - Assertions.assertThat(((S3AInputStream) in.getWrappedStream()).isObjectStreamOpen()) - .describedAs("stream http connection status") - .isTrue(); - // weak reference to track GC progress - WeakReference wrs = - new WeakReference<>((S3AInputStream) in.getWrappedStream()); + WeakReference wrs = + new WeakReference<>((ObjectInputStream) in.getWrappedStream()); + + boolean isClassicStream = wrs.get() instanceof S3AInputStream; + final IOStatistics fsStats = fs.getIOStatistics(); + final long leaks = fsStats.counters().getOrDefault(STREAM_LEAKS, 0L); // Capture the logs GenericTestUtils.LogCapturer logs = @@ -130,7 +128,7 @@ public void testFinalizer() throws Throwable { in = null; // force the gc. System.gc(); - // make sure the GC removed the S3AInputStream. + // make sure the GC removed the Stream. Assertions.assertThat(wrs.get()) .describedAs("weak stream reference wasn't GC'd") .isNull(); @@ -149,14 +147,26 @@ public void testFinalizer() throws Throwable { LOG.info("output of leak log is {}", output); Assertions.assertThat(output) .describedAs("output from the logs during GC") - .contains("drain or abort reason finalize()") // stream release + .contains("Stream not closed") // stream release .contains(path.toUri().toString()) // path .contains(Thread.currentThread().getName()) // thread .contains("testFinalizer"); // stack - // verify that leakages are added to the FS statistics - assertThatStatisticCounter(fs.getIOStatistics(), STREAM_LEAKS) - .isEqualTo(1); + + // for classic stream the counter is 1, but for prefetching + // the count is greater -the inner streams can also + // get finalized while open so increment the leak counter + // multiple times. + assertThatStatisticCounter(fsStats, STREAM_LEAKS) + .isGreaterThanOrEqualTo(leaks + 1); + if (isClassicStream) { + Assertions.assertThat(output) + .describedAs("output from the logs during GC") + .contains("drain or abort reason finalize()"); // stream release + assertThatStatisticCounter(fsStats, STREAM_LEAKS) + .isEqualTo(leaks + 1); + } + } finally { if (in != null) { IOUtils.cleanupWithLogger(LOG, in); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java index 5e37e68d8bea72..96b6b09bac7aae 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java @@ -38,6 +38,7 @@ import org.apache.hadoop.fs.s3a.performance.AbstractS3ACostTest; import static org.apache.hadoop.fs.s3a.Constants.*; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.enablePrefetching; import static org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils.getExternalData; import static org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils.isUsingDefaultExternalDataFile; import static org.apache.hadoop.io.IOUtils.cleanupWithLogger; @@ -74,6 +75,7 @@ public void setUp() throws Exception { super.setup(); // Sets BUFFER_DIR by calling S3ATestUtils#prepareTestConfiguration conf = createConfiguration(); + testFile = getExternalData(conf); prefetchBlockSize = conf.getInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); fs = FileSystem.get(testFile.toUri(), conf); @@ -84,10 +86,9 @@ public Configuration createConfiguration() { Configuration configuration = super.createConfiguration(); if (isUsingDefaultExternalDataFile(configuration)) { S3ATestUtils.removeBaseAndBucketOverrides(configuration, - PREFETCH_ENABLED_KEY, ENDPOINT); } - configuration.setBoolean(PREFETCH_ENABLED_KEY, true); + enablePrefetching(configuration); // use a small block size unless explicitly set in the test config. configuration.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); // patch buffer dir with a unique path for test isolation. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java index b97be9d18e9146..8c340fc8cb9b98 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java @@ -34,7 +34,9 @@ import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.test.LambdaTestUtils; -import static org.apache.hadoop.fs.s3a.Constants.*; +import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_ENABLED_KEY; +import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.enablePrefetching; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticMaximum; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValue; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticGaugeValue; @@ -74,13 +76,10 @@ public ITestS3APrefetchingInputStream() { private static final int INTERVAL_MILLIS = 500; private static final int BLOCK_SIZE = S_1K * 10; - @Override public Configuration createConfiguration() { - Configuration conf = super.createConfiguration(); - S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_ENABLED_KEY); + Configuration conf = enablePrefetching(super.createConfiguration()); S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_BLOCK_SIZE_KEY); - conf.setBoolean(PREFETCH_ENABLED_KEY, true); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java index 8aefcc8535af6a..64674d29021a3d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java @@ -43,6 +43,7 @@ import org.apache.hadoop.test.LambdaTestUtils; import static org.apache.hadoop.fs.s3a.Constants.*; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.enablePrefetching; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticCounter; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticCounterValues; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.verifyStatisticGaugeValue; @@ -84,11 +85,10 @@ public ITestS3APrefetchingLruEviction(final String maxBlocks) { @Override public Configuration createConfiguration() { - Configuration conf = super.createConfiguration(); - S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_ENABLED_KEY); - S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_MAX_BLOCKS_COUNT); - S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_BLOCK_SIZE_KEY); - conf.setBoolean(PREFETCH_ENABLED_KEY, true); + Configuration conf = enablePrefetching(super.createConfiguration()); + S3ATestUtils.removeBaseAndBucketOverrides(conf, + PREFETCH_MAX_BLOCKS_COUNT, + PREFETCH_BLOCK_SIZE_KEY); conf.setInt(PREFETCH_MAX_BLOCKS_COUNT, Integer.parseInt(maxBlocks)); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ARequesterPays.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ARequesterPays.java index b88d0b4aab6173..5a3bb1d6404c9d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ARequesterPays.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ARequesterPays.java @@ -31,9 +31,8 @@ import org.apache.hadoop.fs.statistics.StreamStatisticNames; import static org.apache.hadoop.fs.s3a.Constants.ALLOW_REQUESTER_PAYS; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_DEFAULT; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; import static org.apache.hadoop.fs.s3a.Constants.S3A_BUCKET_PROBE; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.isPrefetchingEnabled; import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** @@ -80,7 +79,7 @@ public void testRequesterPaysOptionSuccess() throws Throwable { inputStream.seek(0); inputStream.readByte(); - if (conf.getBoolean(PREFETCH_ENABLED_KEY, PREFETCH_ENABLED_DEFAULT)) { + if (isPrefetchingEnabled(conf)) { // For S3APrefetchingInputStream, verify a call was made IOStatisticAssertions.assertThatStatisticCounter(inputStream.getIOStatistics(), StreamStatisticNames.STREAM_READ_OPENED).isEqualTo(1); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java index e9ebd98169fa4c..dde363fa09cc73 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java @@ -104,6 +104,8 @@ 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.impl.streams.InputStreamType.DEFAULT_STREAM_TYPE; +import static org.apache.hadoop.fs.s3a.impl.streams.InputStreamType.Prefetch; import static org.apache.hadoop.fs.s3a.impl.CallableSupplier.submit; import static org.apache.hadoop.fs.s3a.impl.CallableSupplier.waitForCompletion; import static org.apache.hadoop.fs.s3a.impl.S3ExpressStorage.STORE_CAPABILITY_S3_EXPRESS_STORAGE; @@ -1803,9 +1805,36 @@ public static void assertStreamIsNotChecksummed(final S3AInputStream wrappedS3A) /** * Disable Prefetching streams from S3AFileSystem in tests. * @param conf Configuration to remove the prefetch property from. + * @return patched config */ - public static void disablePrefetching(Configuration conf) { - removeBaseAndBucketOverrides(conf, PREFETCH_ENABLED_KEY); + public static Configuration disablePrefetching(Configuration conf) { + removeBaseAndBucketOverrides(conf, + PREFETCH_ENABLED_KEY, + INPUT_STREAM_TYPE); + return conf; + } + + + /** + *Enable Prefetching streams from S3AFileSystem in tests. + * @param conf Configuration to update + * @return patched config + */ + public static Configuration enablePrefetching(Configuration conf) { + removeBaseAndBucketOverrides(conf, + PREFETCH_ENABLED_KEY, + INPUT_STREAM_TYPE); + conf.setEnum(INPUT_STREAM_TYPE, Prefetch); + return conf; + } + + /** + * Probe the configuration for supporting prefetching. + * @return true if the config has prefetching enabled. + */ + public static boolean isPrefetchingEnabled(Configuration conf) { + return conf.getBoolean(PREFETCH_ENABLED_KEY, PREFETCH_ENABLED_DEFAULT) + || conf.getEnum(INPUT_STREAM_TYPE, DEFAULT_STREAM_TYPE) == Prefetch; } /** diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java index b86206b0b2ccaa..07f6550d83eee3 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AInputStreamRetry.java @@ -40,8 +40,8 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.s3a.audit.impl.NoopSpan; import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecrets; -import org.apache.hadoop.fs.s3a.impl.model.ObjectReadParameters; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; import org.apache.http.NoHttpResponseException; @@ -193,7 +193,8 @@ private S3AInputStream getMockedS3AInputStream( .withCallbacks(streamCallback) .withObjectAttributes(s3ObjectAttributes) .withContext(s3AReadOpContext) - .withStreamStatistics( s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics()) + .withStreamStatistics( + s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics()) .withBoundedThreadPool(null); return new S3AInputStream(parameters); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java index 2a6605b93421ff..58eb5c14dbc9e8 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestConnectionTimeouts.java @@ -55,10 +55,10 @@ import static org.apache.hadoop.fs.s3a.Constants.MAXIMUM_CONNECTIONS; import static org.apache.hadoop.fs.s3a.Constants.MAX_ERROR_RETRIES; import static org.apache.hadoop.fs.s3a.Constants.PART_UPLOAD_TIMEOUT; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; import static org.apache.hadoop.fs.s3a.Constants.REQUEST_TIMEOUT; import static org.apache.hadoop.fs.s3a.Constants.RETRY_LIMIT; import static org.apache.hadoop.fs.s3a.Constants.SOCKET_TIMEOUT; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.disablePrefetching; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.commit.CommitConstants.MAGIC_PATH_PREFIX; @@ -105,7 +105,7 @@ protected Configuration createConfiguration() { * @return a configuration to use for the brittle FS. */ private Configuration timingOutConfiguration() { - Configuration conf = new Configuration(getConfiguration()); + Configuration conf = disablePrefetching(new Configuration(getConfiguration())); removeBaseAndBucketOverrides(conf, CONNECTION_TTL, CONNECTION_ACQUISITION_TIMEOUT, @@ -114,7 +114,6 @@ private Configuration timingOutConfiguration() { MAX_ERROR_RETRIES, MAXIMUM_CONNECTIONS, PART_UPLOAD_TIMEOUT, - PREFETCH_ENABLED_KEY, REQUEST_TIMEOUT, SOCKET_TIMEOUT, FS_S3A_CREATE_PERFORMANCE, @@ -126,7 +125,7 @@ private Configuration timingOutConfiguration() { conf.setInt(MAX_ERROR_RETRIES, 0); // needed to ensure that streams are kept open. // without this the tests is unreliable in batch runs. - conf.setBoolean(PREFETCH_ENABLED_KEY, false); + disablePrefetching(conf); conf.setInt(RETRY_LIMIT, 0); conf.setBoolean(FS_S3A_CREATE_PERFORMANCE, true); final Duration ms10 = Duration.ofMillis(10); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java index c07c5dd5086c04..68438dde2b5b14 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java @@ -52,8 +52,6 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.skip; import static org.apache.hadoop.fs.contract.ContractTestUtils.writeTextFile; import static org.apache.hadoop.fs.s3a.Constants.CHECKSUM_VALIDATION; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_DEFAULT; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.fs.s3a.Statistic.STREAM_READ_BYTES_READ_CLOSE; import static org.apache.hadoop.fs.s3a.Statistic.STREAM_READ_OPENED; @@ -454,8 +452,8 @@ public void testVectorReadPastEOF() throws Throwable { * @return true if the fs has prefetching enabled. */ private boolean prefetching() { - return getFileSystem().getConf().getBoolean( - PREFETCH_ENABLED_KEY, PREFETCH_ENABLED_DEFAULT); + return isPrefetchingEnabled(getFileSystem().getConf()); + } /** diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java index a0dec8d476bda9..3b9f31cb65c79a 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java @@ -48,11 +48,11 @@ import static org.apache.hadoop.fs.s3a.Constants.INPUT_FADVISE; import static org.apache.hadoop.fs.s3a.Constants.MAXIMUM_CONNECTIONS; import static org.apache.hadoop.fs.s3a.Constants.MAX_ERROR_RETRIES; -import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; import static org.apache.hadoop.fs.s3a.Constants.READAHEAD_RANGE; import static org.apache.hadoop.fs.s3a.Constants.REQUEST_TIMEOUT; import static org.apache.hadoop.fs.s3a.Constants.RETRY_LIMIT; import static org.apache.hadoop.fs.s3a.Constants.SOCKET_TIMEOUT; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.disablePrefetching; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled; import static org.apache.hadoop.fs.s3a.impl.ConfigurationHelper.setDurationAsSeconds; @@ -106,7 +106,7 @@ public ITestUnbufferDraining() { @Override public Configuration createConfiguration() { - Configuration conf = super.createConfiguration(); + Configuration conf = disablePrefetching(super.createConfiguration()); removeBaseAndBucketOverrides(conf, ASYNC_DRAIN_THRESHOLD, CHECKSUM_VALIDATION, @@ -114,7 +114,6 @@ public Configuration createConfiguration() { INPUT_FADVISE, MAX_ERROR_RETRIES, MAXIMUM_CONNECTIONS, - PREFETCH_ENABLED_KEY, READAHEAD_RANGE, REQUEST_TIMEOUT, RETRY_LIMIT, diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java index 3ac9863ab2e85b..63b80cff97906c 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/MockS3ARemoteObject.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.impl.prefetch.Validate; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.util.functional.CallableRaisingIOE; /** @@ -54,7 +54,7 @@ class MockS3ARemoteObject extends S3ARemoteObject { MockS3ARemoteObject(int size, boolean throwExceptionOnOpen) { super( - S3APrefetchFakes.createReadContext(null, KEY, size, 1, 1), + S3APrefetchFakes.createReadContext(null, KEY, size), S3APrefetchFakes.createObjectAttributes(BUCKET, KEY, size), S3APrefetchFakes.createInputStreamCallbacks(BUCKET), EmptyS3AStatisticsContext.EMPTY_INPUT_STREAM_STATISTICS, diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java index 6f030681295852..ac42f7ba095bc9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/S3APrefetchFakes.java @@ -61,7 +61,7 @@ import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.s3a.statistics.impl.CountingChangeTracker; import org.apache.hadoop.fs.s3a.statistics.impl.EmptyS3AStatisticsContext; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; import org.apache.hadoop.io.retry.RetryPolicies; import org.apache.hadoop.io.retry.RetryPolicy; @@ -133,9 +133,7 @@ public static S3ObjectAttributes createObjectAttributes( public static S3AReadOpContext createReadContext( ExecutorServiceFuturePool futurePool, String key, - int fileSize, - int prefetchBlockSize, - int prefetchBlockCount) { + int fileSize) { S3AFileStatus fileStatus = createFileStatus(key, fileSize); org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(key); @@ -156,9 +154,8 @@ public static S3AReadOpContext createReadContext( .setMaxReadSizeForVectoredReads(1) .build(), emptyStatisticsStore(), - futurePool, - prefetchBlockSize, - prefetchBlockCount) + futurePool + ) .withChangeDetectionPolicy( ChangeDetectionPolicy.createPolicy(ChangeDetectionPolicy.Mode.None, ChangeDetectionPolicy.Source.ETag, false)) @@ -234,21 +231,25 @@ public static S3ARemoteInputStream createInputStream( S3AReadOpContext s3AReadOpContext = createReadContext( futurePool, key, - fileSize, - prefetchBlockSize, - prefetchBlockCount); + fileSize + ); ObjectInputStreamCallbacks callbacks = createInputStreamCallbacks(bucket); S3AInputStreamStatistics stats = s3AReadOpContext.getS3AStatisticsContext().newInputStreamStatistics(); + final PrefetchOptions options = + new PrefetchOptions(prefetchBlockSize, prefetchBlockCount); if (clazz == FakeS3AInMemoryInputStream.class) { - return new FakeS3AInMemoryInputStream(s3AReadOpContext, + return new FakeS3AInMemoryInputStream(s3AReadOpContext, options, s3ObjectAttributes, callbacks, stats); } else if (clazz == FakeS3ACachingInputStream.class) { - return new FakeS3ACachingInputStream(s3AReadOpContext, s3ObjectAttributes, - callbacks, stats); + return new FakeS3ACachingInputStream(s3AReadOpContext, + options, + s3ObjectAttributes, + callbacks, + stats); } throw new RuntimeException("Unsupported class: " + clazz); @@ -288,10 +289,11 @@ public static class FakeS3AInMemoryInputStream public FakeS3AInMemoryInputStream( S3AReadOpContext context, + PrefetchOptions prefetchOptions, S3ObjectAttributes s3Attributes, ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { - super(context, s3Attributes, client, streamStatistics); + super(context, prefetchOptions, s3Attributes, client, streamStatistics); } @Override @@ -390,10 +392,11 @@ public static class FakeS3ACachingInputStream extends S3ACachingInputStream { public FakeS3ACachingInputStream( S3AReadOpContext context, + PrefetchOptions prefetchOptions, S3ObjectAttributes s3Attributes, ObjectInputStreamCallbacks client, S3AInputStreamStatistics streamStatistics) { - super(context, s3Attributes, client, streamStatistics, CONF, + super(context, prefetchOptions, s3Attributes, client, streamStatistics, CONF, new LocalDirAllocator( CONF.get(BUFFER_DIR) != null ? BUFFER_DIR : HADOOP_TMP_DIR)); } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java index f779840b090291..4d94a58b2c0608 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteInputStream.java @@ -35,7 +35,7 @@ import org.apache.hadoop.fs.s3a.S3ATestUtils; import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; import static org.assertj.core.api.Assertions.assertThat; @@ -59,7 +59,8 @@ public class TestS3ARemoteInputStream extends AbstractHadoopTestBase { @Test public void testArgChecks() throws Exception { S3AReadOpContext readContext = - S3APrefetchFakes.createReadContext(futurePool, "key", 10, 10, 1); + S3APrefetchFakes.createReadContext(futurePool, "key", 10); + PrefetchOptions prefetchOptions = new PrefetchOptions(10, 1); S3ObjectAttributes attrs = S3APrefetchFakes.createObjectAttributes("bucket", "key", 10); S3AInputStreamStatistics stats = @@ -67,23 +68,25 @@ public void testArgChecks() throws Exception { Configuration conf = S3ATestUtils.prepareTestConfiguration(new Configuration()); // Should not throw. - new S3ACachingInputStream(readContext, attrs, client, stats, conf, null); + new S3ACachingInputStream(readContext, prefetchOptions, attrs, client, stats, conf, null); ExceptionAsserts.assertThrows( NullPointerException.class, - () -> new S3ACachingInputStream(null, attrs, client, stats, conf, null)); + () -> new S3ACachingInputStream(null, null, attrs, client, stats, conf, null)); ExceptionAsserts.assertThrows( NullPointerException.class, - () -> new S3ACachingInputStream(readContext, null, client, stats, conf, null)); + () -> new S3ACachingInputStream(readContext, null, null, client, stats, conf, null)); ExceptionAsserts.assertThrows( NullPointerException.class, - () -> new S3ACachingInputStream(readContext, attrs, null, stats, conf, null)); + () -> new S3ACachingInputStream(readContext, prefetchOptions, attrs, null, stats, conf, + null)); ExceptionAsserts.assertThrows( NullPointerException.class, - () -> new S3ACachingInputStream(readContext, attrs, client, null, conf, null)); + () -> new S3ACachingInputStream(readContext, prefetchOptions, attrs, client, null, conf, + null)); } @Test diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java index 4818df284f6617..9e1e979eeced44 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/prefetch/TestS3ARemoteObject.java @@ -30,7 +30,7 @@ import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; -import org.apache.hadoop.fs.s3a.impl.model.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; import org.apache.hadoop.test.AbstractHadoopTestBase; public class TestS3ARemoteObject extends AbstractHadoopTestBase { @@ -46,7 +46,7 @@ public class TestS3ARemoteObject extends AbstractHadoopTestBase { @Test public void testArgChecks() throws Exception { S3AReadOpContext readContext = - S3APrefetchFakes.createReadContext(futurePool, "key", 10, 10, 1); + S3APrefetchFakes.createReadContext(futurePool, "key", 10); S3ObjectAttributes attrs = S3APrefetchFakes.createObjectAttributes("bucket", "key", 10); S3AInputStreamStatistics stats = diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3AInputStreamPerformance.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3AInputStreamPerformance.java index a787f52bd4d40f..bb46d5ca1e292c 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3AInputStreamPerformance.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3AInputStreamPerformance.java @@ -58,6 +58,7 @@ import static org.apache.hadoop.fs.contract.ContractTestUtils.*; import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.assume; +import static org.apache.hadoop.fs.s3a.S3ATestUtils.disablePrefetching; import static org.apache.hadoop.fs.s3a.S3ATestUtils.getInputStreamStatistics; import static org.apache.hadoop.fs.s3a.S3ATestUtils.getS3AInputStream; import static org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils.isUsingDefaultExternalDataFile; @@ -99,15 +100,12 @@ public class ITestS3AInputStreamPerformance extends S3AScaleTestBase { @Override protected Configuration createScaleConfiguration() { - Configuration conf = super.createScaleConfiguration(); - S3ATestUtils.removeBaseAndBucketOverrides(conf, - PREFETCH_ENABLED_KEY); + Configuration conf = disablePrefetching(super.createScaleConfiguration()); if (isUsingDefaultExternalDataFile(conf)) { S3ATestUtils.removeBaseAndBucketOverrides( conf, ENDPOINT); } - conf.setBoolean(PREFETCH_ENABLED_KEY, false); return conf; } From fc91e6c58afd85d37cd76fcfbba0a42696f4bfd8 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Tue, 7 Jan 2025 14:36:23 +0000 Subject: [PATCH 06/13] HADOOP-19354. Input Stream Factory Push factory construction into the enum itself Store implements stream capabilities, which are then relayed to the active factory. This avoids the FS having to know what capabilities are available in the stream. Abstract base class for stream factories. Change-Id: Ib757e6696f29cc7e0e8edd1119e738c6adc6f98f --- .../org/apache/hadoop/fs/s3a/Constants.java | 16 ++-- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 73 +++++++++++------- .../org/apache/hadoop/fs/s3a/S3AStore.java | 2 + .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 46 ++++++++++- .../AbstractObjectInputStreamFactory.java | 48 ++++++++++++ .../ClassicObjectInputStreamFactory.java | 36 +++++++-- .../fs/s3a/impl/streams/InputStreamType.java | 35 +++++++-- .../streams/ObjectInputStreamFactory.java | 46 ++--------- .../impl/streams/ObjectReadParameters.java | 4 +- .../s3a/impl/streams/StreamIntegration.java | 23 ++---- .../s3a/impl/streams/StreamThreadOptions.java | 76 +++++++++++++++++++ .../PrefetchingInputStreamFactory.java | 11 ++- 12 files changed, 299 insertions(+), 117 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/{ => streams}/ClassicObjectInputStreamFactory.java (58%) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamThreadOptions.java diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index da2dd9e2940728..3b9446cd8ef5bc 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -21,6 +21,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.Options; +import org.apache.hadoop.fs.s3a.impl.streams.InputStreamType; import org.apache.hadoop.security.ssl.DelegatingSSLSocketFactory; import java.time.Duration; @@ -1560,7 +1561,6 @@ private Constants() { */ public static final String AWS_AUTH_CLASS_PREFIX = "com.amazonaws.auth"; - /** * Input stream type: {@value}. */ @@ -1569,23 +1569,25 @@ private Constants() { /** * The classic input stream: {@value}. */ - public static final String INPUT_STREAM_TYPE_CLASSIC = "classic"; + public static final String INPUT_STREAM_TYPE_CLASSIC = + InputStreamType.Classic.getName(); /** - * The prefetching input stream: {@value}. + * The prefetching input stream: "prefetch". */ - public static final String INPUT_STREAM_TYPE_PREFETCH = "prefetch"; + public static final String INPUT_STREAM_TYPE_PREFETCH = InputStreamType.Prefetch.getName(); /** - * The analytics input stream: {@value}. + * The analytics input stream: "analytics". */ - public static final String INPUT_STREAM_TYPE_ANALYTICS = "analytics"; + public static final String INPUT_STREAM_TYPE_ANALYTICS = + InputStreamType.Analytics.getName(); /** * The default input stream. * Currently {@link #INPUT_STREAM_TYPE_CLASSIC} */ - public static final String INPUT_STREAM_TYPE_DEFAULT = INPUT_STREAM_TYPE_CLASSIC; + public static final String INPUT_STREAM_TYPE_DEFAULT = InputStreamType.DEFAULT_STREAM_TYPE.getName(); /** * Controls whether the prefetching input stream is enabled. 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 58c46197551b6f..1f32eba6f33fa7 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 @@ -156,9 +156,9 @@ import org.apache.hadoop.fs.s3a.impl.StoreContextFactory; import org.apache.hadoop.fs.s3a.impl.UploadContentProviders; import org.apache.hadoop.fs.s3a.impl.CSEUtils; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamCallbacks; +import org.apache.hadoop.fs.s3a.impl.streams.StreamThreadOptions; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperations; import org.apache.hadoop.fs.s3a.tools.MarkerToolOperationsImpl; import org.apache.hadoop.fs.statistics.DurationTracker; @@ -167,7 +167,6 @@ import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.fs.statistics.IOStatisticsSource; import org.apache.hadoop.fs.statistics.IOStatisticsContext; -import org.apache.hadoop.fs.statistics.StreamStatisticNames; import org.apache.hadoop.fs.statistics.impl.IOStatisticsStore; import org.apache.hadoop.fs.store.LogExactlyOnce; import org.apache.hadoop.fs.store.audit.AuditEntryPoint; @@ -998,8 +997,11 @@ public Statistics getInstanceStatistics() { /** * Initialize the thread pools. + *

* This must be re-invoked after replacing the S3Client during test * runs. + *

+ * It requires the S3Store to have been instantiated. * @param conf configuration. */ private void initThreadPools() { @@ -1021,9 +1023,9 @@ private void initThreadPools() { TimeUnit.SECONDS, Duration.ZERO).getSeconds(); - final ObjectInputStreamFactory.ThreadOptions requirements = - getStore().prefetchThreadRequirements(); - int numPrefetchThreads = requirements.sharedThreads(); + final StreamThreadOptions threadRequirements = + getStore().threadRequirements(); + int numPrefetchThreads = threadRequirements.sharedThreads(); int activeTasksForBoundedThreadPool = maxThreads; int waitingTasksForBoundedThreadPool = maxThreads + totalTasks + numPrefetchThreads; @@ -1041,7 +1043,8 @@ private void initThreadPools() { unboundedThreadPool.allowCoreThreadTimeOut(true); executorCapacity = intOption(conf, EXECUTOR_CAPACITY, DEFAULT_EXECUTOR_CAPACITY, 1); - if (requirements.createFuturePool()) { + if (threadRequirements.createFuturePool()) { + // create a future pool. final S3AInputStreamStatistics s3AInputStreamStatistics = statisticsContext.newInputStreamStatistics(); futurePool = new ExecutorServiceFuturePool( @@ -1928,20 +1931,24 @@ private FSDataInputStream executeOpen( auditSpan); fileInformation.applyOptions(readContext); LOG.debug("Opening '{}'", readContext); - // QUESTION: why are we creating a new executor on each open? + + // what does the stream need + final StreamThreadOptions requirements = + getStore().threadRequirements(); + + // calculate the permit count. + final int permitCount = requirements.streamThreads() + + (requirements.vectorSupported() + ? vectoredActiveRangeReads + : 0); + // create an executor which is a subset of the + // bounded thread pool. final SemaphoredDelegatingExecutor pool = new SemaphoredDelegatingExecutor( boundedThreadPool, - vectoredActiveRangeReads, + permitCount, true, inputStreamStats); - ObjectReadParameters parameters = new ObjectReadParameters() - .withBoundedThreadPool(pool) - .withCallbacks(createInputStreamCallbacks(auditSpan)) - .withContext(readContext.build()) - .withDirectoryAllocator(getStore().getDirectoryAllocator()) - .withObjectAttributes(createObjectAttributes(path, fileStatus)) - .withStreamStatistics(inputStreamStats) - .build(); + if (this.analyticsAcceleratorEnabled) { return new FSDataInputStream( new S3ASeekableStream( @@ -1950,11 +1957,16 @@ private FSDataInputStream executeOpen( s3SeekableInputStreamFactory)); } + // do not validate() the parameters as the store + // completes this. + ObjectReadParameters parameters = new ObjectReadParameters() + .withBoundedThreadPool(pool) + .withCallbacks(createInputStreamCallbacks(auditSpan)) + .withContext(readContext.build()) + .withObjectAttributes(createObjectAttributes(path, fileStatus)) + .withStreamStatistics(inputStreamStats); + return new FSDataInputStream(getStore().readObject(parameters)); - // TODO: move into S3AStore and export the factory API through - // the store, which will add some of the features (callbacks, stats) - // before invoking the real factory - return new FSDataInputStream(getStore().readObject(parameters)); } /** @@ -4408,16 +4420,19 @@ protected synchronized void stopAllServices() { // At this point the S3A client is shut down, // now the executor pools are closed + + // shut future pool first as it wraps the bounded thread pool + if (futurePool != null) { + futurePool.shutdown(LOG, THREAD_POOL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS); + futurePool = null; + } HadoopExecutors.shutdown(boundedThreadPool, LOG, THREAD_POOL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS); boundedThreadPool = null; HadoopExecutors.shutdown(unboundedThreadPool, LOG, THREAD_POOL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS); unboundedThreadPool = null; - if (futurePool != null) { - futurePool.shutdown(LOG, THREAD_POOL_SHUTDOWN_DELAY_SECONDS, TimeUnit.SECONDS); - futurePool = null; - } + // other services are shutdown. cleanupWithLogger(LOG, delegationTokens.orElse(null), @@ -5569,15 +5584,17 @@ public boolean hasPathCapability(final Path path, final String capability) case AWS_S3_ACCESS_GRANTS_ENABLED: return s3AccessGrantsEnabled; - // stream leak detection. - case StreamStatisticNames.STREAM_LEAKS: - return true; - default: // is it a performance flag? if (performanceFlags.hasCapability(capability)) { return true; } + + // ask the store for what input stream capabilities it offers + if (getStore() != null && getStore().hasCapability(capability)) { + return true; + } + // fall through } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java index 1dccd9d950869c..8655956cf7d032 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AStore.java @@ -47,6 +47,7 @@ import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.LocalDirAllocator; +import org.apache.hadoop.fs.PathCapabilities; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; import org.apache.hadoop.fs.s3a.impl.ClientManager; @@ -78,6 +79,7 @@ public interface S3AStore extends ClientManager, IOStatisticsSource, ObjectInputStreamFactory, + PathCapabilities, Service { /** diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index ac84ae74859a98..e2fbb07f2440cd 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -61,6 +61,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalDirAllocator; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.s3a.Invoker; import org.apache.hadoop.fs.s3a.ProgressableProgressListener; import org.apache.hadoop.fs.s3a.Retries; @@ -75,6 +76,7 @@ import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.StreamThreadOptions; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTracker; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; @@ -113,6 +115,7 @@ import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfOperation; import static org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDurationOfSupplier; import static org.apache.hadoop.util.Preconditions.checkArgument; +import static org.apache.hadoop.util.StringUtils.toLowerCase; /** * Store Layer. @@ -240,12 +243,46 @@ protected void serviceStart() throws Exception { initLocalDirAllocator(); } + + /** + * Return the store capabilities. + * If the object stream factory is non-null, hands off the + * query to that factory if not handled here. + * @param path path to query the capability of. + * @param capability non-null, non-empty string to query the path for support. + * @return known capabilities + */ + @Override + public boolean hasPathCapability(final Path path, final String capability) { + switch (toLowerCase(capability)) { + case StreamCapabilities.IOSTATISTICS: + return true; + default: + return hasCapability(capability); + } + } + + /** + * Return the capabilities of input streams created + * through the store. + * @param capability string to query the stream support for. + * @return capabilities declared supported in streams. + */ + @Override + public boolean hasCapability(final String capability) { + if (objectInputStreamFactory != null) { + return objectInputStreamFactory.hasCapability(capability); + } + return false; + } + /** * Initialize dir allocator if not already initialized. */ private void initLocalDirAllocator() { String bufferDir = getConfig().get(BUFFER_DIR) != null - ? BUFFER_DIR : HADOOP_TMP_DIR; + ? BUFFER_DIR + : HADOOP_TMP_DIR; directoryAllocator = new LocalDirAllocator(bufferDir); } @@ -897,11 +934,12 @@ public File createTemporaryFileForWriting(String pathStr, @Override /* ObjectInputStreamFactory */ public ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException { - return objectInputStreamFactory.readObject(parameters); + parameters.withDirectoryAllocator(getDirectoryAllocator()); + return objectInputStreamFactory.readObject(parameters.validate()); } @Override /* ObjectInputStreamFactory */ - public ThreadOptions prefetchThreadRequirements() { - return objectInputStreamFactory.prefetchThreadRequirements(); + public StreamThreadOptions threadRequirements() { + return objectInputStreamFactory.threadRequirements(); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java new file mode 100644 index 00000000000000..d3b6c671139975 --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java @@ -0,0 +1,48 @@ +/* + * 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.apache.hadoop.fs.s3a.impl.streams; + +import org.apache.hadoop.fs.StreamCapabilities; +import org.apache.hadoop.fs.statistics.StreamStatisticNames; +import org.apache.hadoop.service.AbstractService; + +import static org.apache.hadoop.util.StringUtils.toLowerCase; + +/** + * Base implementation of {@link ObjectInputStreamFactory}. + */ +public abstract class AbstractObjectInputStreamFactory extends AbstractService + implements ObjectInputStreamFactory { + + protected AbstractObjectInputStreamFactory(final String name) { + super(name); + } + + @Override + public boolean hasCapability(final String capability) { + switch (toLowerCase(capability)) { + case StreamCapabilities.IOSTATISTICS: + case StreamStatisticNames.STREAM_LEAKS: + return true; + default: + return false; + } + } + +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ClassicObjectInputStreamFactory.java similarity index 58% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ClassicObjectInputStreamFactory.java index 7d401b11cb2a53..030e9bad01a5e1 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/ClassicObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ClassicObjectInputStreamFactory.java @@ -16,21 +16,19 @@ * limitations under the License. */ -package org.apache.hadoop.fs.s3a.impl; +package org.apache.hadoop.fs.s3a.impl.streams; import java.io.IOException; +import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.s3a.S3AInputStream; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; -import org.apache.hadoop.service.AbstractService; + +import static org.apache.hadoop.util.StringUtils.toLowerCase; /** * Factory of classic {@link S3AInputStream} instances. */ -public class ClassicObjectInputStreamFactory extends AbstractService - implements ObjectInputStreamFactory { +public class ClassicObjectInputStreamFactory extends AbstractObjectInputStreamFactory { public ClassicObjectInputStreamFactory() { super("ClassicObjectInputStreamFactory"); @@ -41,4 +39,28 @@ public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { return new S3AInputStream(parameters); } + + @Override + public boolean hasCapability(final String capability) { + + switch (toLowerCase(capability)) { + case StreamCapabilities.IOSTATISTICS_CONTEXT: + case StreamCapabilities.READAHEAD: + case StreamCapabilities.UNBUFFER: + case StreamCapabilities.VECTOREDIO: + return true; + default: + return super.hasCapability(capability); + } + } + + /** + * Get the number of background threads required for this factory. + * @return the count of background threads. + */ + @Override + public StreamThreadOptions threadRequirements() { + return new StreamThreadOptions(0, 0, false, true); + } + } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java index f2c6b4a920fe22..4ca9a6305a2372 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -18,32 +18,42 @@ package org.apache.hadoop.fs.s3a.impl.streams; -import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_ANALYTICS; -import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_CLASSIC; -import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE_PREFETCH; +import java.util.function.Function; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; /** * Enum of input stream types. + * Each enum value contains the factory function actually used to create + * the factory. */ public enum InputStreamType { /** * The classic input stream. */ - Classic(INPUT_STREAM_TYPE_CLASSIC), + Classic("classic", c -> + new ClassicObjectInputStreamFactory()), + /** * The prefetching input stream. */ - Prefetch(INPUT_STREAM_TYPE_PREFETCH), + Prefetch("prefetch", c -> + new PrefetchingInputStreamFactory()), + /** * The analytics input stream. */ - Analytics(INPUT_STREAM_TYPE_ANALYTICS); + Analytics("analytics", c -> { + throw new IllegalArgumentException("not yet supported"); + }); /** * Name. */ private final String name; + private final Function factory; /** * String name. * @return the name @@ -52,8 +62,17 @@ public String getName() { return name; } - InputStreamType(String name) { + InputStreamType(String name, final Function factory) { this.name = name; + this.factory = factory; + } + + /** + * Factory constructor. + * @return the factory associated with this stream type. + */ + public Function factory() { + return factory; } /** @@ -61,4 +80,6 @@ public String getName() { */ public static final InputStreamType DEFAULT_STREAM_TYPE = Classic; + + } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java index b9bc86471fce1a..1293bd4f92a06d 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java @@ -20,6 +20,7 @@ import java.io.IOException; +import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.service.Service; /** @@ -34,7 +35,8 @@ * {@link ObjectReadParameters} class, rather than change the * interface signature. */ -public interface ObjectInputStreamFactory extends Service { +public interface ObjectInputStreamFactory + extends Service, StreamCapabilities { /** * Create a new input stream. @@ -48,46 +50,10 @@ ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException; /** - * Get the number of prefetch threads required for this factory. - * @return the count of prefetch threads. + * Get the number of background threads required for this factory. + * @return the count of background threads. */ - default ThreadOptions prefetchThreadRequirements() { - return new ThreadOptions(0, false); - } + StreamThreadOptions threadRequirements(); - /** - * Will streams created through this factory have the requested capability? - * @param capability capability to probe for. - * @return true if a capability is known to be supported. - */ - default boolean hasStreamCapability(String capability) { - return false; - } - - /** - * Options for threading. - */ - class ThreadOptions { - /** number of shared threads to included in the bounded pool. */ - private final int sharedThreads; - - /** - * flag to enable creation of a future pool around the bounded thread pool. - */ - private final boolean createFuturePool; - - public ThreadOptions(final int sharedThreads, final boolean createFuturePool) { - this.sharedThreads = sharedThreads; - this.createFuturePool = createFuturePool; - } - - public int sharedThreads() { - return sharedThreads; - } - - public boolean createFuturePool() { - return createFuturePool; - } - } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java index 8ee16b1050a296..32a2487d3f7e7d 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java @@ -32,7 +32,7 @@ * {@link ObjectInputStreamFactory}. * It is designed to support extra parameters added * in future. - *

Note that the {@link #build()} + *

Note that the {@link #validate()} * operation does not freeze the parameters -instead it simply * verifies that all required values are set. */ @@ -173,7 +173,7 @@ public ObjectReadParameters withDirectoryAllocator(final LocalDirAllocator value * Mock tests can skip this if required. * @return the object. */ - public ObjectReadParameters build() { + public ObjectReadParameters validate() { // please keep in alphabetical order. requireNonNull(boundedThreadPool, "boundedThreadPool"); requireNonNull(callbacks, "callbacks"); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index 2b74ccc7aad4d1..85ca41beaf914d 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -22,15 +22,13 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.s3a.impl.ClassicObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; import org.apache.hadoop.fs.store.LogExactlyOnce; import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; /** - * Stream integration, including S3AStoreImpl. + * Stream integration, including factory construction. */ public final class StreamIntegration { @@ -45,27 +43,20 @@ public final class StreamIntegration { /** * Create the input stream factory the configuration asks for. + * This does not initialize the factory. * @param conf configuration * @return a stream factory. */ public static ObjectInputStreamFactory createStreamFactory(final Configuration conf) { - ObjectInputStreamFactory objectInputStreamFactory; - InputStreamType defaultStream = InputStreamType.Classic; + // choose the default input stream type + InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { WARN_PREFETCH_KEY.info("Using {} is deprecated: choose the appropriate stream in {}", PREFETCH_ENABLED_KEY, INPUT_STREAM_TYPE); defaultStream = InputStreamType.Prefetch; } - InputStreamType inputStreamType = conf.getEnum(INPUT_STREAM_TYPE, - defaultStream); - switch (inputStreamType) { - case Prefetch: - objectInputStreamFactory = new PrefetchingInputStreamFactory(); - break; - case Classic: - default: - objectInputStreamFactory = new ClassicObjectInputStreamFactory(); - } - return objectInputStreamFactory; + return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) + .factory() + .apply(conf); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamThreadOptions.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamThreadOptions.java new file mode 100644 index 00000000000000..d4d629b94e430f --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamThreadOptions.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.apache.hadoop.fs.s3a.impl.streams; + +/** + * Options for threading on this input stream. + */ +public class StreamThreadOptions { + + /** Number of shared threads to included in the bounded pool. */ + private final int sharedThreads; + + /** + * How many threads per stream, ignoring vector IO requirements. + */ + private final int streamThreads; + + /** + * Flag to enable creation of a future pool around the bounded thread pool. + */ + private final boolean createFuturePool; + + /** + * Is vector IO supported (so its thread requirements + * included too)? + */ + private final boolean vectorSupported; + + /** + * Create the thread options. + * @param sharedThreads Number of shared threads to included in the bounded pool. + * @param streamThreads How many threads per stream, ignoring vector IO requirements. + * @param createFuturePool Flag to enable creation of a future pool around the bounded thread pool. + */ + public StreamThreadOptions(final int sharedThreads, + final int streamThreads, + final boolean createFuturePool, + final boolean vectorSupported) { + this.sharedThreads = sharedThreads; + this.streamThreads = streamThreads; + this.createFuturePool = createFuturePool; + this.vectorSupported = vectorSupported; + } + + public int sharedThreads() { + return sharedThreads; + } + + public int streamThreads() { + return streamThreads; + } + + public boolean createFuturePool() { + return createFuturePool; + } + + public boolean vectorSupported() { + return vectorSupported; + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java index 82e88810268db6..b490294b7696dd 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java @@ -21,10 +21,10 @@ import java.io.IOException; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.s3a.impl.streams.AbstractObjectInputStreamFactory; import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; -import org.apache.hadoop.service.AbstractService; +import org.apache.hadoop.fs.s3a.impl.streams.StreamThreadOptions; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_COUNT_KEY; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_DEFAULT_COUNT; @@ -39,8 +39,7 @@ *

* Reads and validates prefetch configuration options during service init. */ -public class PrefetchingInputStreamFactory extends AbstractService - implements ObjectInputStreamFactory { +public class PrefetchingInputStreamFactory extends AbstractObjectInputStreamFactory { /** Size in bytes of a single prefetch block. */ private int prefetchBlockSize; @@ -85,7 +84,7 @@ public ObjectInputStream readObject(final ObjectReadParameters parameters) throw * @return a positive thread count. */ @Override - public ThreadOptions prefetchThreadRequirements() { - return new ThreadOptions(prefetchBlockCount, true); + public StreamThreadOptions threadRequirements() { + return new StreamThreadOptions(prefetchBlockCount, 0, true, false); } } From 7c7caa9f896f8bed3c43766612b144be8434a5ee Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Wed, 8 Jan 2025 18:19:18 +0000 Subject: [PATCH 07/13] HADOOP-19354. review comments Change-Id: Id79f8aa019095c1601bb0b2a282c51bdb0b7b817 --- .../hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java | 2 +- hadoop-tools/hadoop-aws/src/test/resources/log4j.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java index 211b3476cd1ccb..f4ed384ed977a2 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamCallbacks.java @@ -30,7 +30,7 @@ import org.apache.hadoop.util.functional.CallableRaisingIOE; /** - * Callbacks for reading objectd data from the S3 Store. + * Callbacks for reading object data from the S3 Store. */ public interface ObjectInputStreamCallbacks extends Closeable { diff --git a/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties b/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties index f548e7c98f9eb4..7b8dd3c11fcdc8 100644 --- a/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties +++ b/hadoop-tools/hadoop-aws/src/test/resources/log4j.properties @@ -100,5 +100,5 @@ log4j.logger.org.apache.hadoop.fs.s3a.S3AStorageStatistics=INFO # debug service lifecycle of components such as S3AStore and # services it launches itself. -log4.logger.org.apache.hadoop.service=DEBUG +# log4.logger.org.apache.hadoop.service=DEBUG From 22d02675f18c7ccd9e446b269412bac3b275e577 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Wed, 8 Jan 2025 18:21:03 +0000 Subject: [PATCH 08/13] Merge branch 'trunk' into s3/HADOOP-19354-s3a-inputstream-factory Conflicts: hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java Change-Id: I1eddd195a9a3e3332bfaac2e225acf69774c3ce8 --- .../order/AvailableSpaceResolver.java | 7 +- .../order/TestAvailableSpaceResolver.java | 8 + hadoop-tools/hadoop-aws/pom.xml | 53 -- .../org/apache/hadoop/fs/s3a/Constants.java | 31 +- .../org/apache/hadoop/fs/s3a/Listing.java | 49 +- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 194 +------- .../org/apache/hadoop/fs/s3a/S3AUtils.java | 1 - .../hadoop/fs/s3a/WriteOperationHelper.java | 25 +- .../auth/CredentialProviderListFactory.java | 4 - .../fs/s3a/commit/impl/CommitOperations.java | 2 +- .../commit/magic/S3MagicCommitTracker.java | 4 +- .../hadoop/fs/s3a/impl/DirMarkerTracker.java | 26 - .../hadoop/fs/s3a/impl/DirectoryPolicy.java | 110 ----- .../fs/s3a/impl/DirectoryPolicyImpl.java | 212 -------- .../hadoop/fs/s3a/impl/MkdirOperation.java | 15 +- .../hadoop/fs/s3a/impl/PutObjectOptions.java | 38 +- .../fs/s3a/impl/S3AMultipartUploader.java | 2 +- .../apache/hadoop/fs/s3a/s3guard/S3Guard.java | 6 - .../hadoop/fs/s3a/s3guard/S3GuardTool.java | 67 +-- .../hadoop/fs/s3a/tools/MarkerTool.java | 93 +--- .../fs/s3native/NativeS3FileSystem.java | 148 ------ .../hadoop/fs/s3native/S3xLoginHelper.java | 87 +--- .../services/org.apache.hadoop.fs.FileSystem | 16 - .../tools/hadoop-aws/assumed_roles.md | 11 +- .../tools/hadoop-aws/directory_markers.md | 466 ++++-------------- .../site/markdown/tools/hadoop-aws/index.md | 8 +- .../markdown/tools/hadoop-aws/performance.md | 3 +- .../site/markdown/tools/hadoop-aws/s3guard.md | 7 +- .../src/site/markdown/tools/hadoop-aws/s3n.md | 52 -- .../site/markdown/tools/hadoop-aws/testing.md | 47 -- .../hadoop/fs/s3a/AbstractS3ATestBase.java | 51 -- .../hadoop/fs/s3a/ITestDowngradeSyncable.java | 5 - .../fs/s3a/ITestS3AClientSideEncryption.java | 2 +- .../fs/s3a/ITestS3AFileOperationCost.java | 31 +- .../hadoop/fs/s3a/ITestS3AMiscOperations.java | 2 +- .../fs/s3a/ITestS3APrefetchingCacheFiles.java | 4 - .../s3a/ITestS3APrefetchingInputStream.java | 4 - .../s3a/ITestS3APrefetchingLruEviction.java | 1 - .../hadoop/fs/s3a/MockS3AFileSystem.java | 8 - .../hadoop/fs/s3a/MultipartTestUtils.java | 2 +- .../hadoop/fs/s3a/S3ATestConstants.java | 6 - .../apache/hadoop/fs/s3a/S3ATestUtils.java | 10 +- .../fs/s3a/TestS3ABlockOutputStream.java | 2 +- .../fs/s3a/audit/ITestAuditAccessChecks.java | 4 - .../fs/s3a/audit/ITestAuditManager.java | 4 - .../s3a/audit/ITestAuditManagerDisabled.java | 4 - .../s3a/commit/ITestCommitOperationCost.java | 43 +- .../s3a/impl/ITestPartialRenamesDeletes.java | 4 - .../fs/s3a/impl/ITestRenameDeleteRace.java | 23 +- .../hadoop/fs/s3a/impl/ITestXAttrCost.java | 4 - .../s3a/impl/TestDirectoryMarkerPolicy.java | 163 ------ .../fs/s3a/impl/TestRequestFactory.java | 6 +- .../s3a/performance/AbstractS3ACostTest.java | 91 +--- .../s3a/performance/ITestCreateFileCost.java | 6 +- .../ITestDirectoryMarkerListing.java | 82 +-- .../s3a/performance/ITestS3ADeleteCost.java | 105 +--- .../ITestS3AMiscOperationCost.java | 7 +- .../fs/s3a/performance/ITestS3AMkdirCost.java | 23 - .../fs/s3a/performance/ITestS3AOpenCost.java | 4 - .../s3a/performance/ITestS3ARenameCost.java | 52 +- .../performance/ITestUnbufferDraining.java | 7 - .../s3guard/AbstractS3GuardToolTestBase.java | 6 +- .../fs/s3a/s3guard/TestAuthoritativePath.java | 132 ----- .../scale/ITestS3ADirectoryPerformance.java | 9 +- .../MinimalWriteOperationHelperCallbacks.java | 7 - .../fs/s3a/tools/AbstractMarkerToolTest.java | 95 +--- .../hadoop/fs/s3a/tools/ITestMarkerTool.java | 172 +------ .../fs/s3native/TestS3xLoginHelper.java | 205 -------- 68 files changed, 302 insertions(+), 2876 deletions(-) delete mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicy.java delete mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicyImpl.java delete mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java delete mode 100644 hadoop-tools/hadoop-aws/src/main/resources/META-INF/services/org.apache.hadoop.fs.FileSystem delete mode 100644 hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3n.md delete mode 100644 hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestDirectoryMarkerPolicy.java delete mode 100644 hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/TestAuthoritativePath.java delete mode 100644 hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/TestS3xLoginHelper.java diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/order/AvailableSpaceResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/order/AvailableSpaceResolver.java index 591ac5b3c37cab..6462a9b22a85eb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/order/AvailableSpaceResolver.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/order/AvailableSpaceResolver.java @@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdfs.server.federation.resolver.PathLocation; +import org.apache.hadoop.hdfs.server.federation.resolver.RemoteLocation; import org.apache.hadoop.hdfs.server.federation.resolver.order.AvailableSpaceResolver.SubclusterAvailableSpace; import org.apache.hadoop.hdfs.server.federation.router.RBFConfigKeys; import org.apache.hadoop.hdfs.server.federation.router.Router; @@ -116,8 +117,10 @@ protected Map getSubclusterInfo( protected String chooseFirstNamespace(String path, PathLocation loc) { Map subclusterInfo = getSubclusterMapping(); - List subclusterList = new LinkedList<>( - subclusterInfo.values()); + List subclusterList = new LinkedList<>(); + for (RemoteLocation dest : loc.getDestinations()) { + subclusterList.add(subclusterInfo.get(dest.getNameserviceId())); + } Collections.sort(subclusterList, comparator); return subclusterList.size() > 0 ? subclusterList.get(0).getNameserviceId() diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/order/TestAvailableSpaceResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/order/TestAvailableSpaceResolver.java index 3d6b61aca0e353..84bf57f2b0a104 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/order/TestAvailableSpaceResolver.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/order/TestAvailableSpaceResolver.java @@ -229,4 +229,12 @@ private void verifyRank(float balancerPreference, boolean shouldOrdered, } subclusters.clear(); } + + @Test + public void testChooseFirstNamespace() throws Exception { + MultipleDestinationMountTableResolver mountTableResolver = + mockAvailableSpaceResolver(1.0f); + PathLocation loc = mountTableResolver.getDestinationForPath("/space"); + assertEquals("subcluster9", loc.getDefaultLocation().getNameserviceId()); + } } diff --git a/hadoop-tools/hadoop-aws/pom.xml b/hadoop-tools/hadoop-aws/pom.xml index f047cde9cfbfca..28605c47f33b6c 100644 --- a/hadoop-tools/hadoop-aws/pom.xml +++ b/hadoop-tools/hadoop-aws/pom.xml @@ -48,10 +48,6 @@ 200000 - - false - - unset @@ -126,9 +122,6 @@ ${fs.s3a.scale.test.huge.filesize} ${fs.s3a.scale.test.huge.partitionsize} ${fs.s3a.scale.test.timeout} - - ${fs.s3a.directory.marker.retention} - ${fs.s3a.directory.marker.audit} ${fs.s3a.prefetch.enabled} @@ -167,8 +160,6 @@ ${fs.s3a.scale.test.huge.filesize} ${fs.s3a.scale.test.huge.partitionsize} ${fs.s3a.scale.test.timeout} - ${fs.s3a.directory.marker.retention} - ${test.integration.timeout} ${fs.s3a.prefetch.enabled} @@ -221,9 +212,6 @@ ${fs.s3a.scale.test.huge.filesize} ${fs.s3a.scale.test.huge.partitionsize} ${fs.s3a.scale.test.timeout} - - ${fs.s3a.directory.marker.retention} - ${fs.s3a.directory.marker.audit} ${fs.s3a.prefetch.enabled} @@ -285,9 +273,6 @@ ${fs.s3a.scale.test.enabled} ${fs.s3a.scale.test.huge.filesize} ${fs.s3a.scale.test.timeout} - - ${fs.s3a.directory.marker.retention} - ${fs.s3a.directory.marker.audit} ${fs.s3a.prefetch.enabled} job-${job.id} @@ -314,44 +299,6 @@ - - - keep-markers - - - markers - keep - - - - keep - - - - delete-markers - - - markers - delete - - - - delete - - - - auth-markers - - - markers - authoritative - - - - authoritative - - - prefetch diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index 3b9446cd8ef5bc..1d4985ca428fe4 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -849,6 +849,7 @@ private Constants() { "fs.s3a." + Constants.AWS_SERVICE_IDENTIFIER_STS.toLowerCase() + ".signing-algorithm"; + @Deprecated public static final String S3N_FOLDER_SUFFIX = "_$folder$"; public static final String FS_S3A_BLOCK_SIZE = "fs.s3a.block.size"; public static final String FS_S3A = "s3a"; @@ -869,10 +870,13 @@ private Constants() { /** * Paths considered "authoritative". * When S3guard was supported, this skipped checks to s3 on directory listings. - * It is also use to optionally disable marker retentation purely on these - * paths -a feature which is still retained/available. + * It was also possilbe to use to optionally disable marker retentation purely on these + * paths -a feature which is no longer available. + * As no feature uses this any more, it is declared as deprecated. * */ + @Deprecated public static final String AUTHORITATIVE_PATH = "fs.s3a.authoritative.path"; + @Deprecated public static final String[] DEFAULT_AUTHORITATIVE_PATH = {}; /** @@ -1340,37 +1344,44 @@ private Constants() { /** * Policy for directory markers. - * This is a new feature of HADOOP-13230 which addresses - * some scale, performance and permissions issues -but - * at the risk of backwards compatibility. + * No longer supported as "keep" is the sole policy. */ + @Deprecated public static final String DIRECTORY_MARKER_POLICY = "fs.s3a.directory.marker.retention"; /** - * Delete directory markers. This is the backwards compatible option. + * Delete directory markers. + * No longer supported as "keep" is the sole policy. * Value: {@value}. */ + @Deprecated public static final String DIRECTORY_MARKER_POLICY_DELETE = "delete"; /** * Retain directory markers. + * No longer needed, so marked as deprecated to flag usages. * Value: {@value}. */ + @Deprecated public static final String DIRECTORY_MARKER_POLICY_KEEP = "keep"; /** * Retain directory markers in authoritative directory trees only. + * No longer required as "keep" is the sole policy. * Value: {@value}. */ + @Deprecated public static final String DIRECTORY_MARKER_POLICY_AUTHORITATIVE = "authoritative"; /** * Default retention policy: {@value}. + * No longer required as "keep" is the sole policy. */ + @Deprecated public static final String DEFAULT_DIRECTORY_MARKER_POLICY = DIRECTORY_MARKER_POLICY_KEEP; @@ -1378,7 +1389,7 @@ private Constants() { /** * {@code PathCapabilities} probe to verify that an S3A Filesystem * has the changes needed to safely work with buckets where - * directoy markers have not been deleted. + * directory markers have not been deleted. * Value: {@value}. */ public static final String STORE_CAPABILITY_DIRECTORY_MARKER_AWARE @@ -1395,16 +1406,20 @@ private Constants() { /** * {@code PathCapabilities} probe to indicate that the filesystem * deletes directory markers. + * Always false. * Value: {@value}. */ + @Deprecated public static final String STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_DELETE = "fs.s3a.capability.directory.marker.policy.delete"; /** * {@code PathCapabilities} probe to indicate that the filesystem * keeps directory markers in authoritative paths only. + * This probe always returns false. * Value: {@value}. */ + @Deprecated public static final String STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_AUTHORITATIVE = "fs.s3a.capability.directory.marker.policy.authoritative"; @@ -1412,6 +1427,7 @@ private Constants() { /** * {@code PathCapabilities} probe to indicate that a path * keeps directory markers. + * This probe always returns true. * Value: {@value}. */ public static final String STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP @@ -1420,6 +1436,7 @@ private Constants() { /** * {@code PathCapabilities} probe to indicate that a path * deletes directory markers. + * This probe always returns false. * Value: {@value}. */ public static final String STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Listing.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Listing.java index d8f68b48403398..a9d531b5b46212 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Listing.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Listing.java @@ -50,9 +50,7 @@ import java.util.concurrent.CompletableFuture; import java.util.StringJoiner; -import static org.apache.hadoop.fs.s3a.Constants.S3N_FOLDER_SUFFIX; import static org.apache.hadoop.fs.s3a.Invoker.onceInTheFuture; -import static org.apache.hadoop.fs.s3a.S3AUtils.ACCEPT_ALL; import static org.apache.hadoop.fs.s3a.S3AUtils.createFileStatus; import static org.apache.hadoop.fs.s3a.S3AUtils.maybeAddTrailingSlash; import static org.apache.hadoop.fs.s3a.S3AUtils.objectRepresentsDirectory; @@ -76,8 +74,8 @@ public class Listing extends AbstractStoreOperation { private static final Logger LOG = S3AFileSystem.LOG; - static final FileStatusAcceptor ACCEPT_ALL_BUT_S3N = - new AcceptAllButS3nDirs(); + static final FileStatusAcceptor ACCEPT_ALL_OBJECTS = + new AcceptAllObjects(); private final ListingOperationCallbacks listingOperationCallbacks; @@ -116,7 +114,7 @@ public static RemoteIterator toProvidedFileStatusIterator( S3AFileStatus[] fileStatuses) { return filteringRemoteIterator( remoteIteratorFromArray(fileStatuses), - Listing.ACCEPT_ALL_BUT_S3N::accept); + Listing.ACCEPT_ALL_OBJECTS::accept); } /** @@ -132,7 +130,7 @@ public static RemoteIterator toProvidedFileStatusIterator( * @throws IOException IO Problems */ @Retries.RetryRaw - public FileStatusListingIterator createFileStatusListingIterator( + public RemoteIterator createFileStatusListingIterator( Path listPath, S3ListRequest request, PathFilter filter, @@ -212,7 +210,7 @@ public RemoteIterator getListFilesAssumingDir( .createListObjectsRequest(key, delimiter, span), - ACCEPT_ALL, + S3AUtils.ACCEPT_ALL, acceptor, span)); } @@ -235,7 +233,7 @@ public RemoteIterator getLocatedFileStatusIteratorForDir( listingOperationCallbacks .createListObjectsRequest(key, "/", span), filter, - new AcceptAllButSelfAndS3nDirs(dir), + new AcceptAllButSelf(dir), span)); } @@ -263,8 +261,8 @@ public RemoteIterator getLocatedFileStatusIteratorForDir( return createFileStatusListingIterator( path, request, - ACCEPT_ALL, - new AcceptAllButSelfAndS3nDirs(path), + S3AUtils.ACCEPT_ALL, + new AcceptAllButSelf(path), span); } @@ -462,7 +460,7 @@ private boolean buildNextStatusBatch(S3ListResult objects) throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("{}: {}", keyPath, stringify(s3Object)); } - // Skip over keys that are ourselves and old S3N _$folder$ files + // Skip over keys that are ourselves if (acceptor.accept(keyPath, s3Object) && filter.accept(keyPath)) { S3AFileStatus status = createFileStatus(keyPath, s3Object, blockSize, userName, s3Object.eTag(), @@ -722,13 +720,12 @@ public void close() { } /** - * Accept all entries except the base path and those which map to S3N - * pseudo directory markers. + * Accept all entries except the base path. */ static class AcceptFilesOnly implements FileStatusAcceptor { private final Path qualifiedPath; - public AcceptFilesOnly(Path qualifiedPath) { + AcceptFilesOnly(Path qualifiedPath) { this.qualifiedPath = qualifiedPath; } @@ -743,7 +740,6 @@ public AcceptFilesOnly(Path qualifiedPath) { @Override public boolean accept(Path keyPath, S3Object s3Object) { return !keyPath.equals(qualifiedPath) - && !s3Object.key().endsWith(S3N_FOLDER_SUFFIX) && !objectRepresentsDirectory(s3Object.key()); } @@ -765,29 +761,28 @@ public boolean accept(FileStatus status) { } /** - * Accept all entries except those which map to S3N pseudo directory markers. + * Accept all entries. */ - static class AcceptAllButS3nDirs implements FileStatusAcceptor { + static class AcceptAllObjects implements FileStatusAcceptor { public boolean accept(Path keyPath, S3Object s3Object) { - return !s3Object.key().endsWith(S3N_FOLDER_SUFFIX); + return true; } public boolean accept(Path keyPath, String prefix) { - return !keyPath.toString().endsWith(S3N_FOLDER_SUFFIX); + return true; } public boolean accept(FileStatus status) { - return !status.getPath().toString().endsWith(S3N_FOLDER_SUFFIX); + return true; } } /** - * Accept all entries except the base path and those which map to S3N - * pseudo directory markers. + * Accept all entries except the base path. */ - public static class AcceptAllButSelfAndS3nDirs implements FileStatusAcceptor { + public static class AcceptAllButSelf implements FileStatusAcceptor { /** Base path. */ private final Path qualifiedPath; @@ -796,13 +791,12 @@ public static class AcceptAllButSelfAndS3nDirs implements FileStatusAcceptor { * Constructor. * @param qualifiedPath an already-qualified path. */ - public AcceptAllButSelfAndS3nDirs(Path qualifiedPath) { + public AcceptAllButSelf(Path qualifiedPath) { this.qualifiedPath = qualifiedPath; } /** - * Reject a s3Object entry if the key path is the qualified Path, or - * it ends with {@code "_$folder$"}. + * Reject a s3Object entry if the key path is the qualified Path. * @param keyPath key path of the entry * @param s3Object s3Object entry * @return true if the entry is accepted (i.e. that a status entry @@ -810,8 +804,7 @@ public AcceptAllButSelfAndS3nDirs(Path qualifiedPath) { */ @Override public boolean accept(Path keyPath, S3Object s3Object) { - return !keyPath.equals(qualifiedPath) && - !s3Object.key().endsWith(S3N_FOLDER_SUFFIX); + return !keyPath.equals(qualifiedPath); } /** 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 1f32eba6f33fa7..3603036c721e0e 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 @@ -30,7 +30,6 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.EnumSet; @@ -135,8 +134,6 @@ import org.apache.hadoop.fs.s3a.impl.CSEV1CompatibleS3AFileSystemOperations; import org.apache.hadoop.fs.s3a.impl.CSEMaterials; import org.apache.hadoop.fs.s3a.impl.DeleteOperation; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicy; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicyImpl; import org.apache.hadoop.fs.s3a.impl.GetContentSummaryOperation; import org.apache.hadoop.fs.s3a.impl.HeaderProcessing; import org.apache.hadoop.fs.s3a.impl.InternalConstants; @@ -204,7 +201,6 @@ import org.apache.hadoop.fs.s3a.commit.PutTracker; import org.apache.hadoop.fs.s3a.commit.MagicCommitIntegration; import org.apache.hadoop.fs.s3a.impl.ChangeTracker; -import org.apache.hadoop.fs.s3a.s3guard.S3Guard; import org.apache.hadoop.fs.s3a.statistics.BlockOutputStreamStatistics; import org.apache.hadoop.fs.s3a.statistics.CommitterStatistics; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; @@ -402,7 +398,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, private ChangeDetectionPolicy changeDetectionPolicy; private final AtomicBoolean closed = new AtomicBoolean(false); private volatile boolean isClosed = false; - private Collection allowAuthoritativePaths; /** Delegation token integration; non-empty when DT support is enabled. */ private Optional delegationTokens = Optional.empty(); @@ -438,11 +433,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, */ private OpenFileSupport openFileHelper; - /** - * Directory policy. - */ - private DirectoryPolicy directoryPolicy; - /** * Context accessors for re-use. */ @@ -785,12 +775,7 @@ public void initialize(URI name, Configuration originalConf) performanceFlags.makeImmutable(); LOG.debug("{} = {}", FS_S3A_CREATE_PERFORMANCE, performanceCreation); - allowAuthoritativePaths = S3Guard.getAuthoritativePaths(this); - // directory policy, which may look at authoritative paths - directoryPolicy = DirectoryPolicyImpl.getDirectoryPolicy(conf, - this::allowAuthoritative); - LOG.debug("Directory marker retention policy is {}", directoryPolicy); pageSize = intOption(getConf(), BULK_DELETE_PAGE_SIZE, BULK_DELETE_PAGE_SIZE_DEFAULT, 0); checkArgument(pageSize <= InternalConstants.MAX_ENTRIES_TO_DELETE, @@ -2002,33 +1987,6 @@ public UploadPartResponse uploadPart( return getStore().uploadPart(request, body, durationTrackerFactory); } - /** - * Perform post-write actions. - *

- * This operation MUST be called after any PUT/multipart PUT completes - * successfully. - *

- * The actions include calling - * {@link #deleteUnnecessaryFakeDirectories(Path)} - * if directory markers are not being retained. - * @param eTag eTag of the written object - * @param versionId S3 object versionId of the written object - * @param key key written to - * @param length total length of file written - * @param putOptions put object options - */ - @Override - @Retries.RetryExceptionsSwallowed - public void finishedWrite( - String key, - long length, - PutObjectOptions putOptions) { - S3AFileSystem.this.finishedWrite( - key, - length, - putOptions); - - } } /** @@ -2144,8 +2102,7 @@ public FSDataOutputStream create(Path f, FsPermission permission, * Retry policy: retrying, translated on the getFileStatus() probe. * No data is uploaded to S3 in this call, so no retry issues related to that. * The "performance" flag disables safety checks for the path being a file, - * parent directory existing, and doesn't attempt to delete - * dir markers, irrespective of FS settings. + * or parent directory existing. * If true, this method call does no IO at all. * @param path the file name to open * @param progress the progress reporter. @@ -2204,11 +2161,9 @@ private FSDataOutputStream innerCreateFile( committerIntegration.createTracker(path, key, outputStreamStatistics); String destKey = putTracker.getDestKey(); - // put options are derived from the path and the - // option builder. - boolean keep = options.isPerformance() || keepDirectoryMarkers(path); + // put options are derived from the option builder. final PutObjectOptions putOptions = - new PutObjectOptions(keep, null, options.getHeaders()); + new PutObjectOptions(null, options.getHeaders()); validateOutputStreamConfiguration(path, getConf()); @@ -2641,8 +2596,8 @@ public RemoteIterator listFilesAndDirectoryMarkers( path, true, includeSelf - ? Listing.ACCEPT_ALL_BUT_S3N - : new Listing.AcceptAllButSelfAndS3nDirs(path), + ? Listing.ACCEPT_ALL_OBJECTS + : new Listing.AcceptAllButSelf(path), status ); } @@ -2673,9 +2628,6 @@ public void finishRename(final Path sourceRenamed, final Path destCreated) Path destParent = destCreated.getParent(); if (!sourceRenamed.getParent().equals(destParent)) { LOG.debug("source & dest parents are different; fix up dir markers"); - if (!keepDirectoryMarkers(destParent)) { - deleteUnnecessaryFakeDirectories(destParent); - } maybeCreateFakeParentDirectory(sourceRenamed); } } @@ -2690,7 +2642,7 @@ public RemoteIterator listObjects( listing.createFileStatusListingIterator(path, createListObjectsRequest(key, null), ACCEPT_ALL, - Listing.ACCEPT_ALL_BUT_S3N, + Listing.ACCEPT_ALL_OBJECTS, auditSpan)); } @@ -3350,8 +3302,6 @@ PutObjectResponse putObjectDirect(PutObjectRequest putObjectRequest, provider.getSize(), CONTENT_TYPE_OCTET_STREAM))); incrementPutCompletedStatistics(true, len); - // apply any post-write actions. - finishedWrite(putObjectRequest.key(), len, putOptions); return response; } catch (SdkException e) { incrementPutCompletedStatistics(false, len); @@ -3628,7 +3578,7 @@ private void createFakeDirectoryIfNecessary(Path f) // is mostly harmless to create a new one. if (!key.isEmpty() && !s3Exists(f, StatusProbeEnum.DIRECTORIES)) { LOG.debug("Creating new fake directory at {}", f); - createFakeDirectory(key, putOptionsForPath(f)); + createFakeDirectory(key, PutObjectOptions.defaultOptions()); } } @@ -3720,25 +3670,13 @@ private RemoteIterator innerListStatus(Path f) return listing.createProvidedFileStatusIterator( stats, ACCEPT_ALL, - Listing.ACCEPT_ALL_BUT_S3N); + Listing.ACCEPT_ALL_OBJECTS); } } // Here we have a directory which may or may not be empty. return statusIt; } - /** - * Is a path to be considered as authoritative? - * is a store with the supplied path under - * one of the paths declared as authoritative. - * @param path path - * @return true if the path is auth - */ - public boolean allowAuthoritative(final Path path) { - return S3Guard.allowAuthoritative(path, this, - allowAuthoritativePaths); - } - /** * Create a {@code ListObjectsRequest} request against this bucket, * with the maximum keys returned in a query set by {@link #maxKeys}. @@ -3864,13 +3802,11 @@ public S3AFileStatus probePathStatus(final Path path, } @Override - public void createFakeDirectory(final Path dir, final boolean keepMarkers) + public void createFakeDirectory(final Path dir) throws IOException { S3AFileSystem.this.createFakeDirectory( pathToKey(dir), - keepMarkers - ? PutObjectOptions.keepingDirs() - : putOptionsForPath(dir)); + PutObjectOptions.defaultOptions()); } } @@ -3918,7 +3854,7 @@ public S3AFileStatus probePathStatus(final Path path, @Override public RemoteIterator listFilesIterator(final Path path, final boolean recursive) throws IOException { - return S3AFileSystem.this.innerListFiles(path, recursive, Listing.ACCEPT_ALL_BUT_S3N, null); + return S3AFileSystem.this.innerListFiles(path, recursive, Listing.ACCEPT_ALL_OBJECTS, null); } } @@ -4267,7 +4203,8 @@ public void copyLocalFileFromTo(File file, Path from, Path to) throws IOExceptio newPutObjectRequestBuilder(key, file.length(), false); final String dest = to.toString(); S3AFileSystem.this.invoker.retry("putObject(" + dest + ")", dest, true, () -> - executePut(putObjectRequestBuilder.build(), null, putOptionsForPath(to), file)); + executePut(putObjectRequestBuilder.build(), null, + PutObjectOptions.defaultOptions(), file)); return null; }); } @@ -4310,15 +4247,11 @@ PutObjectResponse executePut( final File file) throws IOException { String key = putObjectRequest.key(); - long len = getPutRequestLength(putObjectRequest); ProgressableProgressListener listener = - new ProgressableProgressListener(getStore(), putObjectRequest.key(), progress); + new ProgressableProgressListener(getStore(), key, progress); UploadInfo info = putObject(putObjectRequest, file, listener); PutObjectResponse result = getStore().waitForUploadCompletion(key, info).response(); listener.uploadCompleted(info.getFileUpload()); - - // post-write actions - finishedWrite(key, len, putOptions); return result; } @@ -4575,7 +4508,7 @@ public List listAWSPolicyRules( /** * Copy a single object in the bucket via a COPY operation. - * There's no update of metadata, directory markers, etc. + * There's no update of metadata, etc. * Callers must implement. * @param srcKey source object path * @param dstKey destination object path @@ -4707,10 +4640,6 @@ CreateMultipartUploadResponse initiateMultipartUpload( *

* This operation MUST be called after any PUT/multipart PUT completes * successfully. - *

- * The actions include calling - * {@link #deleteUnnecessaryFakeDirectories(Path)} - * if directory markers are not being retained. * @param key key written to * @param length total length of file written * @param putOptions put object options @@ -4724,70 +4653,6 @@ void finishedWrite( LOG.debug("Finished write to {}, len {}.", key, length); Preconditions.checkArgument(length >= 0, "content length is negative"); - if (!putOptions.isKeepMarkers()) { - Path p = keyToQualifiedPath(key); - deleteUnnecessaryFakeDirectories(p.getParent()); - } - } - - /** - * Should we keep directory markers under the path being created - * by mkdir/file creation/rename? - * This is done if marker retention is enabled for the path, - * or it is under a magic path where we are saving IOPs - * knowing that all committers are on the same code version and - * therefore marker aware. - * @param path path to probe - * @return true if the markers MAY be retained, - * false if they MUST be deleted - */ - private boolean keepDirectoryMarkers(Path path) { - return directoryPolicy.keepDirectoryMarkers(path) - || isUnderMagicCommitPath(path); - } - - /** - * Should we keep directory markers under the path being created - * by mkdir/file creation/rename? - * See {@link #keepDirectoryMarkers(Path)} for the policy. - * - * @param path path to probe - * @return the options to use with the put request - */ - private PutObjectOptions putOptionsForPath(Path path) { - return keepDirectoryMarkers(path) - ? PutObjectOptions.keepingDirs() - : PutObjectOptions.deletingDirs(); - } - - /** - * Delete mock parent directories which are no longer needed. - * Retry policy: retrying; exceptions swallowed. - * @param path path - * - */ - @Retries.RetryExceptionsSwallowed - private void deleteUnnecessaryFakeDirectories(Path path) { - List keysToRemove = new ArrayList<>(); - while (!path.isRoot()) { - String key = pathToKey(path); - key = (key.endsWith("/")) ? key : (key + "/"); - LOG.trace("To delete unnecessary fake directory {} for {}", key, path); - keysToRemove.add(ObjectIdentifier.builder().key(key).build()); - path = path.getParent(); - } - try { - removeKeys(keysToRemove, true); - } catch (AwsServiceException | IOException e) { - instrumentation.errorIgnored(); - if (LOG.isDebugEnabled()) { - StringBuilder sb = new StringBuilder(); - for (ObjectIdentifier objectIdentifier : keysToRemove) { - sb.append(objectIdentifier.key()).append(","); - } - LOG.debug("While deleting keys {} ", sb.toString(), e); - } - } } /** @@ -4806,8 +4671,6 @@ private void createFakeDirectory(final String objectName, /** * Used to create an empty file that represents an empty directory. - * The policy for deleting parent dirs depends on the path, dir - * status and the putOptions value. * Retry policy: retrying; translated. * @param objectName object to create * @param putOptions put object options @@ -4838,14 +4701,6 @@ public long getDefaultBlockSize() { return getConf().getLongBytes(FS_S3A_BLOCK_SIZE, DEFAULT_BLOCKSIZE); } - /** - * Get the directory marker policy of this filesystem. - * @return the marker policy. - */ - public DirectoryPolicy getDirectoryMarkerPolicy() { - return directoryPolicy; - } - @Override public String toString() { final StringBuilder sb = new StringBuilder( @@ -4875,7 +4730,6 @@ public String toString() { sb.append(", blockFactory=").append(blockFactory); } sb.append(", auditManager=").append(auditManager); - sb.append(", authoritativePath=").append(allowAuthoritativePaths); sb.append(", useListV1=").append(useListV1); if (committerIntegration != null) { sb.append(", magicCommitter=").append(isMagicCommitEnabled()); @@ -4885,7 +4739,6 @@ public String toString() { sb.append(", credentials=").append(credentials); sb.append(", delegation tokens=") .append(delegationTokens.map(Objects::toString).orElse("disabled")); - sb.append(", ").append(directoryPolicy); // if logging at debug, toString returns the entire IOStatistics set. if (getInstrumentation() != null) { sb.append(", instrumentation {") @@ -5233,7 +5086,7 @@ public RemoteIterator listFilesAndEmptyDirectories( final Path path = qualify(f); return trackDurationAndSpan(INVOCATION_LIST_FILES, path, () -> innerListFiles(path, recursive, - Listing.ACCEPT_ALL_BUT_S3N, + Listing.ACCEPT_ALL_OBJECTS, null)); } @@ -5545,20 +5398,13 @@ public boolean hasPathCapability(final Path path, final String capability) case CommonPathCapabilities.VIRTUAL_BLOCK_LOCATIONS: return true; - /* - * Marker policy capabilities are handed off. - */ case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_KEEP: - case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_DELETE: - case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_AUTHORITATIVE: - return getDirectoryMarkerPolicy().hasPathCapability(path, cap); - - // keep for a magic path or if the policy retains it case STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP: - return keepDirectoryMarkers(path); - // delete is the opposite of keep + return true; + // never true + case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_AUTHORITATIVE: case STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE: - return !keepDirectoryMarkers(path); + return false; case STORE_CAPABILITY_DIRECTORY_MARKER_MULTIPART_UPLOAD_ENABLED: return isMultipartUploadEnabled(); 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 a1da63329a9ea9..63ad42dab7adb6 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 @@ -724,7 +724,6 @@ public static boolean setIfDefined(Configuration config, String key, */ public static S3xLoginHelper.Login getAWSAccessKeys(URI name, Configuration conf) throws IOException { - S3xLoginHelper.rejectSecretsInURIs(name); Configuration c = ProviderUtils.excludeIncompatibleCredentialProviders( conf, S3AFileSystem.class); String bucket = name != null ? name.getHost() : ""; diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/WriteOperationHelper.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/WriteOperationHelper.java index a7a87bdfcfb299..969c1023d73471 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/WriteOperationHelper.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/WriteOperationHelper.java @@ -288,9 +288,7 @@ public String initiateMultiPartUpload( /** * Finalize a multipart PUT operation. - * This completes the upload, and, if that works, calls - * {@link WriteOperationHelperCallbacks#finishedWrite(String, long, PutObjectOptions)} - * to update the filesystem. + * This completes the upload. * Retry policy: retrying, translated. * @param destKey destination of the commit * @param uploadId multipart operation Id @@ -324,8 +322,6 @@ private CompleteMultipartUploadResponse finalizeMultipartUpload( destKey, uploadId, partETags); return writeOperationHelperCallbacks.completeMultipartUpload(requestBuilder.build()); }); - writeOperationHelperCallbacks.finishedWrite(destKey, length, - putOptions); return uploadResult; } } @@ -547,8 +543,6 @@ public void revertCommit(String destKey) throws IOException { /** * This completes a multipart upload to the destination key via * {@code finalizeMultipartUpload()}. - * Markers are never deleted on commit; this avoids having to - * issue many duplicate deletions. * Retry policy: retrying, translated. * Retries increment the {@code errorCount} counter. * @param destKey destination @@ -574,7 +568,7 @@ public CompleteMultipartUploadResponse commitUpload( uploadId, partETags, length, - PutObjectOptions.keepingDirs(), + PutObjectOptions.defaultOptions(), Invoker.NO_OP); } @@ -670,21 +664,6 @@ UploadPartResponse uploadPart( RequestBody body, DurationTrackerFactory durationTrackerFactory) throws AwsServiceException, UncheckedIOException; - - /** - * Perform post-write actions. - *

- * This operation MUST be called after any PUT/multipart PUT completes - * successfully. - * @param key key written to - * @param length total length of file written - * @param putOptions put object options - */ - @Retries.RetryExceptionsSwallowed - void finishedWrite( - String key, - long length, - PutObjectOptions putOptions); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/CredentialProviderListFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/CredentialProviderListFactory.java index 941ce741151d52..c0daa6a3aecf9f 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/CredentialProviderListFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/CredentialProviderListFactory.java @@ -47,7 +47,6 @@ import org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider; import org.apache.hadoop.fs.s3a.adapter.AwsV1BindingSupport; import org.apache.hadoop.fs.s3a.impl.InstantiationIOException; -import org.apache.hadoop.fs.s3native.S3xLoginHelper; import org.apache.hadoop.fs.store.LogExactlyOnce; import static org.apache.hadoop.fs.s3a.Constants.AWS_CREDENTIALS_PROVIDER; @@ -139,15 +138,12 @@ private CredentialProviderListFactory() { public static AWSCredentialProviderList createAWSCredentialProviderList( @Nullable URI binding, Configuration conf) throws IOException { - // this will reject any user:secret entries in the URI - S3xLoginHelper.rejectSecretsInURIs(binding); AWSCredentialProviderList credentials = buildAWSProviderList(binding, conf, AWS_CREDENTIALS_PROVIDER, STANDARD_AWS_PROVIDERS, new HashSet<>()); - // make sure the logging message strips out any auth details LOG.debug("For URI {}, using credentials {}", binding, credentials); return credentials; diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/impl/CommitOperations.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/impl/CommitOperations.java index 14bd4cc2f7da1a..b9fcc1f06f2d82 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/impl/CommitOperations.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/impl/CommitOperations.java @@ -547,7 +547,7 @@ public SinglePendingCommit uploadFileToPendingCommit(File localFile, statistics.commitCreated(); uploadId = writeOperations.initiateMultiPartUpload(destKey, - PutObjectOptions.keepingDirs()); + PutObjectOptions.defaultOptions()); long length = localFile.length(); SinglePendingCommit commitData = new SinglePendingCommit(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/magic/S3MagicCommitTracker.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/magic/S3MagicCommitTracker.java index 1f6c9123bae62a..ecc3496ce8f3a6 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/magic/S3MagicCommitTracker.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/commit/magic/S3MagicCommitTracker.java @@ -79,7 +79,7 @@ public boolean aboutToComplete(String uploadId, PutObjectRequest originalDestPut = getWriter().createPutObjectRequest( getOriginalDestKey(), 0, - new PutObjectOptions(true, null, headers)); + new PutObjectOptions(null, headers)); upload(originalDestPut, EMPTY); // build the commit summary @@ -117,7 +117,7 @@ public boolean aboutToComplete(String uploadId, @Retries.RetryTranslated private void upload(PutObjectRequest request, byte[] bytes) throws IOException { trackDurationOfInvocation(getTrackerStatistics(), COMMITTER_MAGIC_MARKER_PUT.getSymbol(), - () -> getWriter().putObject(request, PutObjectOptions.keepingDirs(), + () -> getWriter().putObject(request, PutObjectOptions.defaultOptions(), new S3ADataBlocks.BlockUploadData(bytes, null), null)); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirMarkerTracker.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirMarkerTracker.java index 9390c699335b79..d4e0b5db388500 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirMarkerTracker.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirMarkerTracker.java @@ -19,7 +19,6 @@ package org.apache.hadoop.fs.s3a.impl; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -267,31 +266,6 @@ public String toString() { '}'; } - /** - * Scan the surplus marker list and remove from it all where the directory - * policy says "keep". This is useful when auditing - * @param policy policy to use when auditing markers for - * inclusion/exclusion. - * @return list of markers stripped - */ - public List removeAllowedMarkers(DirectoryPolicy policy) { - List removed = new ArrayList<>(); - Iterator> entries = - surplusMarkers.entrySet().iterator(); - while (entries.hasNext()) { - Map.Entry entry = entries.next(); - Path path = entry.getKey(); - if (policy.keepDirectoryMarkers(path)) { - // there's a match - // remove it from the map. - entries.remove(); - LOG.debug("Removing {}", entry.getValue()); - removed.add(path); - } - } - return removed; - } - /** * This is a marker entry stored in the map and * returned as markers are deleted. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicy.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicy.java deleted file mode 100644 index 6ba74c7e971d2d..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicy.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3a.impl; - -import org.apache.hadoop.fs.Path; - -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_AUTHORITATIVE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_KEEP; - -/** - * Interface for Directory Marker policies to implement. - */ - -public interface DirectoryPolicy { - - - - /** - * Should a directory marker be retained? - * @param path path a file/directory is being created with. - * @return true if the marker MAY be kept, false if it MUST be deleted. - */ - boolean keepDirectoryMarkers(Path path); - - /** - * Get the marker policy. - * @return policy. - */ - MarkerPolicy getMarkerPolicy(); - - /** - * Describe the policy for marker tools and logs. - * @return description of the current policy. - */ - String describe(); - - /** - * Does a specific path have the relevant option. - * This is to be forwarded from the S3AFileSystem.hasPathCapability - * But only for those capabilities related to markers* - * @param path path - * @param capability capability - * @return true if the capability is supported, false if not - * @throws IllegalArgumentException if the capability is unknown. - */ - boolean hasPathCapability(Path path, String capability); - - /** - * Supported retention policies. - */ - enum MarkerPolicy { - - /** - * Delete markers. - *

- * This is the classic S3A policy, - */ - Delete(DIRECTORY_MARKER_POLICY_DELETE), - - /** - * Keep markers. - *

- * This is Not backwards compatible. - */ - Keep(DIRECTORY_MARKER_POLICY_KEEP), - - /** - * Keep markers in authoritative paths only. - *

- * This is Not backwards compatible within the - * auth paths, but is outside these. - */ - Authoritative(DIRECTORY_MARKER_POLICY_AUTHORITATIVE); - - /** - * The name of the option as allowed in configuration files - * and marker-aware tooling. - */ - private final String optionName; - - MarkerPolicy(final String optionName) { - this.optionName = optionName; - } - - /** - * Get the option name. - * @return name of the option - */ - public String getOptionName() { - return optionName; - } - } -} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicyImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicyImpl.java deleted file mode 100644 index 7d501944308bd4..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/DirectoryPolicyImpl.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3a.impl; - - -import java.util.EnumSet; -import java.util.Locale; -import java.util.Set; -import java.util.function.Predicate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; - -import static org.apache.hadoop.fs.s3a.Constants.DEFAULT_DIRECTORY_MARKER_POLICY; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_AUTHORITATIVE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_KEEP; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_AWARE; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_AUTHORITATIVE; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_KEEP; - -/** - * Implementation of directory policy. - */ -public final class DirectoryPolicyImpl - implements DirectoryPolicy { - - private static final Logger LOG = LoggerFactory.getLogger( - DirectoryPolicyImpl.class); - - /** - * Error string when unable to parse the marker policy option. - */ - public static final String UNKNOWN_MARKER_POLICY = - "Unknown policy in " - + DIRECTORY_MARKER_POLICY + ": "; - - /** - * All available policies. - */ - private static final Set AVAILABLE_POLICIES = - EnumSet.allOf(MarkerPolicy.class); - - /** - * Keep all markers. - */ - public static final DirectoryPolicy KEEP = new DirectoryPolicyImpl( - MarkerPolicy.Keep, (p) -> false); - - /** - * Delete all markers. - */ - public static final DirectoryPolicy DELETE = new DirectoryPolicyImpl( - MarkerPolicy.Delete, (p) -> false); - - /** - * Chosen marker policy. - */ - private final MarkerPolicy markerPolicy; - - /** - * Callback to evaluate authoritativeness of a - * path. - */ - private final Predicate authoritativeness; - - /** - * Constructor. - * @param markerPolicy marker policy - * @param authoritativeness function for authoritativeness - */ - public DirectoryPolicyImpl(final MarkerPolicy markerPolicy, - final Predicate authoritativeness) { - this.markerPolicy = markerPolicy; - this.authoritativeness = authoritativeness; - } - - @Override - public boolean keepDirectoryMarkers(final Path path) { - switch (markerPolicy) { - case Keep: - return true; - case Authoritative: - return authoritativeness.test(path); - case Delete: - default: // which cannot happen - return false; - } - } - - @Override - public MarkerPolicy getMarkerPolicy() { - return markerPolicy; - } - - @Override - public String describe() { - return markerPolicy.getOptionName(); - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder( - "DirectoryMarkerRetention{"); - sb.append("policy='").append(markerPolicy.getOptionName()).append('\''); - sb.append('}'); - return sb.toString(); - } - - /** - * Return path policy for store and paths. - * @param path path - * @param capability capability - * @return true if a capability is active - */ - @Override - public boolean hasPathCapability(final Path path, final String capability) { - - switch (capability) { - /* - * Marker policy is dynamically determined for the given path. - */ - case STORE_CAPABILITY_DIRECTORY_MARKER_AWARE: - return true; - - case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_KEEP: - return markerPolicy == MarkerPolicy.Keep; - - case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_DELETE: - return markerPolicy == MarkerPolicy.Delete; - - case STORE_CAPABILITY_DIRECTORY_MARKER_POLICY_AUTHORITATIVE: - return markerPolicy == MarkerPolicy.Authoritative; - - case STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP: - return keepDirectoryMarkers(path); - - case STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE: - return !keepDirectoryMarkers(path); - - default: - throw new IllegalArgumentException("Unknown capability " + capability); - } - } - - /** - * Create/Get the policy for this configuration. - * @param conf config - * @param authoritativeness Callback to evaluate authoritativeness of a - * path. - * @return a policy - */ - public static DirectoryPolicy getDirectoryPolicy( - final Configuration conf, - final Predicate authoritativeness) { - DirectoryPolicy policy; - String option = conf.getTrimmed(DIRECTORY_MARKER_POLICY, - DEFAULT_DIRECTORY_MARKER_POLICY); - switch (option.toLowerCase(Locale.ENGLISH)) { - case DIRECTORY_MARKER_POLICY_DELETE: - // backwards compatible. - LOG.debug("Directory markers will be deleted"); - policy = DELETE; - break; - case DIRECTORY_MARKER_POLICY_KEEP: - LOG.debug("Directory markers will be kept"); - policy = KEEP; - break; - case DIRECTORY_MARKER_POLICY_AUTHORITATIVE: - LOG.debug("Directory markers will be kept on authoritative" - + " paths"); - policy = new DirectoryPolicyImpl(MarkerPolicy.Authoritative, - authoritativeness); - break; - default: - throw new IllegalArgumentException(UNKNOWN_MARKER_POLICY + option); - } - return policy; - } - - /** - * Enumerate all available policies. - * @return set of the policies. - */ - public static Set availablePolicies() { - return AVAILABLE_POLICIES; - } - -} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MkdirOperation.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MkdirOperation.java index a027cabffd46d8..a2d79271a8a679 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MkdirOperation.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MkdirOperation.java @@ -145,8 +145,7 @@ public Boolean execute() throws IOException { // If so, we declare success without looking any further if (isMagicPath) { // Create the marker file immediately, - // and don't delete markers - callbacks.createFakeDirectory(dir, true); + callbacks.createFakeDirectory(dir); return true; } @@ -159,9 +158,8 @@ public Boolean execute() throws IOException { // if we get here there is no directory at the destination. // so create one. - // Create the marker file, delete the parent entries - // if the filesystem isn't configured to retain them - callbacks.createFakeDirectory(dir, false); + // Create the directory marker file + callbacks.createFakeDirectory(dir); return true; } @@ -264,15 +262,10 @@ S3AFileStatus probePathStatus(Path path, /** * Create a fake directory, always ending in "/". * Retry policy: retrying; translated. - * the keepMarkers flag controls whether or not markers - * are automatically kept (this is set when creating - * directories under a magic path, always) * @param dir dir to create - * @param keepMarkers always keep markers - * * @throws IOException IO failure */ @Retries.RetryTranslated - void createFakeDirectory(Path dir, boolean keepMarkers) throws IOException; + void createFakeDirectory(Path dir) throws IOException; } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/PutObjectOptions.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/PutObjectOptions.java index e14285a1ca8b12..1ca502c44cde64 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/PutObjectOptions.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/PutObjectOptions.java @@ -26,11 +26,6 @@ */ public final class PutObjectOptions { - /** - * Can the PUT operation skip marker deletion? - */ - private final boolean keepMarkers; - /** * Storage class, if not null. */ @@ -43,27 +38,16 @@ public final class PutObjectOptions { /** * Constructor. - * @param keepMarkers Can the PUT operation skip marker deletion? * @param storageClass Storage class, if not null. * @param headers Headers; may be null. */ public PutObjectOptions( - final boolean keepMarkers, @Nullable final String storageClass, @Nullable final Map headers) { - this.keepMarkers = keepMarkers; this.storageClass = storageClass; this.headers = headers; } - /** - * Get the marker retention flag. - * @return true if markers are to be retained. - */ - public boolean isKeepMarkers() { - return keepMarkers; - } - /** * Headers for the put/post request. * @return headers or null. @@ -75,30 +59,22 @@ public Map getHeaders() { @Override public String toString() { return "PutObjectOptions{" + - "keepMarkers=" + keepMarkers + ", storageClass='" + storageClass + '\'' + '}'; } - private static final PutObjectOptions KEEP_DIRS = new PutObjectOptions(true, - null, null); - private static final PutObjectOptions DELETE_DIRS = new PutObjectOptions(false, - null, null); - /** - * Get the options to keep directories. - * @return an instance which keeps dirs + * Empty options. */ - public static PutObjectOptions keepingDirs() { - return KEEP_DIRS; - } + private static final PutObjectOptions EMPTY_OPTIONS = new PutObjectOptions( + null, null); /** - * Get the options to delete directory markers. - * @return an instance which deletes dirs + * Get the default options. + * @return an instance with no storage class or headers. */ - public static PutObjectOptions deletingDirs() { - return DELETE_DIRS; + public static PutObjectOptions defaultOptions() { + return EMPTY_OPTIONS; } } \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AMultipartUploader.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AMultipartUploader.java index e00319c3dc581a..32d7faad856e54 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AMultipartUploader.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AMultipartUploader.java @@ -128,7 +128,7 @@ public CompletableFuture startUpload( return context.submit(new CompletableFuture<>(), trackDurationOfCallable(statistics, OBJECT_MULTIPART_UPLOAD_INITIATED.getSymbol(), () -> { String uploadId = writeOperations.initiateMultiPartUpload(key, - PutObjectOptions.keepingDirs()); + PutObjectOptions.defaultOptions()); statistics.uploadStarted(); return BBUploadHandle.from(ByteBuffer.wrap( uploadId.getBytes(StandardCharsets.UTF_8))); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java index 5e3e5dcab77d48..83d6d92c95ea34 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java @@ -121,12 +121,6 @@ public static boolean checkNoS3Guard(URI fsURI, Configuration conf) throws PathI return true; } - public static Collection getAuthoritativePaths(S3AFileSystem fs) { - return getAuthoritativePaths( - fs.getUri(), - fs.getConf(), - p -> fs.maybeAddTrailingSlash(fs.qualify(p).toString())); - } /** * Get the authoritative paths of a filesystem. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java index 57fd879c38cf60..4e691ff10009f9 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java @@ -25,15 +25,13 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; -import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Scanner; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import software.amazon.awssdk.services.s3.model.MultipartUpload; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,8 +53,6 @@ import org.apache.hadoop.fs.s3a.auth.delegation.S3ADelegationTokens; import org.apache.hadoop.fs.s3a.commit.CommitConstants; import org.apache.hadoop.fs.s3a.commit.InternalCommitterConstants; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicy; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicyImpl; import org.apache.hadoop.fs.s3a.select.SelectConstants; import org.apache.hadoop.fs.s3a.tools.BucketTool; import org.apache.hadoop.fs.s3a.tools.MarkerTool; @@ -389,8 +385,7 @@ public static class BucketInfo extends S3GuardTool { @VisibleForTesting public static final String IS_MARKER_AWARE = - "\tThe S3A connector is compatible with buckets where" - + " directory markers are not deleted"; + "\tThe S3A connector does not delete markers"; public static final String CAPABILITY_FORMAT = "\t%s %s%n"; @@ -446,16 +441,6 @@ public int run(String[] args, PrintStream out) fs.listXAttrs(new Path("/")); } - // print any auth paths for directory marker info - final Collection authoritativePaths - = S3Guard.getAuthoritativePaths(fs); - if (!authoritativePaths.isEmpty()) { - println(out, "Qualified Authoritative Paths:"); - for (String path : authoritativePaths) { - println(out, "\t%s", path); - } - println(out, ""); - } println(out, "%nS3A Client"); printOption(out, "\tSigning Algorithm", SIGNING_ALGORITHM, "(unset)"); String endpoint = conf.getTrimmed(ENDPOINT, ""); @@ -556,7 +541,7 @@ public int run(String[] args, PrintStream out) } // directory markers - processMarkerOption(out, fs, + processMarkerOption(out, getCommandFormat().getOptValue(MARKERS_FLAG)); // and check for capabilities @@ -583,43 +568,29 @@ public int run(String[] args, PrintStream out) /** * Validate the marker options. * @param out output stream - * @param fs filesystem * @param marker desired marker option -may be null. */ private void processMarkerOption(final PrintStream out, - final S3AFileSystem fs, final String marker) { - println(out, "%nDirectory Markers"); - DirectoryPolicy markerPolicy = fs.getDirectoryMarkerPolicy(); - String desc = markerPolicy.describe(); - println(out, "\tThe directory marker policy is \"%s\"", desc); - - String pols = DirectoryPolicyImpl.availablePolicies() - .stream() - .map(DirectoryPolicy.MarkerPolicy::getOptionName) - .collect(Collectors.joining(", ")); - println(out, "\tAvailable Policies: %s", pols); - printOption(out, "\tAuthoritative paths", - AUTHORITATIVE_PATH, ""); - DirectoryPolicy.MarkerPolicy mp = markerPolicy.getMarkerPolicy(); + println(out, "%nThis version of Hadoop always retains directory markers"); + String desiredMarker = marker == null ? "" - : marker.trim(); - final String optionName = mp.getOptionName(); - if (!desiredMarker.isEmpty()) { - if (MARKERS_AWARE.equalsIgnoreCase(desiredMarker)) { - // simple awareness test -provides a way to validate compatibility - // on the command line - println(out, IS_MARKER_AWARE); - } else { - // compare with current policy - if (!optionName.equalsIgnoreCase(desiredMarker)) { - throw badState("Bucket %s: required marker policy is \"%s\"" - + " but actual policy is \"%s\"", - fs.getUri(), desiredMarker, optionName); - } - } + : marker.trim().toLowerCase(Locale.ROOT); + switch(desiredMarker) { + case "": + case DIRECTORY_MARKER_POLICY_KEEP: + break; + + case MARKERS_AWARE: + // simple awareness test -provides a way to validate compatibility + // on the command line + println(out, IS_MARKER_AWARE); + break; + + default: + throw badState("Unsupported Marker Policy \"%s\"", desiredMarker); } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java index b2ff63b39865b3..0c396f2f5c9ced 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/tools/MarkerTool.java @@ -53,8 +53,6 @@ import org.apache.hadoop.fs.s3a.S3ALocatedFileStatus; import org.apache.hadoop.fs.s3a.UnknownStoreException; import org.apache.hadoop.fs.s3a.impl.DirMarkerTracker; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicy; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicyImpl; import org.apache.hadoop.fs.s3a.impl.MultiObjectDeleteException; import org.apache.hadoop.fs.s3a.impl.StoreContext; import org.apache.hadoop.fs.s3a.s3guard.S3GuardTool; @@ -62,8 +60,6 @@ import org.apache.hadoop.util.DurationInfo; import org.apache.hadoop.util.ExitUtil; - -import static org.apache.hadoop.fs.s3a.Constants.AUTHORITATIVE_PATH; import static org.apache.hadoop.fs.s3a.Constants.BULK_DELETE_PAGE_SIZE; import static org.apache.hadoop.fs.s3a.Constants.BULK_DELETE_PAGE_SIZE_DEFAULT; import static org.apache.hadoop.fs.s3a.Invoker.once; @@ -175,7 +171,6 @@ public final class MarkerTool extends S3GuardTool { + " [-" + OPT_MAX + " ]" + " [-" + OPT_OUT + " ]" + " [-" + OPT_LIMIT + " ]" - + " [-" + OPT_NONAUTH + "]" + " [-" + VERBOSE + "]" + " \n" @@ -207,8 +202,7 @@ public MarkerTool(final Configuration conf) { super(conf, OPT_AUDIT, OPT_CLEAN, - VERBOSE, - OPT_NONAUTH); + VERBOSE); CommandFormat format = getCommandFormat(); format.addOptionWithValue(OPT_MIN); format.addOptionWithValue(OPT_MAX); @@ -275,7 +269,6 @@ public int run(final String[] args, final PrintStream stream) path = new Path(path, "/"); } FileSystem fs = path.getFileSystem(getConf()); - boolean nonAuth = command.getOpt(OPT_NONAUTH); ScanResult result; try { result = execute( @@ -286,7 +279,6 @@ public int run(final String[] args, final PrintStream stream) .withMinMarkerCount(expectedMin) .withMaxMarkerCount(expectedMax) .withLimit(limit) - .withNonAuth(nonAuth) .build()); } catch (UnknownStoreException ex) { // bucket doesn't exist. @@ -356,21 +348,6 @@ ScanResult execute(final ScanArgs scanArgs) // extract the callbacks needed for the rest of the work storeContext = fs.createStoreContext(); - // filesystem policy. - // if the -nonauth option is set, this is used to filter - // out surplus markers from the results. - DirectoryPolicy activePolicy = fs.getDirectoryMarkerPolicy(); - DirectoryPolicy.MarkerPolicy policy = activePolicy - .getMarkerPolicy(); - println(out, "The directory marker policy of %s is \"%s\"", - storeContext.getFsURI(), - policy); - String authPath = storeContext.getConfiguration() - .getTrimmed(AUTHORITATIVE_PATH, ""); - if (policy == DirectoryPolicy.MarkerPolicy.Authoritative) { - // in auth mode, note the auth paths. - println(out, "Authoritative path list is \"%s\"", authPath); - } // qualify the path Path path = scanArgs.getPath(); Path target = path.makeQualified(fs.getUri(), new Path("/")); @@ -389,26 +366,8 @@ ScanResult execute(final ScanArgs scanArgs) } // the default filter policy is that all entries should be deleted - DirectoryPolicy filterPolicy; - if (scanArgs.isNonAuth()) { - filterPolicy = new DirectoryPolicyImpl( - DirectoryPolicy.MarkerPolicy.Authoritative, - fs::allowAuthoritative); - } else { - filterPolicy = null; - } int minMarkerCount = scanArgs.getMinMarkerCount(); int maxMarkerCount = scanArgs.getMaxMarkerCount(); - if (minMarkerCount > maxMarkerCount) { - // swap min and max if they are wrong. - // this is to ensure any test scripts written to work around - // HADOOP-17332 and min/max swapping continue to work. - println(out, "Swapping -min (%d) and -max (%d) values", - minMarkerCount, maxMarkerCount); - int m = minMarkerCount; - minMarkerCount = maxMarkerCount; - maxMarkerCount = m; - } // extract the callbacks needed for the rest of the work operations = fs.createMarkerToolOperations( target.toString()); @@ -416,8 +375,8 @@ ScanResult execute(final ScanArgs scanArgs) scanArgs.isDoPurge(), minMarkerCount, maxMarkerCount, - scanArgs.getLimit(), - filterPolicy); + scanArgs.getLimit() + ); } /** @@ -520,7 +479,6 @@ public int finish() throws ExitUtil.ExitException { * @param minMarkerCount min marker count (ignored on purge) * @param maxMarkerCount max marker count (ignored on purge) * @param limit limit of files to scan; 0 for 'unlimited' - * @param filterPolicy filter policy on a nonauth scan; may be null * @return result. * @throws IOException IO failure * @throws ExitUtil.ExitException explicitly raised failure @@ -531,8 +489,7 @@ private ScanResult scan( final boolean doPurge, final int minMarkerCount, final int maxMarkerCount, - final int limit, - final DirectoryPolicy filterPolicy) + final int limit) throws IOException, ExitUtil.ExitException { // safety check: min and max are correctly ordered at this point. @@ -598,21 +555,6 @@ private ScanResult scan( result.purgeSummary = purgeMarkers(tracker, deletePageSize); } else { // this is an audit, so validate the marker count - - if (filterPolicy != null) { - // if a filter policy is supplied, filter out all markers - // under the auth path - List allowed = tracker.removeAllowedMarkers(filterPolicy); - int allowedMarkers = allowed.size(); - println(out, "%nIgnoring %d marker%s in authoritative paths", - allowedMarkers, suffix(allowedMarkers)); - if (verbose) { - allowed.forEach(p -> println(out, p.toString())); - } - // recalculate the marker size - markerCount = surplusMarkers.size(); - result.filteredMarkerCount = markerCount; - } if (markerCount < minMarkerCount || markerCount > maxMarkerCount) { // failure return failScan(result, EXIT_NOT_ACCEPTABLE, @@ -902,9 +844,6 @@ public static final class ScanArgs { /** Limit of files to scan; 0 for 'unlimited'. */ private final int limit; - /** Consider only markers in nonauth paths as errors. */ - private final boolean nonAuth; - /** * @param sourceFS source FS; must be or wrap an S3A FS. * @param path path to scan. @@ -912,22 +851,19 @@ public static final class ScanArgs { * @param minMarkerCount min marker count (ignored on purge) * @param maxMarkerCount max marker count (ignored on purge) * @param limit limit of files to scan; 0 for 'unlimited' - * @param nonAuth consider only markers in nonauth paths as errors */ private ScanArgs(final FileSystem sourceFS, final Path path, final boolean doPurge, final int minMarkerCount, final int maxMarkerCount, - final int limit, - final boolean nonAuth) { + final int limit) { this.sourceFS = sourceFS; this.path = path; this.doPurge = doPurge; this.minMarkerCount = minMarkerCount; this.maxMarkerCount = maxMarkerCount; this.limit = limit; - this.nonAuth = nonAuth; } FileSystem getSourceFS() { @@ -954,9 +890,6 @@ int getLimit() { return limit; } - boolean isNonAuth() { - return nonAuth; - } } /** @@ -982,9 +915,6 @@ public static final class ScanArgsBuilder { /** Limit of files to scan; 0 for 'unlimited'. */ private int limit = UNLIMITED_LISTING; - /** Consider only markers in nonauth paths as errors. */ - private boolean nonAuth = false; - /** * Source FS; must be or wrap an S3A FS. * @param source Source FileSystem @@ -1045,16 +975,6 @@ public ScanArgsBuilder withLimit(final int l) { return this; } - /** - * Consider only markers in non-authoritative paths as errors. - * @param b True if tool should only consider markers in non-authoritative paths - * @return builder class for method chaining - */ - public ScanArgsBuilder withNonAuth(final boolean b) { - this.nonAuth = b; - return this; - } - /** * Build the actual argument instance. * @return the arguments to pass in @@ -1065,8 +985,7 @@ public ScanArgs build() { doPurge, minMarkerCount, maxMarkerCount, - limit, - nonAuth); + limit); } } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java deleted file mode 100644 index 5a7129f7d5c963..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/NativeS3FileSystem.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3native; - -import java.io.IOException; -import java.net.URI; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.hadoop.classification.InterfaceAudience; -import org.apache.hadoop.classification.InterfaceStability; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FSDataInputStream; -import org.apache.hadoop.fs.FSDataOutputStream; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.permission.FsPermission; -import org.apache.hadoop.util.Progressable; - -/** - * This is a stub filesystem purely present to fail meaningfully when - * someone who explicitly declares - * {@code fs.s3n.impl=org.apache.hadoop.fs.s3native.NativeS3FileSystem} - * and then tries to create a filesystem off an s3n:// URL. - * - * The {@link #initialize(URI, Configuration)} method will throw - * an IOException informing the user of their need to migrate. - * @deprecated Replaced by the S3A client. - */ -@InterfaceAudience.Public -@InterfaceStability.Stable -public final class NativeS3FileSystem extends FileSystem { - - public static final Logger LOG = - LoggerFactory.getLogger(NativeS3FileSystem.class); - - /** - * Message in thrown exceptions: {@value}. - */ - private static final String UNSUPPORTED = - "The s3n:// client to Amazon S3 is no longer available:" - + " please migrate to the s3a:// client"; - - public NativeS3FileSystem() { - } - - /** - * Return the protocol scheme for the FileSystem. - * - * @return s3n - */ - @Override - public String getScheme() { - return "s3n"; - } - - /** - * Always fail to initialize. - * @throws IOException always. - */ - @Override - public void initialize(URI uri, Configuration conf) throws IOException { - super.initialize(uri, conf); - throw new IOException(UNSUPPORTED); - } - - @Override - public FileStatus getFileStatus(Path f) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public URI getUri() { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public FSDataInputStream open(Path f, int bufferSize) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public FSDataOutputStream create(Path f, - FsPermission permission, - boolean overwrite, - int bufferSize, - short replication, - long blockSize, - Progressable progress) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public FSDataOutputStream append(Path f, - int bufferSize, - Progressable progress) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public boolean rename(Path src, Path dst) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public boolean delete(Path f, boolean recursive) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public FileStatus[] listStatus(Path f) - throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public void setWorkingDirectory(Path new_dir) { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public Path getWorkingDirectory() { - throw new UnsupportedOperationException(UNSUPPORTED); - } - - @Override - public boolean mkdirs(Path f, FsPermission permission) throws IOException { - throw new UnsupportedOperationException(UNSUPPORTED); - } -} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/S3xLoginHelper.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/S3xLoginHelper.java index b1a8c968802378..f10f28d9f7b01b 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/S3xLoginHelper.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3native/S3xLoginHelper.java @@ -22,11 +22,6 @@ import java.net.URISyntaxException; import java.util.Objects; -import org.apache.hadoop.classification.VisibleForTesting; -import org.apache.hadoop.util.Preconditions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -41,9 +36,8 @@ * It is in S3N so that it can be used across all S3 filesystems. * * The core function of this class was the extraction and decoding of user:secret - * information from filesystems URIs. As this is no longer supported, - * its role has been reduced to checking for secrets in the URI and rejecting - * them where found. + * information from filesystems URIs. + * All that is left now is some URI canonicalization and checking. */ @InterfaceAudience.Private @InterfaceStability.Evolving @@ -52,87 +46,20 @@ public final class S3xLoginHelper { private S3xLoginHelper() { } - public static final String LOGIN_WARNING = - "The Filesystem URI contains login details." - +" This authentication mechanism is no longer supported."; - /** * Build the filesystem URI. * @param uri filesystem uri * @return the URI to use as the basis for FS operation and qualifying paths. - * @throws IllegalArgumentException if the URI is in some way invalid. + * @throws NullPointerException if the URI has null parts. */ public static URI buildFSURI(URI uri) { // look for login secrets and fail if they are present. - rejectSecretsInURIs(uri); Objects.requireNonNull(uri, "null uri"); Objects.requireNonNull(uri.getScheme(), "null uri.getScheme()"); - if (uri.getHost() == null && uri.getAuthority() != null) { - Objects.requireNonNull(uri.getHost(), "null uri host."); - } Objects.requireNonNull(uri.getHost(), "null uri host."); return URI.create(uri.getScheme() + "://" + uri.getHost()); } - /** - * Create a stripped down string value for error messages. - * @param pathUri URI - * @return a shortened schema://host/path value - */ - public static String toString(URI pathUri) { - return pathUri != null - ? String.format("%s://%s/%s", - pathUri.getScheme(), pathUri.getHost(), pathUri.getPath()) - : "(null URI)"; - } - - /** - * Extract the login details from a URI, raising an exception if - * the URI contains them. - * @param name URI of the filesystem, can be null - * @throws IllegalArgumentException if there is a secret in the URI. - */ - public static void rejectSecretsInURIs(URI name) { - Login login = extractLoginDetails(name); - Preconditions.checkArgument(!login.hasLogin(), LOGIN_WARNING); - } - - /** - * Extract the login details from a URI. - * @param name URI of the filesystem, may be null - * @return a login tuple, possibly empty. - */ - @VisibleForTesting - static Login extractLoginDetails(URI name) { - if (name == null) { - return Login.EMPTY; - } - - String authority = name.getAuthority(); - if (authority == null) { - return Login.EMPTY; - } - int loginIndex = authority.indexOf('@'); - if (loginIndex < 0) { - // no login - return Login.EMPTY; - } - String login = authority.substring(0, loginIndex); - int loginSplit = login.indexOf(':'); - if (loginSplit > 0) { - String user = login.substring(0, loginSplit); - String encodedPassword = login.substring(loginSplit + 1); - return new Login(user, encodedPassword.isEmpty()? "": "password removed"); - } else if (loginSplit == 0) { - // there is no user, just a password. In this case, there's no login - return Login.EMPTY; - } else { - // loginSplit < 0: there is no ":". - // return a login with a null password - return new Login(login, ""); - } - } - /** * Canonicalize the given URI. * @@ -164,8 +91,7 @@ public static URI canonicalizeUri(URI uri, int defaultPort) { /** * Check the path, ignoring authentication details. - * See {@link FileSystem#checkPath(Path)} for the operation of this. - * + * See {@code FileSystem.checkPath(Path)} for the operation of this. * Essentially *

    *
  1. The URI is canonicalized.
  2. @@ -221,8 +147,7 @@ public static void checkPath(Configuration conf, } // make sure the exception strips out any auth details throw new IllegalArgumentException( - "Wrong FS " + S3xLoginHelper.toString(pathUri) - + " -expected " + fsUri); + "Wrong FS " + pathUri + " -expected " + fsUri); } /** @@ -232,8 +157,6 @@ public static class Login { private final String user; private final String password; - public static final Login EMPTY = new Login(); - /** * Create an instance with no login details. * Calls to {@link #hasLogin()} return false. diff --git a/hadoop-tools/hadoop-aws/src/main/resources/META-INF/services/org.apache.hadoop.fs.FileSystem b/hadoop-tools/hadoop-aws/src/main/resources/META-INF/services/org.apache.hadoop.fs.FileSystem deleted file mode 100644 index 1938bdefa4107e..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/resources/META-INF/services/org.apache.hadoop.fs.FileSystem +++ /dev/null @@ -1,16 +0,0 @@ -# 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. - -org.apache.hadoop.fs.s3native.NativeS3FileSystem diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/assumed_roles.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/assumed_roles.md index ba1bc4b362c476..c226000d99a3af 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/assumed_roles.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/assumed_roles.md @@ -295,13 +295,10 @@ views or operations. Particular troublespots are "directory markers" and failures of non-atomic operations, particularly `rename()` and `delete()`. -A directory marker such as `/users/` will not be deleted if the user `alice` -creates a directory `/users/alice` *and* she only has access to `/users/alice`. - -When a path or directory is deleted, the parent directory may not exist afterwards. -In the example above, if `alice` deletes `/users/alice` and there are no -other entries under `/users/alice`, then the directory marker `/users/` cannot -be created. The directory `/users` will not exist in listings, +If `alice` deletes `/users/alice` and there are no +other entries under `/users/alice`, or a directory marker `/users` then that +directory marker cannot be created. +The directory `/users` will not exist in listings, `getFileStatus("/users")` or similar. Rename will fail if it cannot delete the items it has just copied, that is diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/directory_markers.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/directory_markers.md index 4e31edfbbb7573..1a2a0aa852f1be 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/directory_markers.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/directory_markers.md @@ -12,112 +12,104 @@ limitations under the License. See accompanying LICENSE file. --> -# Controlling the S3A Directory Marker Behavior +# S3A Directory Marker Behavior -This document discusses a performance feature of the S3A -connector: directory markers are not deleted unless the -client is explicitly configured to do so. - -## Critical: this is not backwards compatible! +This document discusses directory markers and a change to the S3A +connector: surplus directory markers are no longer deleted. This document shows how the performance of S3 I/O, especially applications creating many files (for example Apache Hive) or working with versioned S3 buckets can increase performance by changing the S3A directory marker retention policy. -The default policy in this release of hadoop is "keep", -which _is not backwards compatible_ with hadoop versions +This release always retains markers +and _is potentially not backwards compatible_ with hadoop versions released before 2021. The compatibility table of older releases is as follows: -| Branch | Compatible Since | Supported | Released | -|------------|------------------|-----------|----------| -| Hadoop 2.x | 2.10.2 | Read-only | 05/2022 | -| Hadoop 3.0 | n/a | WONTFIX | | -| Hadoop 3.1 | n/a | WONTFIX | | -| Hadoop 3.2 | 3.2.2 | Read-only | 01/2022 | -| Hadoop 3.3 | 3.3.1 | Done | 01/2021 | +| Branch | Compatible Since | Support | Released | +|------------|------------------|---------------------------------------|----------| +| Hadoop 2.x | 2.10.2 | Partial | 05/2022 | +| Hadoop 3.0 | n/a | WONTFIX | | +| Hadoop 3.1 | n/a | WONTFIX | | +| Hadoop 3.2 | 3.2.2 | Partial | 01/2022 | +| Hadoop 3.3 | 3.3.1 | Full: deletion is enabled | 01/2021 | +| Hadoop 3.4 | 3.4.0 | Full: deletion is disabled | 03/2024 | +| Hadoop 3.5 | 3.5.0 | Full: markers will always be retained | | +*Full* -*WONTFIX* +These releases are full marker-aware and will (possibly only optionally) +not delete them on file/dir creation. -The Hadoop 3.0 and 3.1 lines will have no further releases, so will -not be upgraded. -The compatibility patch "HADOOP-17199. S3A Directory Marker HADOOP-13230 backport" -is present in both source code branches, for anyone wishing to make a private -release. +*Partial* -*Read-only* +These branches have partial compatibility, and are safe to use with hadoop versions +that do not delete markers. -These branches have read-only compatibility. - -* They may list directories with directory markers, and correctly identify when +* They can list directories with surplus directory markers, and correctly identify when such directories have child entries. -* They will open files under directories with such markers. - -## How to re-enable backwards compatibility +* They can open files under directories with such markers. +* They will always delete parent directory markers when creating their own files and directories. -The option `fs.s3a.directory.marker.retention` can be changed to "delete" to re-enable -the original policy. +All these branches are no longer supported by Apache for bugs and security fixes +-users should upgrade to more recent versions for those reasons alone. -```xml - - fs.s3a.directory.marker.retention - delete - -``` -## Verifying read compatibility. +*WONTFIX* -The `s3guard bucket-info` tool [can be used to verify support](#bucket-info). -This allows for a command line check of compatibility, including -in scripts. +These stores may misinterpret a surplus directory marker for an empty directory. +This does not happen on listing, but it may be misinterpreted on rename operations. -External Hadoop-based applications should also be assumed to be incompatible -unless otherwise stated/known. +The compatibility patch "HADOOP-17199. S3A Directory Marker HADOOP-13230 backport" +is present in both the Hadoop 3.0.x and 3.1.x source branches, for anyone wishing to make a private +release. +However, there will be no further Apache releases of the obsolete branches. -It is only safe change the directory marker policy if the following - conditions are met: +Everyone using these branches should upgrade to a supported version. -1. You know exactly which applications are writing to and reading from - (including backing up) an S3 bucket. -2. You know all applications which read data from the bucket are compatible. +## History +### Hadoop 3.3.1 Directory marker retention is optional -### Applications backing up data. +[HADOOP-13230](https://issues.apache.org/jira/browse/HADOOP-13230) + _S3A to optionally retain directory markers_ -It is not enough to have a version of Apache Hadoop which is compatible, any -application which backs up an S3 bucket or copies elsewhere must have an S3 -connector which is compatible. For the Hadoop codebase, that means that if -distcp is used, it _must_ be from a compatible hadoop version. +### Hadoop 3.4.0: markers are not deleted by default -### How will incompatible applications/versions fail? +[HADOOP-18752](https://issues.apache.org/jira/browse/HADOOP-18752) +_Change fs.s3a.directory.marker.retention to "keep"_ changed the default +policy. -Applications using an incompatible version of the S3A connector will mistake -directories containing data for empty directories. This means that: +Marker deletion can still be enabled. -* Listing directories/directory trees may exclude files which exist. -* Queries across the data will miss data files. -* Renaming a directory to a new location may exclude files underneath. +Since this release there have been no reports of incompatibilities +surfacing "in the wild". That is: out of date hadoop versions are not +being used to work into the same parts of S3 buckets as modern releases. -The failures are silent: there is no error message, stack trace or -other warning that files may have been missed. They simply aren't -found. +### Hadoop 3.5: markers are never deleted -### If an application has updated a directory tree incompatibly-- what can be done? +[HADOOP-19278](https://issues.apache.org/jira/browse/HADOOP-19278) +_S3A: remove option to delete directory markers_ -There's a tool on the hadoop command line, [marker tool](#marker-tool) which can audit -a bucket/path for markers, and clean up any markers which were found. -It can be used to make a bucket compatible with older applications. +Surplus directory markers are neither checked for nor deleted. -Now that this is all clear, let's explain the problem. +Removing the option to delete markers simplifies the code and significantly improves testing: +* There is no need to parameterize many tests based on the marker policy. +* Tests which make assertions about the number of http requests which take places no longer have to + contain separate assertions for the keeping/deleting options. +Notes +* During the directory tree copy which takes place in a rename, surplus directory +markers are not copied. They are, after all, surplus. +* The `hadoop s3guard markers` command (see below) can purge directory markers from a bucket or path. ## Background: Directory Markers: what and why? -Amazon S3 is not a filesystem, it is an object store. +Amazon S3 is not a Posix-like filesystem, it is an object store. The S3A connector not only provides a hadoop-compatible API to interact with -data in S3, it tries to maintain the filesystem metaphor. +data in S3, it tries to maintain the filesystem metaphor for applications +written to expect it. One key aspect of the metaphor of a file system is "directories" @@ -157,7 +149,6 @@ returned) 1. Files and other directories can be created in it. - Lots of code contains a big assumption here: after you create a directory it exists. They also assume that after files in a directory are deleted, the directory still exists. @@ -172,10 +163,13 @@ in `_$folder$` was considered to be a sign that a directory existed. A call to The S3A also has directory markers, but it just appends a "/" to the directory name, so `mkdir(s3a://bucket/a/b)` will create a new marker object `a/b/` . -When a file is created under a path, the directory marker is deleted. And when a -file is deleted, if it was the last file in the directory, the marker is +In older versions of Hadoop, when a file was created under a path, +the directory marker is deleted. And when a file is deleted, +if it was the last file in the directory, the marker is recreated. +This release does not delete directory markers. + And, historically, when a path is listed, if a marker to that path is found, *it has been interpreted as an empty directory.* @@ -186,11 +180,11 @@ It is that little detail which is the cause of the incompatibility issues. Creating, deleting and the listing directory markers adds overhead and can slow down applications. -Whenever a file is created we have to delete any marker which could exist in +Whenever a file is created the S3A client had to delete any marker which could exist in the parent directory _or any parent paths_. Rather than do a sequence of probes for -parent markers existing, the connector issues a single request to S3 to delete +parent markers existing, the connector issued a single request to S3 to delete all parents. For example, if a file `/a/b/file1` is created, a multi-object -`DELETE` request containing the keys `/a/` and `/a/b/` is issued. +`DELETE` request containing the keys `/a/` and `/a/b/` was issued. If no markers exists, this is harmless. When a file is deleted, a check for the parent directory continuing to exist @@ -226,182 +220,21 @@ The tombstone markers have follow-on consequences -it makes listings against S3 versioned buckets slower. This can have adverse effects on those large directories, again. -## Strategies to avoid marker-related problems. - -### Presto: every path is a directory - -In the Presto [S3 connector](https://prestodb.io/docs/current/connector/hive.html#amazon-s3-configuration), -`mkdirs()` is a no-op. -Whenever it lists any path which isn't an object or a prefix of one more objects, it returns an -empty listing. That is:; by default, every path is an empty directory. - -Provided no code probes for a directory existing and fails if it is there, this -is very efficient. That's a big requirement however, -one Presto can pull off -because they know how their file uses data in S3. - - -### Hadoop 3.3.1+: marker deletion is now optional - -From Hadoop 3.3.1 onwards, the S3A client can be configured to skip deleting -directory markers when creating files under paths. This removes all scalability -problems caused by deleting these markers -however, it is achieved at the expense -of backwards compatibility. - -## Controlling marker retention with `fs.s3a.directory.marker.retention` - -There is now an option `fs.s3a.directory.marker.retention` which controls how -markers are managed when new files are created - -1. `delete`: a request is issued to delete any parental directory markers -whenever a file or directory is created. -2. `keep`: No delete request is issued. -Any directory markers which exist are not deleted. -This is *not* backwards compatible -3. `authoritative`: directory markers are deleted _except for files created -in "authoritative" directories_. This is backwards compatible _outside authoritative directories_. - -The setting, `fs.s3a.directory.marker.retention = delete` is compatible with -every shipping Hadoop release; that of `keep` compatible with -all releases since 2021. - -## Directory Markers and Authoritative paths - - -The now-deleted S3Guard feature included the concept of "authoritative paths"; -paths where all clients were required to be using S3Guard and sharing the -same metadata store. -In such a setup, listing authoritative paths would skip all queries of the S3 -store -potentially being much faster. - -In production, authoritative paths were usually only ever for Hive managed -tables, where access was strictly restricted to the Hive services. - - -When the S3A client is configured to treat some directories as "Authoritative" -then an S3A connector with a retention policy of `fs.s3a.directory.marker.retention` of -`authoritative` will omit deleting markers in authoritative directories. - -```xml - - fs.s3a.bucket.hive.authoritative.path - /tables - -``` -This an option to consider if not 100% confident that all -applications interacting with a store are using an S3A client -which is marker aware. - ## Verifying marker policy with `s3guard bucket-info` -The `bucket-info` command has been enhanced to support verification from the command +Although it is now moot, the `bucket-info` command has been enhanced to support verification from the command line of bucket policies via the `-marker` option - -| option | verifies | -|--------------------------|-------------------------------------------------------| -| `-markers aware` | the hadoop release is "aware" of directory markers | -| `-markers delete` | directory markers are deleted | -| `-markers keep` | directory markers are kept (not backwards compatible) | -| `-markers authoritative` | directory markers are kept in authoritative paths | +| option | verifies | result | +|--------------------------|------------------------------------------------------------------|--------| +| `-markers aware` | The hadoop release is "aware" of directory markers. Always true | 0 | +| `-markers keep` | Directory markers are kept. Always true | 0 | +| `-markers delete` | Directory markers are deleted. Always false | 1 | +| `-markers authoritative` | Directory markers are kept in authoritative paths. Always false | 1 | All releases of Hadoop which have been updated to be marker aware will support the `-markers aware` option. -1. Updated releases which do not support switching marker retention policy will also support the -`-markers delete` option. - - -Example: `s3guard bucket-info -markers aware` on a compatible release. - -``` -> hadoop s3guard bucket-info -markers aware s3a://noaa-isd-pds/ -Filesystem s3a://noaa-isd-pds - -... - -Directory Markers - The directory marker policy is "keep" - Available Policies: delete, keep, authoritative - Authoritative paths: fs.s3a.authoritative.path= - The S3A connector is compatible with buckets where directory markers are not deleted - -... -``` - -The same command will fail on older releases, because the `-markers` option -is unknown - -``` -> hadoop s3guard bucket-info -markers aware s3a://noaa-isd-pds/ -Illegal option -markers -Usage: hadoop bucket-info [OPTIONS] s3a://BUCKET - provide/check information about a specific bucket - -Common options: - -magic - Require the S3 filesystem to be support the "magic" committer - -encryption -require {none, sse-s3, sse-kms} - Require encryption policy - -When possible and not overridden by more specific options, metadata -repository information will be inferred from the S3A URL (if provided) - -Generic options supported are: - -conf - specify an application configuration file - -D - define a value for a given property - -2020-08-12 16:47:16,579 [main] INFO util.ExitUtil (ExitUtil.java:terminate(210)) - Exiting with status 42: Illegal option -markers -```` - -A specific policy check verifies that the connector is configured as desired - -``` -> hadoop s3guard bucket-info -markers keep s3a://noaa-isd-pds/ -Filesystem s3a://noaa-isd-pds - -... - -Directory Markers - The directory marker policy is "keep" - Available Policies: delete, keep, authoritative - Authoritative paths: fs.s3a.authoritative.path= - -``` - -When probing for a specific policy, the error code "46" is returned if the active policy -does not match that requested: - -``` -> hadoop s3guard bucket-info -markers delete s3a://noaa-isd-pds/ -Filesystem s3a://noaa-isd-pds - -S3A Client - Signing Algorithm: fs.s3a.signing-algorithm=(unset) - Endpoint: fs.s3a.endpoint=s3.amazonaws.com - Encryption: fs.s3a.encryption.algorithm=none - Input seek policy: fs.s3a.experimental.input.fadvise=normal - Change Detection Source: fs.s3a.change.detection.source=etag - Change Detection Mode: fs.s3a.change.detection.mode=server - -S3A Committers - The "magic" committer is supported in the filesystem - S3A Committer factory class: mapreduce.outputcommitter.factory.scheme.s3a=org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory - S3A Committer name: fs.s3a.committer.name=magic - Store magic committer integration: fs.s3a.committer.magic.enabled=true - -Security - Delegation token support is disabled - -Directory Markers - The directory marker policy is "delete" - Available Policies: delete, keep, authoritative - Authoritative paths: fs.s3a.authoritative.path= - -2021-11-22 16:03:59,175 [main] INFO util.ExitUtil (ExitUtil.java:terminate(210)) - -Exiting with status 46: 46: Bucket s3a://noaa-isd-pds: required marker polic is - "keep" but actual policy is "delete" - -``` - - ## The marker tool: `hadoop s3guard markers` The marker tool aims to help migration by scanning/auditing directory trees @@ -415,7 +248,6 @@ Syntax > hadoop s3guard markers -verbose -nonauth markers (-audit | -clean) [-min ] [-max ] [-out ] [-limit ] [-nonauth] [-verbose] View and manipulate S3 directory markers - ``` *Options* @@ -446,7 +278,6 @@ All other non-zero status code also indicate errors of some form or other. Audit the path and fail if any markers were found. - ``` > hadoop s3guard markers -limit 8000 -audit s3a://noaa-isd-pds/ @@ -499,35 +330,6 @@ Found 5 empty directory 'leaf' markers under s3a://london/ This fails because surplus markers were found. This S3A bucket would *NOT* be safe for older Hadoop versions to use. -The `-nonauth` option does not treat markers under authoritative paths as errors: - -``` -bin/hadoop s3guard markers -nonauth -audit s3a://london/ - -The directory marker policy of s3a://london is "Authoritative" -Authoritative path list is "/tables" -2020-08-05 18:31:19,210 [main] INFO tools.MarkerTool (DurationInfo.java:(77)) - Starting: marker scan s3a://london/ -2020-08-05 18:31:22,240 [main] INFO tools.MarkerTool (DurationInfo.java:close(98)) - marker scan s3a://london/: duration 0:03.031s -Listed 8 objects under s3a://london/ - -Found 3 surplus directory markers under s3a://london/ - s3a://london/tables/ - s3a://london/tables/tables-4/ - s3a://london/tables/tables-4/tables-5/ -Found 5 empty directory 'leaf' markers under s3a://london/ - s3a://london/tables/tables-2/ - s3a://london/tables/tables-3/ - s3a://london/tables/tables-4/tables-5/06/ - s3a://london/tables2/ - s3a://london/tables3/ -These are required to indicate empty directories - -Ignoring 3 markers in authoritative paths -``` - -All of this S3A bucket _other_ than the authoritative path `/tables` will be safe for -incompatible Hadoop releases to use. - ### `markers clean` @@ -535,9 +337,9 @@ The `markers clean` command will clean the directory tree of all surplus markers The `-verbose` option prints more detail on the operation as well as some IO statistics ``` -bin/hadoop s3guard markers -clean -verbose s3a://stevel-london/ -The directory marker policy of s3a://stevel-london is "Keep" -2023-06-06 17:15:52,110 [main] INFO tools.MarkerTool (DurationInfo.java:(77)) - Starting: marker scan s3a://stevel-london/ +bin/hadoop s3guard markers -clean -verbose s3a://london/ +The directory marker policy of s3a://london is "Keep" +2023-06-06 17:15:52,110 [main] INFO tools.MarkerTool (DurationInfo.java:(77)) - Starting: marker scan s3a://london/ Directory Marker user/stevel/target/test/data/4so7pZebRx/ Directory Marker user/stevel/target/test/data/OKvfC3oxlD/ Directory Marker user/stevel/target/test/data/VSTQ1O4dMi/ @@ -550,38 +352,20 @@ maximums=((object_continue_list_request.failures.max=-1) (object_list_request.fa means=((object_list_request.mean=(samples=1, sum=540, mean=540.0000)) (object_continue_list_request.failures.mean=(samples=0, sum=0, mean=0.0000)) (object_list_request.failures.mean=(samples=0, sum=0, mean=0.0000)) (object_continue_list_request.mean=(samples=0, sum=0, mean=0.0000))); -2023-06-06 17:15:52,662 [main] INFO tools.MarkerTool (DurationInfo.java:close(98)) - marker scan s3a://stevel-london/: duration 0:00.553s -Listed 3 objects under s3a://stevel-london/ +2023-06-06 17:15:52,662 [main] INFO tools.MarkerTool (DurationInfo.java:close(98)) - marker scan s3a://london/: duration 0:00.553s +Listed 3 objects under s3a://london/ -No surplus directory markers were found under s3a://stevel-london/ -Found 3 empty directory 'leaf' markers under s3a://stevel-london/ - s3a://stevel-london/user/stevel/target/test/data/4so7pZebRx/ - s3a://stevel-london/user/stevel/target/test/data/OKvfC3oxlD/ - s3a://stevel-london/user/stevel/target/test/data/VSTQ1O4dMi/ +No surplus directory markers were found under s3a://london/ +Found 3 empty directory 'leaf' markers under s3a://london/ + s3a://london/user/stevel/target/test/data/4so7pZebRx/ + s3a://london/user/stevel/target/test/data/OKvfC3oxlD/ + s3a://london/user/stevel/target/test/data/VSTQ1O4dMi/ These are required to indicate empty directories 0 markers to delete in 0 pages of 250 keys/page 2023-06-06 17:15:52,664 [main] INFO tools.MarkerTool (DurationInfo.java:(77)) - Starting: Deleting markers 2023-06-06 17:15:52,664 [main] INFO tools.MarkerTool (DurationInfo.java:close(98)) - Deleting markers: duration 0:00.000s -IO Statistics for s3a://stevel-london - -counters=((audit_request_execution=1) -(audit_span_creation=3) -(object_list_request=1) -(op_get_file_status=1) -(store_io_request=1)); - -gauges=(); - -minimums=((object_list_request.min=540) -(op_get_file_status.min=2)); - -maximums=((object_list_request.max=540) -(op_get_file_status.max=2)); - -means=((object_list_request.mean=(samples=1, sum=540, mean=540.0000)) -(op_get_file_status.mean=(samples=1, sum=2, mean=2.0000))); ``` The `markers -clean` command _does not_ delete markers above empty directories -only those which have @@ -600,16 +384,14 @@ An instance of the filesystem can be probed for its directory marker retention a policy can be probed for through the `org.apache.hadoop.fs.PathCapabilities` interface, which all FileSystem classes have supported since Hadoop 3.3. - -| Probe | Meaning | -|-------------------------|-------------------------| -| `fs.s3a.capability.directory.marker.aware` | Does the filesystem support surplus directory markers? | -| `fs.s3a.capability.directory.marker.policy.delete` | Is the bucket policy "delete"? | -| `fs.s3a.capability.directory.marker.policy.keep` | Is the bucket policy "keep"? | -| `fs.s3a.capability.directory.marker.policy.authoritative` | Is the bucket policy "authoritative"? | -| `fs.s3a.capability.directory.marker.action.delete` | If a file was created at this path, would directory markers be deleted? | -| `fs.s3a.capability.directory.marker.action.keep` | If a file was created at this path, would directory markers be retained? | - +| Probe | Meaning | Current value | +|-----------------------------------------------------------|--------------------------------------------------------------------------|---------------| +| `fs.s3a.capability.directory.marker.aware` | Does the filesystem support surplus directory markers? | true | +| `fs.s3a.capability.directory.marker.policy.delete` | Is the bucket policy "delete"? | false | +| `fs.s3a.capability.directory.marker.policy.keep` | Is the bucket policy "keep"? | true | +| `fs.s3a.capability.directory.marker.policy.authoritative` | Is the bucket policy "authoritative"? | false | +| `fs.s3a.capability.directory.marker.action.delete` | If a file was created at this path, would directory markers be deleted? | false | +| `fs.s3a.capability.directory.marker.action.keep` | If a file was created at this path, would directory markers be retained? | true | The probe `fs.s3a.capability.directory.marker.aware` allows for a filesystem to be probed to determine if its file listing policy is "aware" of directory marker retention @@ -625,68 +407,6 @@ be kept or deleted? The `S3AFileSystem` class also implements the `org.apache.hadoop.fs.StreamCapabilities` interface, which can be used to probe for marker awareness via the `fs.s3a.capability.directory.marker.aware` capability. -Again, this will be true if-and-only-if the S3A connector is safe to work with S3A buckets/paths where -directories are retained. - -*If an S3A instance, probed by `PathCapabilities` or `StreamCapabilities` for the capability -`fs.s3a.capability.directory.marker.aware` and it returns false, *it is not safe to be used with -S3A paths where markers have been retained*. - -This is programmatic probe -however it can be accessed on the command line via the -external [`cloudstore`](https://github.com/steveloughran/cloudstore) tool: - -``` -> hadoop jar cloudstore-1.0.jar pathcapability fs.s3a.capability.directory.marker.aware s3a://london/ - -Probing s3a://london/ for capability fs.s3a.capability.directory.marker.aware - -Using filesystem s3a://london -Path s3a://london/ has capability fs.s3a.capability.directory.marker.aware -``` - -If the exit code of the command is `0`, then the S3A is safe to work with buckets -where markers have not been deleted. - -The same tool can be used to dynamically probe for the policy. - -Take a bucket with a retention policy of "authoritative" -only paths under `/tables` will have markers retained. - -```xml - - fs.s3a.bucket.london.directory.marker.retention - authoritative - - - fs.s3a.bucket.london.authoritative.path - /tables - -``` - -With this policy the path capability `fs.s3a.capability.directory.marker.action.keep` will hold under -the path `s3a://london/tables` - -``` -bin/hadoop jar cloudstore-1.0.jar pathcapability fs.s3a.capability.directory.marker.action.keep s3a://london/tables -Probing s3a://london/tables for capability fs.s3a.capability.directory.marker.action.keep -2020-08-11 22:03:31,658 [main] INFO impl.DirectoryPolicyImpl (DirectoryPolicyImpl.java:getDirectoryPolicy(143)) - - Directory markers will be kept on authoritative paths -Using filesystem s3a://london -Path s3a://london/tables has capability fs.s3a.capability.directory.marker.action.keep -``` - -However it will not hold for other paths, so indicating that older Hadoop versions will be safe -to work with data written there by this S3A client. - -``` -bin/hadoop jar cloudstore-1.0.jar pathcapability fs.s3a.capability.directory.marker.action.keep s3a://london/tempdir -Probing s3a://london/tempdir for capability fs.s3a.capability.directory.marker.action.keep -2020-08-11 22:06:56,300 [main] INFO impl.DirectoryPolicyImpl (DirectoryPolicyImpl.java:getDirectoryPolicy(143)) - - Directory markers will be kept on authoritative paths -Using filesystem s3a://london -Path s3a://london/tempdir lacks capability fs.s3a.capability.directory.marker.action.keep -2020-08-11 22:06:56,308 [main] INFO util.ExitUtil (ExitUtil.java:terminate(210)) - Exiting with status -1: -``` - ## Glossary diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md index 1b4b2e8b21b38d..340fd80498e39f 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md @@ -23,12 +23,12 @@ ### Directory Marker Compatibility -This release does not delete directory markers when creating +This release never delete directory markers when creating files or directories underneath. This is incompatible with versions of the Hadoop S3A client released before 2021. -Consult [Controlling the S3A Directory Marker Behavior](directory_markers.html) for +Consult [S3A and Directory Markers](directory_markers.html) for full details. ## Documents @@ -40,7 +40,7 @@ full details. * [Working with Third-party S3 Stores](./third_party_stores.html) * [Troubleshooting](./troubleshooting_s3a.html) * [Prefetching](./prefetching.html) -* [Controlling the S3A Directory Marker Behavior](directory_markers.html). +* [S3A and Directory Markers](directory_markers.html). * [Auditing](./auditing.html). * [Committing work to S3 with the "S3A Committers"](./committers.html) * [S3A Committers Architecture](./committer_architecture.html) @@ -77,7 +77,7 @@ and compatible implementations. * Directly reads and writes S3 objects. * Compatible with standard S3 clients. -* Compatible with files created by the older `s3n://` client and Amazon EMR's `s3://` client. +* Compatible with files created by Amazon EMR's `s3://` client (EMRFS). * Supports partitioned uploads for many-GB objects. * Offers a high-performance random IO mode for working with columnar data such as Apache ORC and Apache Parquet files. diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/performance.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/performance.md index b8cb3ff732b361..8fddddf79c74fb 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/performance.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/performance.md @@ -110,8 +110,7 @@ it is by default, then the page size is limited to that defined in will, if the path references an object, cause that object to be deleted. * If the path does not reference an object: the path will not be deleted "This is for deleting objects, not directories" -* No probes for the existence of parent directories will take place; no - parent directory markers will be created. +* No probes for the existence of parent directories will take place. "If you need parent directories, call mkdir() yourself" * The list of failed keys listed in the `DeleteObjectsResponse` response are converted into paths and returned along with their error messages. diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3guard.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3guard.md index af4c6a76becb10..76583b760435d9 100644 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3guard.md +++ b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3guard.md @@ -141,7 +141,7 @@ Options |----------------------|---------------------------------------------------------------------| | `-fips` | Require FIPS endopint to be in use | | `-magic` | Require the S3 filesystem to be support the "magic" committer | -| `-markers` | Directory marker status: `aware`, `keep`, `delete`, `authoritative` | +| `-markers` | Directory marker status: `aware`, `keep` | | `-encryption ` | Require a specific encryption algorithm | The server side encryption options are not directly related to S3Guard, but @@ -172,10 +172,7 @@ S3A Committers Security Delegation token support is disabled -Directory Markers - The directory marker policy is "keep" - Available Policies: delete, keep, authoritative - Authoritative paths: fs.s3a.authoritative.path= +This version of Hadoop always retains directory markers ``` diff --git a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3n.md b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3n.md deleted file mode 100644 index 16beed920b137e..00000000000000 --- a/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/s3n.md +++ /dev/null @@ -1,52 +0,0 @@ - - -# The S3N Client - - - -S3N was a Hadoop filesystem client which can read or write data stored -in Amazon S3. It uses URLs with the schema `s3n://`. - -- - - - -**Hadoop's S3N client for Amazon S3 has been superceded by -the S3A connector** - -**Please upgrade to S3A for a supported, higher-performance S3 Client** - -- - - - - -## How to migrate to the S3A client - -1. Keep the `hadoop-aws` JAR on your classpath. - -1. Add the `aws-java-sdk-bundle.jar` JAR which Hadoop ships -with to your classpath. - -1. Change the authentication keys - - | old key | new key | - |---------|---------| - | `fs.s3n.awsAccessKeyId` | `fs.s3a.access.key` | - | `fs.s3n.awsSecretAccessKey` | `fs.s3a.secret.key` | - - Do make sure the property names are correct. For S3A, they are - `fs.s3a.access.key` and `fs.s3a.secret.key` —you cannot just copy the S3N - properties and replace `s3n` with `s3a`. - -1. Replace URLs which began with `s3n://` with `s3a://` - -1. You may now remove the `jets3t` JAR, as it is no longer needed. 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 7222eee98baeb0..48e112f4f29b41 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 @@ -337,53 +337,6 @@ then delete. Once a bucket is converted to being versioned, it cannot be converted back to being unversioned. - -## Testing Different Marker Retention Policy - -Hadoop supports [different policies for directory marker retention](directory_markers.html) --essentially the classic "delete" and the higher-performance "keep" options; "authoritative" -is just "keep" restricted to a part of the bucket. - - -Example: test with `markers=keep` - -``` -mvn verify -Dparallel-tests -DtestsThreadCount=4 -Dmarkers=keep -``` - -This is the default and does not need to be explicitly set. - -Example: test with `markers=delete` - -``` -mvn verify -Dparallel-tests -DtestsThreadCount=4 -Dmarkers=delete -``` - -Example: test with `markers=authoritative` - -``` -mvn verify -Dparallel-tests -DtestsThreadCount=4 -Dmarkers=authoritative -``` - -This final option is of limited use unless paths in the bucket have actually been configured to be -of mixed status; unless anything is set up then the outcome should equal that of "delete" - -### Enabling auditing of markers - -To enable an audit of the output directory of every test suite, -enable the option `fs.s3a.directory.marker.audit` - -``` --Dfs.s3a.directory.marker.audit=true -``` - -When set, if the marker policy is to delete markers under the test output directory, then -the marker tool audit command will be run. This will fail if a marker was found. - -This adds extra overhead to every operation, but helps verify that the connector is -not keeping markers where it needs to be deleting them -and hence backwards compatibility -is maintained. - ## Enabling prefetch for all tests The tests are run with prefetch if the `prefetch` property is set in the diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/AbstractS3ATestBase.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/AbstractS3ATestBase.java index 93f41cfaa81bb1..a8f509727e4a9c 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/AbstractS3ATestBase.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/AbstractS3ATestBase.java @@ -25,7 +25,6 @@ import org.apache.hadoop.fs.contract.AbstractFSContractTestBase; import org.apache.hadoop.fs.contract.ContractTestUtils; import org.apache.hadoop.fs.contract.s3a.S3AContract; -import org.apache.hadoop.fs.s3a.tools.MarkerTool; import org.apache.hadoop.fs.statistics.IOStatisticsSnapshot; import org.apache.hadoop.fs.statistics.IOStatisticsContext; import org.apache.hadoop.fs.store.audit.AuditSpan; @@ -37,15 +36,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset; import static org.apache.hadoop.fs.contract.ContractTestUtils.writeDataset; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestPropertyBool; -import static org.apache.hadoop.fs.s3a.S3AUtils.E_FS_CLOSED; -import static org.apache.hadoop.fs.s3a.tools.MarkerTool.UNLIMITED_LISTING; import static org.apache.hadoop.fs.statistics.IOStatisticsLogging.ioStatisticsToPrettyString; import static org.apache.hadoop.fs.statistics.IOStatisticsSupport.snapshotIOStatistics; @@ -119,8 +114,6 @@ public void setup() throws Exception { public void teardown() throws Exception { Thread.currentThread().setName("teardown"); - maybeAuditTestPath(); - super.teardown(); if (getFileSystem() != null) { FILESYSTEM_IOSTATS.aggregate(getFileSystem().getIOStatistics()); @@ -138,50 +131,6 @@ public static void dumpFileSystemIOStatistics() { ioStatisticsToPrettyString(FILESYSTEM_IOSTATS)); } - /** - * Audit the FS under {@link #methodPath()} if - * the test option {@link #DIRECTORY_MARKER_AUDIT} is - * true. - */ - public void maybeAuditTestPath() { - final S3AFileSystem fs = getFileSystem(); - if (fs != null) { - try { - boolean audit = getTestPropertyBool(fs.getConf(), - DIRECTORY_MARKER_AUDIT, false); - Path methodPath = methodPath(); - if (audit - && !fs.getDirectoryMarkerPolicy() - .keepDirectoryMarkers(methodPath) - && fs.isDirectory(methodPath)) { - MarkerTool.ScanResult result = MarkerTool.execMarkerTool( - new MarkerTool.ScanArgsBuilder() - .withSourceFS(fs) - .withPath(methodPath) - .withDoPurge(true) - .withMinMarkerCount(0) - .withMaxMarkerCount(0) - .withLimit(UNLIMITED_LISTING) - .withNonAuth(false) - .build()); - final String resultStr = result.toString(); - assertEquals("Audit of " + methodPath + " failed: " - + resultStr, - 0, result.getExitCode()); - assertEquals("Marker Count under " + methodPath - + " non-zero: " + resultStr, - 0, result.getFilteredMarkerCount()); - } - } catch (FileNotFoundException ignored) { - } catch (Exception e) { - // If is this is not due to the FS being closed: log. - if (!e.toString().contains(E_FS_CLOSED)) { - LOG.warn("Marker Tool Failure", e); - } - } - } - } - @Override protected int getTestTimeoutMillis() { return S3A_TEST_TIMEOUT; diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestDowngradeSyncable.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestDowngradeSyncable.java index 3ad679e6728d35..86e9f15568155a 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestDowngradeSyncable.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestDowngradeSyncable.java @@ -42,11 +42,6 @@ public class ITestDowngradeSyncable extends AbstractS3ACostTest { protected static final Logger LOG = LoggerFactory.getLogger(ITestDowngradeSyncable.class); - - public ITestDowngradeSyncable() { - super(true); - } - @Override public Configuration createConfiguration() { final Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AClientSideEncryption.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AClientSideEncryption.java index 8a955a5869b2b4..508e1a38356ec2 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AClientSideEncryption.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AClientSideEncryption.java @@ -336,7 +336,7 @@ public void testSizeOfEncryptedObjectFromHeaderWithV1Compatibility() throws Exce putObjectRequestBuilder.contentLength(Long.parseLong(String.valueOf(SMALL_FILE_SIZE))); putObjectRequestBuilder.metadata(metadata); fs.putObjectDirect(putObjectRequestBuilder.build(), - PutObjectOptions.deletingDirs(), + PutObjectOptions.defaultOptions(), new S3ADataBlocks.BlockUploadData(new byte[SMALL_FILE_SIZE], null), null); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileOperationCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileOperationCost.java index 585317c8daf3a0..3e3f8245e7c85d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileOperationCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AFileOperationCost.java @@ -21,12 +21,11 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.s3a.api.PerformanceFlagEnum; import org.apache.hadoop.fs.s3a.impl.StatusProbeEnum; import org.apache.hadoop.fs.s3a.performance.AbstractS3ACostTest; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.assertj.core.api.Assertions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +33,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.net.URI; -import java.util.Arrays; -import java.util.Collection; import java.util.EnumSet; @@ -48,39 +45,17 @@ /** * Use metrics to assert about the cost of file API calls. - * Parameterized on directory marker keep vs delete. - * When the FS is instantiated with creation performance, things - * behave differently...its value is that of the marker keep flag, - * so deletion costs are the same. */ -@RunWith(Parameterized.class) public class ITestS3AFileOperationCost extends AbstractS3ACostTest { private static final Logger LOG = LoggerFactory.getLogger(ITestS3AFileOperationCost.class); - /** - * Parameterization. - */ - @Parameterized.Parameters(name = "{0}") - public static Collection params() { - return Arrays.asList(new Object[][]{ - {"keep-markers", true}, - {"delete-markers", false}, - }); - } - - public ITestS3AFileOperationCost( - final String name, - final boolean keepMarkers) { - super(keepMarkers); - } - @Override public Configuration createConfiguration() { return setPerformanceFlags( super.createConfiguration(), - isKeepingMarkers() ? "create" : ""); + PerformanceFlagEnum.Create.toString()); } /** @@ -132,7 +107,7 @@ public void testCostOfListFilesOnFile() throws Throwable { @Test public void testCostOfListFilesOnEmptyDir() throws Throwable { - describe("Perpforming listFiles() on an empty dir with marker"); + describe("Performing listFiles() on an empty dir with marker"); // this attem Path dir = path(getMethodName()); S3AFileSystem fs = getFileSystem(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMiscOperations.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMiscOperations.java index a4eba8a96478e9..ecda6fd2acee60 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMiscOperations.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMiscOperations.java @@ -112,7 +112,7 @@ public void testPutObjectDirect() throws Throwable { LambdaTestUtils.intercept(IllegalStateException.class, () -> fs.putObjectDirect( putObjectRequestBuilder.build(), - PutObjectOptions.keepingDirs(), + PutObjectOptions.defaultOptions(), new S3ADataBlocks.BlockUploadData("PUT".getBytes(), null), null)); assertPathDoesNotExist("put object was created", path); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java index 96b6b09bac7aae..e9e8410c344705 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java @@ -66,10 +66,6 @@ public class ITestS3APrefetchingCacheFiles extends AbstractS3ACostTest { private String bufferDir; - public ITestS3APrefetchingCacheFiles() { - super(true); - } - @Before public void setUp() throws Exception { super.setup(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java index 8c340fc8cb9b98..1d904be28dd4cb 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java @@ -54,10 +54,6 @@ */ public class ITestS3APrefetchingInputStream extends AbstractS3ACostTest { - public ITestS3APrefetchingInputStream() { - super(true); - } - private static final Logger LOG = LoggerFactory.getLogger(ITestS3APrefetchingInputStream.class); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java index 64674d29021a3d..b71cc43d89707c 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java @@ -68,7 +68,6 @@ public static Collection params() { } public ITestS3APrefetchingLruEviction(final String maxBlocks) { - super(true); this.maxBlocks = maxBlocks; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MockS3AFileSystem.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MockS3AFileSystem.java index 44864cd67089a5..f938494eef0b5f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MockS3AFileSystem.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MockS3AFileSystem.java @@ -41,7 +41,6 @@ import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecrets; import org.apache.hadoop.fs.s3a.commit.staging.StagingTestBase; import org.apache.hadoop.fs.s3a.impl.ClientManager; -import org.apache.hadoop.fs.s3a.impl.PutObjectOptions; import org.apache.hadoop.fs.s3a.impl.RequestFactoryImpl; import org.apache.hadoop.fs.s3a.impl.StoreContext; import org.apache.hadoop.fs.s3a.impl.StoreContextBuilder; @@ -235,13 +234,6 @@ public boolean exists(Path f) throws IOException { return mock.exists(f); } - @Override - void finishedWrite(String key, - long length, - final PutObjectOptions putOptions) { - - } - @Override public FSDataInputStream open(Path f, int bufferSize) throws IOException { event("open(%s)", f); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MultipartTestUtils.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MultipartTestUtils.java index 0c6acb4bb08f84..8ece43d50a5141 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MultipartTestUtils.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MultipartTestUtils.java @@ -90,7 +90,7 @@ public static IdKey createPartUpload(S3AFileSystem fs, String key, int len, WriteOperationHelper writeHelper = fs.getWriteOperationHelper(); byte[] data = dataset(len, 'a', 'z'); InputStream in = new ByteArrayInputStream(data); - String uploadId = writeHelper.initiateMultiPartUpload(key, PutObjectOptions.keepingDirs()); + String uploadId = writeHelper.initiateMultiPartUpload(key, PutObjectOptions.defaultOptions()); UploadPartRequest req = writeHelper.newUploadPartRequestBuilder(key, uploadId, partNo, true, len).build(); RequestBody body = RequestBody.fromInputStream(in, len); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestConstants.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestConstants.java index 9ab1768b2aba1f..86ba242b677300 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestConstants.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestConstants.java @@ -246,12 +246,6 @@ public interface S3ATestConstants { Duration TEST_SESSION_TOKEN_DURATION = Duration.ofSeconds( TEST_SESSION_TOKEN_DURATION_SECONDS); - /** - * Test option to enable audits of the method path after - * every test case. - */ - String DIRECTORY_MARKER_AUDIT = "fs.s3a.directory.marker.audit"; - /** * Constant bytes being written when Client side encryption KMS is enabled * for a test. This bytes written takes into account "EncryptionContext", diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java index dde363fa09cc73..4159ff2f9b2fd2 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java @@ -739,13 +739,6 @@ public static Configuration prepareTestConfiguration(final Configuration conf) { } conf.set(BUFFER_DIR, tmpDir); - // directory marker policy - String directoryRetention = getTestProperty( - conf, - DIRECTORY_MARKER_POLICY, - DEFAULT_DIRECTORY_MARKER_POLICY); - conf.set(DIRECTORY_MARKER_POLICY, directoryRetention); - boolean prefetchEnabled = getTestPropertyBool(conf, PREFETCH_ENABLED_KEY, PREFETCH_ENABLED_DEFAULT); conf.setBoolean(PREFETCH_ENABLED_KEY, prefetchEnabled); @@ -1105,8 +1098,7 @@ public static List createDirsAndFiles(final FileSystem fs, List> futures = new ArrayList<>(paths.size() + dirs.size()); - // create directories. With dir marker retention, that adds more entries - // to cause deletion issues + // create directories. try (DurationInfo ignore = new DurationInfo(LOG, "Creating %d directories", dirs.size())) { for (Path path : dirs) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3ABlockOutputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3ABlockOutputStream.java index dc1cb2f54bfa65..fdb926a733677f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3ABlockOutputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3ABlockOutputStream.java @@ -68,7 +68,7 @@ private S3ABlockOutputStream.BlockOutputStreamBuilder mockS3ABuilder() { .withProgress(progressable) .withPutTracker(putTracker) .withWriteOperations(oHelper) - .withPutOptions(PutObjectOptions.keepingDirs()) + .withPutOptions(PutObjectOptions.defaultOptions()) .withIOStatisticsAggregator( IOStatisticsContext.getCurrentIOStatisticsContext() .getAggregator()); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditAccessChecks.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditAccessChecks.java index 4b0b65fd783ae2..3fc82c69c98d97 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditAccessChecks.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditAccessChecks.java @@ -59,10 +59,6 @@ public class ITestAuditAccessChecks extends AbstractS3ACostTest { private AccessCheckingAuditor auditor; - public ITestAuditAccessChecks() { - super(true); - } - @Override public Configuration createConfiguration() { Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManager.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManager.java index ea7a1a34da7352..11b434cae17ed5 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManager.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManager.java @@ -49,10 +49,6 @@ */ public class ITestAuditManager extends AbstractS3ACostTest { - public ITestAuditManager() { - super(true); - } - @Override public Configuration createConfiguration() { Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManagerDisabled.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManagerDisabled.java index 68aaef51d60f69..d9135509a422de 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManagerDisabled.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/audit/ITestAuditManagerDisabled.java @@ -35,10 +35,6 @@ */ public class ITestAuditManagerDisabled extends AbstractS3ACostTest { - public ITestAuditManagerDisabled() { - super(true); - } - @Override public Configuration createConfiguration() { Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java index 9041a20aeeb6c1..39b9a769e75d6f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java @@ -45,7 +45,6 @@ import static org.apache.hadoop.fs.s3a.Statistic.COMMITTER_MAGIC_FILES_CREATED; import static org.apache.hadoop.fs.s3a.Statistic.COMMITTER_MAGIC_MARKER_PUT; import static org.apache.hadoop.fs.s3a.Statistic.DIRECTORIES_CREATED; -import static org.apache.hadoop.fs.s3a.Statistic.FAKE_DIRECTORIES_DELETED; import static org.apache.hadoop.fs.s3a.Statistic.OBJECT_BULK_DELETE_REQUEST; import static org.apache.hadoop.fs.s3a.Statistic.OBJECT_DELETE_REQUEST; import static org.apache.hadoop.fs.s3a.Statistic.OBJECT_LIST_REQUEST; @@ -65,8 +64,6 @@ /** * Assert cost of commit operations; *
      - *
    1. Even on marker deleting filesystems, - * operations under magic dirs do not trigger marker deletion.
    2. *
    3. Loading pending files from FileStatus entries skips HEAD checks.
    4. *
    5. Mkdir under magic dirs doesn't check ancestor or dest type
    6. *
    @@ -81,13 +78,6 @@ public class ITestCommitOperationCost extends AbstractS3ACostTest { */ private CommitterTestHelper testHelper; - /** - * Create with markers kept, always. - */ - public ITestCommitOperationCost() { - super(false); - } - @Override public void setup() throws Exception { super.setup(); @@ -123,37 +113,12 @@ protected String fileSystemIOStats() { return ioStatisticsToPrettyString(getFileSystem().getIOStatistics()); } - @Test - public void testMagicMkdir() throws Throwable { - describe("Mkdirs 'MAGIC PATH' always skips dir marker deletion"); - S3AFileSystem fs = getFileSystem(); - Path baseDir = methodPath(); - // create dest dir marker, always - fs.mkdirs(baseDir); - Path magicDir = new Path(baseDir, MAGIC_PATH_PREFIX + JOB_ID); - verifyMetrics(() -> { - fs.mkdirs(magicDir); - return fileSystemIOStats(); - }, - with(OBJECT_BULK_DELETE_REQUEST, 0), - with(OBJECT_DELETE_REQUEST, 0), - with(DIRECTORIES_CREATED, 1)); - verifyMetrics(() -> { - fs.delete(magicDir, true); - return fileSystemIOStats(); - }, - with(OBJECT_BULK_DELETE_REQUEST, 0), - with(OBJECT_DELETE_REQUEST, 1), - with(DIRECTORIES_CREATED, 0)); - assertPathExists("parent", baseDir); - } - /** * When a magic subdir is deleted, parent dirs are not recreated. */ @Test public void testMagicMkdirs() throws Throwable { - describe("Mkdirs __magic_job-/subdir always skips dir marker deletion"); + describe("Mkdirs __magic_job-/subdir always skips dir marker recreation"); S3AFileSystem fs = getFileSystem(); Path baseDir = methodPath(); Path magicDir = new Path(baseDir, MAGIC_PATH_PREFIX + JOB_ID); @@ -227,9 +192,8 @@ public void testCostOfCreatingMagicFile() throws Throwable { stream.write("hello".getBytes(StandardCharsets.UTF_8)); - // when closing, there will be no directories deleted - // we do expect two PUT requests, because the marker and manifests - // are both written + // when closing, we expect two PUT requests, + // because the marker and manifests are both written LOG.info("closing magic stream to {}", magicDest); verifyMetrics(() -> { stream.close(); @@ -270,7 +234,6 @@ public void testCostOfCreatingMagicFile() throws Throwable { commitOperations.getIOStatistics()); }, always(NO_HEAD_OR_LIST), // no probes for the dest path - with(FAKE_DIRECTORIES_DELETED, 0), // no fake dirs with(OBJECT_DELETE_REQUEST, 0)); // no deletes LOG.info("Final Statistics {}", diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestPartialRenamesDeletes.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestPartialRenamesDeletes.java index 8a285a4db40a88..40318be35bae42 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestPartialRenamesDeletes.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestPartialRenamesDeletes.java @@ -307,13 +307,9 @@ protected Configuration createConfiguration() { removeBucketOverrides(bucketName, conf, MAX_THREADS, MAXIMUM_CONNECTIONS, - DIRECTORY_MARKER_POLICY, BULK_DELETE_PAGE_SIZE); conf.setInt(MAX_THREADS, EXECUTOR_THREAD_COUNT); conf.setInt(MAXIMUM_CONNECTIONS, EXECUTOR_THREAD_COUNT * 2); - // use the keep policy to ensure that surplus markers exist - // to complicate failures - conf.set(DIRECTORY_MARKER_POLICY, DIRECTORY_MARKER_POLICY_KEEP); // set the delete page size to its maximum to ensure that all // entries are included in the same large delete, even on // scale runs. This is needed for assertions on the result. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestRenameDeleteRace.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestRenameDeleteRace.java index 73db942973211a..d16d09d068b474 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestRenameDeleteRace.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestRenameDeleteRace.java @@ -23,25 +23,18 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; -import software.amazon.awssdk.core.exception.SdkException; - import org.assertj.core.api.Assertions; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.exception.SdkException; - -import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.contract.ContractTestUtils; import org.apache.hadoop.fs.s3a.AbstractS3ATestBase; import org.apache.hadoop.fs.s3a.S3AFileSystem; import org.apache.hadoop.util.BlockingThreadPoolExecutorService; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_DELETE; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; import static org.apache.hadoop.fs.s3a.impl.CallableSupplier.submit; import static org.apache.hadoop.fs.s3a.impl.CallableSupplier.waitForCompletion; import static org.apache.hadoop.io.IOUtils.cleanupWithLogger; @@ -72,20 +65,6 @@ public class ITestRenameDeleteRace extends AbstractS3ATestBase { 30, TimeUnit.SECONDS, "test-operations"); - @Override - protected Configuration createConfiguration() { - Configuration conf = super.createConfiguration(); - - // use the keep policy to ensure that surplus markers exist - // to complicate failures - conf.set(DIRECTORY_MARKER_POLICY, DIRECTORY_MARKER_POLICY_DELETE); - removeBaseAndBucketOverrides(getTestBucketName(conf), - conf, - DIRECTORY_MARKER_POLICY); - - return conf; - } - /** * This test uses a subclass of S3AFileSystem to recreate the race between * subdirectory delete and rename. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestXAttrCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestXAttrCost.java index 71fdb7aeaa62cf..665c8fdf4d30ac 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestXAttrCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/ITestXAttrCost.java @@ -58,10 +58,6 @@ public class ITestXAttrCost extends AbstractS3ACostTest { private static final int GET_METADATA_ON_OBJECT = 1; private static final int GET_METADATA_ON_DIR = GET_METADATA_ON_OBJECT * 2; - public ITestXAttrCost() { - super(true); - } - @Test public void testXAttrRoot() throws Throwable { describe("Test xattr on root"); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestDirectoryMarkerPolicy.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestDirectoryMarkerPolicy.java deleted file mode 100644 index 194cd645c07143..00000000000000 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestDirectoryMarkerPolicy.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3a.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.function.Predicate; - -import org.assertj.core.api.Assertions; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.test.AbstractHadoopTestBase; - -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP; - -/** - * Unit tests for directory marker policies. - */ -@RunWith(Parameterized.class) -public class TestDirectoryMarkerPolicy extends AbstractHadoopTestBase { - - @Parameterized.Parameters(name = "{0}") - public static Collection data() { - return Arrays.asList(new Object[][]{ - { - DirectoryPolicy.MarkerPolicy.Delete, - FAIL_IF_INVOKED, - false, false - }, - { - DirectoryPolicy.MarkerPolicy.Keep, - FAIL_IF_INVOKED, - true, true - }, - { - DirectoryPolicy.MarkerPolicy.Authoritative, - AUTH_PATH_ONLY, - false, true - } - }); - } - - private final DirectoryPolicy directoryPolicy; - - private final boolean expectNonAuthDelete; - - private final boolean expectAuthDelete; - - public TestDirectoryMarkerPolicy( - final DirectoryPolicy.MarkerPolicy markerPolicy, - final Predicate authoritativeness, - final boolean expectNonAuthDelete, - final boolean expectAuthDelete) { - this.directoryPolicy = newPolicy(markerPolicy, authoritativeness); - this.expectNonAuthDelete = expectNonAuthDelete; - this.expectAuthDelete = expectAuthDelete; - } - - /** - * Create a new retention policy. - * @param markerPolicy policy option - * @param authoritativeness predicate for determining if - * a path is authoritative. - * @return the retention policy. - */ - private DirectoryPolicy newPolicy( - DirectoryPolicy.MarkerPolicy markerPolicy, - Predicate authoritativeness) { - return new DirectoryPolicyImpl(markerPolicy, authoritativeness); - } - - private static final Predicate AUTH_PATH_ONLY = - (p) -> p.toUri().getPath().startsWith("/auth/"); - - private static final Predicate FAIL_IF_INVOKED = (p) -> { - throw new RuntimeException("failed"); - }; - - private final Path nonAuthPath = new Path("s3a://bucket/nonauth/data"); - - private final Path authPath = new Path("s3a://bucket/auth/data1"); - - private final Path deepAuth = new Path("s3a://bucket/auth/d1/d2/data2"); - - /** - * Assert that a path has a retention outcome. - * @param path path - * @param retain should the marker be retained - */ - private void assertMarkerRetention(Path path, boolean retain) { - Assertions.assertThat(directoryPolicy.keepDirectoryMarkers(path)) - .describedAs("Retention of path %s by %s", path, directoryPolicy) - .isEqualTo(retain); - } - - /** - * Assert that a path has a capability. - */ - private void assertPathCapability(Path path, - String capability, - boolean outcome) { - Assertions.assertThat(directoryPolicy) - .describedAs("%s support for capability %s by path %s" - + " expected as %s", - directoryPolicy, capability, path, outcome) - .matches(p -> p.hasPathCapability(path, capability) == outcome, - "pathCapability"); - } - - @Test - public void testNonAuthPath() throws Throwable { - assertMarkerRetention(nonAuthPath, expectNonAuthDelete); - assertPathCapability(nonAuthPath, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE, - !expectNonAuthDelete); - assertPathCapability(nonAuthPath, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP, - expectNonAuthDelete); - } - - @Test - public void testAuthPath() throws Throwable { - assertMarkerRetention(authPath, expectAuthDelete); - assertPathCapability(authPath, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE, - !expectAuthDelete); - assertPathCapability(authPath, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP, - expectAuthDelete); - } - - @Test - public void testDeepAuthPath() throws Throwable { - assertMarkerRetention(deepAuth, expectAuthDelete); - assertPathCapability(deepAuth, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_DELETE, - !expectAuthDelete); - assertPathCapability(deepAuth, - STORE_CAPABILITY_DIRECTORY_MARKER_ACTION_KEEP, - expectAuthDelete); - } - -} diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestRequestFactory.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestRequestFactory.java index c779062f518f78..15e8a4485d5583 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestRequestFactory.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestRequestFactory.java @@ -179,9 +179,7 @@ private void createFactoryObjects(RequestFactory factory) throws IOException { a(factory.newListObjectsV2RequestBuilder(path, "/", 1)); a(factory.newMultipartUploadRequestBuilder(path, null)); a(factory.newPutObjectRequestBuilder(path, - PutObjectOptions.keepingDirs(), -1, true)); - a(factory.newPutObjectRequestBuilder(path, - PutObjectOptions.deletingDirs(), 1024, false)); + PutObjectOptions.defaultOptions(), -1, true)); } /** @@ -265,7 +263,7 @@ public void testUploadTimeouts() throws Throwable { // A simple PUT final PutObjectRequest put = factory.newPutObjectRequestBuilder(path, - PutObjectOptions.deletingDirs(), 1024, false).build(); + PutObjectOptions.defaultOptions(), 1024, false).build(); assertApiTimeouts(partDuration, put); // multipart part diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/AbstractS3ACostTest.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/AbstractS3ACostTest.java index f1f4f1d147d83e..4d9fa06b00f024 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/AbstractS3ACostTest.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/AbstractS3ACostTest.java @@ -36,7 +36,6 @@ import org.apache.hadoop.fs.s3a.S3AFileSystem; import org.apache.hadoop.fs.s3a.Statistic; import org.apache.hadoop.fs.s3a.Tristate; -import org.apache.hadoop.fs.s3a.impl.DirectoryPolicy; import org.apache.hadoop.fs.s3a.impl.InternalConstants; import org.apache.hadoop.fs.s3a.impl.StatusProbeEnum; import org.apache.hadoop.fs.s3a.statistics.StatisticTypeEnum; @@ -58,15 +57,6 @@ */ public class AbstractS3ACostTest extends AbstractS3ATestBase { - /** - * Parameter: should directory markers be retained? - */ - private final boolean keepMarkers; - - private boolean isKeeping; - - private boolean isDeleting; - private OperationCostValidator costValidator; /** @@ -84,18 +74,8 @@ public class AbstractS3ACostTest extends AbstractS3ATestBase { /** * Constructor for parameterized tests. - * @param keepMarkers should markers be tested. */ - protected AbstractS3ACostTest( - final boolean keepMarkers) { - this.keepMarkers = keepMarkers; - } - - /** - * Constructor with markers kept. - */ - public AbstractS3ACostTest() { - this(true); + protected AbstractS3ACostTest() { } @Override @@ -106,15 +86,8 @@ public Configuration createConfiguration() { String arn = conf.getTrimmed(arnKey, ""); removeBaseAndBucketOverrides(bucketName, conf, - DIRECTORY_MARKER_POLICY, - AUTHORITATIVE_PATH, FS_S3A_CREATE_PERFORMANCE, FS_S3A_PERFORMANCE_FLAGS); - // directory marker options - conf.set(DIRECTORY_MARKER_POLICY, - keepMarkers - ? DIRECTORY_MARKER_POLICY_KEEP - : DIRECTORY_MARKER_POLICY_DELETE); disableFilesystemCaching(conf); // AccessPoint ARN is the only per bucket configuration that must be kept. @@ -129,17 +102,7 @@ public Configuration createConfiguration() { public void setup() throws Exception { super.setup(); S3AFileSystem fs = getFileSystem(); - isKeeping = isKeepingMarkers(); - isDeleting = !isKeeping; - - // check that the FS has the expected state - DirectoryPolicy markerPolicy = fs.getDirectoryMarkerPolicy(); - Assertions.assertThat(markerPolicy.getMarkerPolicy()) - .describedAs("Marker policy for filesystem %s", fs) - .isEqualTo(isKeepingMarkers() - ? DirectoryPolicy.MarkerPolicy.Keep - : DirectoryPolicy.MarkerPolicy.Delete); setupCostValidator(); // determine bulk delete settings @@ -164,14 +127,6 @@ protected void setupCostValidator() { costValidator = builder.build(); } - public boolean isDeleting() { - return isDeleting; - } - - public boolean isKeepingMarkers() { - return keepMarkers; - } - /** * A special object whose toString() value is the current * state of the metrics. @@ -379,26 +334,6 @@ protected OperationCostValidator.ExpectedProbe always() { return OperationCostValidator.always(); } - /** - * A metric diff which must hold when the fs is keeping markers. - * @param cost expected cost - * @return the diff. - */ - protected OperationCostValidator.ExpectedProbe whenKeeping( - OperationCost cost) { - return expect(isKeepingMarkers(), cost); - } - - /** - * A metric diff which must hold when the fs is keeping markers. - * @param cost expected cost - * @return the diff. - */ - protected OperationCostValidator.ExpectedProbe whenDeleting( - OperationCost cost) { - return expect(isDeleting(), cost); - } - /** * Execute a closure expecting a specific number of HEAD/LIST calls. * The operation is always evaluated. @@ -506,30 +441,6 @@ protected OperationCostValidator.ExpectedProbe with( return probe(stat, expected); } - /** - * A metric diff which must hold when the fs is keeping markers. - * @param stat metric source - * @param expected expected value. - * @return the diff. - */ - protected OperationCostValidator.ExpectedProbe withWhenKeeping( - final Statistic stat, - final int expected) { - return probe(isKeepingMarkers(), stat, expected); - } - - /** - * A metric diff which must hold when the fs is keeping markers. - * @param stat metric source - * @param expected expected value. - * @return the diff. - */ - protected OperationCostValidator.ExpectedProbe withWhenDeleting( - final Statistic stat, - final int expected) { - return probe(isDeleting(), stat, expected); - } - /** * Assert the empty directory status of a file is as expected. * The raised assertion message includes a list of the path. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestCreateFileCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestCreateFileCost.java index 65786bf6d6919c..4379c24668000f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestCreateFileCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestCreateFileCost.java @@ -83,12 +83,10 @@ public static Collection params() { private final boolean createPerformance; /** - * Create with markers kept, always. + * Create. + * @param createPerformance use the performance flag */ public ITestCreateFileCost(final boolean createPerformance) { - // keep markers to permit assertions that create performance - // always skips marker deletion. - super(false); this.createPerformance = createPerformance; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestDirectoryMarkerListing.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestDirectoryMarkerListing.java index 088e4989af4f79..475d1d658dd087 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestDirectoryMarkerListing.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestDirectoryMarkerListing.java @@ -22,21 +22,18 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; import java.util.stream.Collectors; import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.HeadObjectResponse; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileAlreadyExistsException; @@ -50,11 +47,7 @@ import org.apache.hadoop.fs.s3a.S3AUtils; import org.apache.hadoop.fs.store.audit.AuditSpan; - import static org.apache.hadoop.fs.contract.ContractTestUtils.touch; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_DELETE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_KEEP; import static org.apache.hadoop.fs.s3a.Constants.FS_S3A_CREATE_PERFORMANCE; import static org.apache.hadoop.fs.s3a.Constants.FS_S3A_PERFORMANCE_FLAGS; import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName; @@ -85,7 +78,6 @@ *

    * s3a create performance is disabled for consistent assertions. */ -@RunWith(Parameterized.class) public class ITestDirectoryMarkerListing extends AbstractS3ATestBase { private static final Logger LOG = @@ -99,17 +91,6 @@ public class ITestDirectoryMarkerListing extends AbstractS3ATestBase { private static final String MARKER_PEER = "markerpeer"; - /** - * Parameterization. - */ - @Parameterized.Parameters(name = "{0}") - public static Collection params() { - return Arrays.asList(new Object[][]{ - {"keep-markers", true}, - {"delete-markers", false}, - }); - } - /** * Does rename copy markers? * Value: {@value} @@ -120,21 +101,6 @@ public static Collection params() { */ private static final boolean RENAME_COPIES_MARKERS = false; - /** - * Test configuration name. - */ - private final String name; - - /** - * Does this test configuration keep markers? - */ - private final boolean keepMarkers; - - /** - * Is this FS deleting markers? - */ - private final boolean isDeletingMarkers; - /** * Path to a directory which has a marker. */ @@ -187,27 +153,14 @@ public static Collection params() { */ private String markerPeerKey; - public ITestDirectoryMarkerListing(final String name, - final boolean keepMarkers) { - this.name = name; - this.keepMarkers = keepMarkers; - this.isDeletingMarkers = !keepMarkers; - } - @Override protected Configuration createConfiguration() { Configuration conf = super.createConfiguration(); String bucketName = getTestBucketName(conf); - // directory marker options removeBaseAndBucketOverrides(bucketName, conf, - DIRECTORY_MARKER_POLICY, FS_S3A_CREATE_PERFORMANCE, FS_S3A_PERFORMANCE_FLAGS); - conf.set(DIRECTORY_MARKER_POLICY, - keepMarkers - ? DIRECTORY_MARKER_POLICY_KEEP - : DIRECTORY_MARKER_POLICY_DELETE); conf.setBoolean(FS_S3A_CREATE_PERFORMANCE, false); return conf; } @@ -449,10 +402,6 @@ public void testDelete() throws Throwable { /** * Rename the base directory, expect the source files to move. - *

    - * Whether or not the marker itself is copied depends on whether - * the release's rename operation explicitly skips - * markers on renames. */ @Test public void testRenameBase() throws Throwable { @@ -480,14 +429,8 @@ public void testRenameBase() throws Throwable { assertIsFile(destMarkerPeer); head(destFileKeyUnderMarker); - // probe for the marker based on expected rename - // behavior - if (RENAME_COPIES_MARKERS) { - head(destMarkerKeySlash); - } else { - head404(destMarkerKeySlash); - } - + // rename doesn't copy non-leaf markers + head404(destMarkerKeySlash); } /** @@ -520,11 +463,7 @@ public void testRenameUnderMarkerDir() throws Throwable { assertRenamed(src, dest); assertIsFile(new Path(dest, file)); assertIsDirectory(srcDir); - if (isDeletingMarkers) { - head404(markerKeySlash); - } else { - head(markerKeySlash); - } + head(markerKeySlash); } /** @@ -557,11 +496,7 @@ public void testRenameUnderMarkerWithPath() throws Throwable { assertRenamed(src, dest); assertIsFile(dest); assertIsDirectory(srcDir); - if (isDeletingMarkers) { - head404(markerKeySlash); - } else { - head(markerKeySlash); - } + head(markerKeySlash); } /** @@ -615,6 +550,7 @@ private void put(final String key, final String content) throws Exception { s3client.putObject(b -> b.bucket(bucket).key(key), RequestBody.fromString(content))); } + /** * Delete an object; exceptions are swallowed. * @param key key @@ -650,7 +586,7 @@ private String head(final String key) throws Exception { private void head404(final String key) throws Exception { intercept(FileNotFoundException.class, "", "Expected 404 of " + key, () -> - head(key)); + head(key)); } /** diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ADeleteCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ADeleteCost.java index 6bd4114f07cc31..b923fca47bc5c9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ADeleteCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ADeleteCost.java @@ -21,12 +21,9 @@ import java.io.FileNotFoundException; import java.util.Arrays; -import java.util.Collection; import org.assertj.core.api.Assertions; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,6 +33,7 @@ import org.apache.hadoop.fs.contract.ContractTestUtils; import org.apache.hadoop.fs.s3a.S3AFileStatus; import org.apache.hadoop.fs.s3a.S3AFileSystem; +import org.apache.hadoop.fs.s3a.Statistic; import org.apache.hadoop.fs.s3a.Tristate; import org.apache.hadoop.fs.s3a.impl.StatusProbeEnum; @@ -47,35 +45,17 @@ /** * Use metrics to assert about the cost of file API calls. - *

    - * Parameterized on directory marker keep vs delete. + *

    * There's extra complexity related to bulk/non-bulk delete calls. * If bulk deletes are disabled, many more requests are made to delete * parent directories. The counters of objects deleted are constant * irrespective of the delete mode. */ -@RunWith(Parameterized.class) public class ITestS3ADeleteCost extends AbstractS3ACostTest { private static final Logger LOG = LoggerFactory.getLogger(ITestS3ADeleteCost.class); - /** - * Parameterization. - */ - @Parameterized.Parameters(name = "{0}") - public static Collection params() { - return Arrays.asList(new Object[][]{ - {"keep-markers", true}, - {"delete-markers", false}, - }); - } - - public ITestS3ADeleteCost(final String name, - final boolean keepMarkers) { - super(keepMarkers); - } - @Override public Configuration createConfiguration() { return setPerformanceFlags( @@ -85,11 +65,9 @@ public Configuration createConfiguration() { @Override public void teardown() throws Exception { - if (isKeepingMarkers()) { - // do this ourselves to avoid audits teardown failing - // when surplus markers are found - deleteTestDirInTeardown(); - } + // do this ourselves to avoid audits teardown failing + // when surplus markers are found + deleteTestDirInTeardown(); super.teardown(); } @@ -104,22 +82,15 @@ public void testDeleteSingleFileInDir() throws Throwable { S3AFileSystem fs = getFileSystem(); // creates the marker Path dir = dir(methodPath()); - // file creation may have deleted that marker, but it may - // still be there Path simpleFile = file(new Path(dir, "simple.txt")); - boolean keeping = !isDeleting(); - boolean deleting = isDeleting(); boolean bulkDelete = isBulkDelete(); verifyMetrics(() -> { fs.delete(simpleFile, false); return "after fs.delete(simpleFile) " + getMetricSummary(); }, - probe(keeping, OBJECT_METADATA_REQUESTS, + probe(OBJECT_METADATA_REQUESTS, FILESTATUS_FILE_PROBE_H), - // if deleting markers, look for the parent too - probe(deleting, OBJECT_METADATA_REQUESTS, - FILESTATUS_FILE_PROBE_H + FILESTATUS_DIR_PROBE_H), with(OBJECT_LIST_REQUEST, FILESTATUS_FILE_PROBE_L + FILESTATUS_DIR_PROBE_L), with(DIRECTORIES_DELETED, 0), @@ -130,17 +101,9 @@ public void testDeleteSingleFileInDir() throws Throwable { probe(!bulkDelete, OBJECT_DELETE_REQUEST, DELETE_OBJECT_REQUEST + DELETE_MARKER_REQUEST), - // keeping: create no parent dirs or delete parents - withWhenKeeping(DIRECTORIES_CREATED, 0), - withWhenKeeping(OBJECT_BULK_DELETE_REQUEST, 0), - - // deleting: create a parent and delete any of its parents - withWhenDeleting(DIRECTORIES_CREATED, 1), - // a bulk delete for all parents is issued. - // the number of objects in it depends on the depth of the tree; - // don't worry about that - probe(deleting && bulkDelete, OBJECT_BULK_DELETE_REQUEST, - DELETE_MARKER_REQUEST) + // create no parent dirs or delete parents + with(DIRECTORIES_CREATED, 0), + with(OBJECT_BULK_DELETE_REQUEST, 0) ); // there is an empty dir for a parent @@ -164,18 +127,13 @@ public void testDeleteFileInDir() throws Throwable { Path file1 = file(new Path(dir, "file1.txt")); Path file2 = file(new Path(dir, "file2.txt")); - boolean rawAndKeeping = !isDeleting(); - boolean rawAndDeleting = isDeleting(); verifyMetrics(() -> { fs.delete(file1, false); return "after fs.delete(file1) " + getMetricSummary(); }, - // delete file. For keeping: that's it - probe(rawAndKeeping, OBJECT_METADATA_REQUESTS, + // delete file. + probe(OBJECT_METADATA_REQUESTS, FILESTATUS_FILE_PROBE_H), - // if deleting markers, look for the parent too - probe(rawAndDeleting, OBJECT_METADATA_REQUESTS, - FILESTATUS_FILE_PROBE_H + FILESTATUS_DIR_PROBE_H), with(OBJECT_LIST_REQUEST, FILESTATUS_FILE_PROBE_L + FILESTATUS_DIR_PROBE_L), with(DIRECTORIES_DELETED, 0), @@ -184,12 +142,8 @@ public void testDeleteFileInDir() throws Throwable { // no need to create a parent with(DIRECTORIES_CREATED, 0), - // keeping: create no parent dirs or delete parents - withWhenKeeping(OBJECT_DELETE_REQUEST, DELETE_OBJECT_REQUEST), - - // deleting: create a parent and delete any of its parents - withWhenDeleting(OBJECT_DELETE_REQUEST, - DELETE_OBJECT_REQUEST)); + // create no parent dirs or delete parents + with(OBJECT_DELETE_REQUEST, DELETE_OBJECT_REQUEST)); } @Test @@ -216,19 +170,15 @@ public void testDirMarkersSubdir() throws Throwable { LOG.info("creating sub directory {}", subDir); // one dir created, possibly a parent removed final int fakeDirectoriesToDelete = directoriesInPath(subDir) - 1; + final Statistic stat = getDeleteMarkerStatistic(); verifyMetrics(() -> { mkdirs(subDir); return "after mkdir(subDir) " + getMetricSummary(); }, with(DIRECTORIES_CREATED, 1), with(DIRECTORIES_DELETED, 0), - withWhenKeeping(getDeleteMarkerStatistic(), 0), - withWhenKeeping(FAKE_DIRECTORIES_DELETED, 0), - withWhenDeleting(getDeleteMarkerStatistic(), - isBulkDelete() ? DELETE_MARKER_REQUEST : fakeDirectoriesToDelete), - // delete all possible fake dirs above the subdirectory - withWhenDeleting(FAKE_DIRECTORIES_DELETED, - fakeDirectoriesToDelete)); + with(stat, 0), + with(FAKE_DIRECTORIES_DELETED, 0)); LOG.info("About to delete {}", parent); // now delete the deep tree. @@ -237,12 +187,9 @@ public void testDirMarkersSubdir() throws Throwable { return "deleting parent dir " + parent + " " + getMetricSummary(); }, - // keeping: the parent dir marker needs deletion alongside + // the parent dir marker needs deletion alongside // the subdir one. - withWhenKeeping(OBJECT_DELETE_OBJECTS, dirsCreated), - - // deleting: only the marker at the bottom needs deleting - withWhenDeleting(OBJECT_DELETE_OBJECTS, 1)); + with(OBJECT_DELETE_OBJECTS, dirsCreated)); // followup with list calls to make sure all is clear. verifyNoListing(parent); @@ -274,10 +221,7 @@ public void testDirMarkersFileCreation() throws Throwable { Path srcDir = dir(new Path(srcBaseDir, "1/2/3/4/5/6")); - // creating a file should trigger demise of the src dir marker - // unless markers are being kept - - final int directories = directoriesInPath(srcDir); + final Statistic stat = getDeleteMarkerStatistic(); verifyMetrics(() -> { final Path srcPath = new Path(srcDir, "source.txt"); file(srcPath); @@ -286,14 +230,9 @@ public void testDirMarkersFileCreation() throws Throwable { }, with(DIRECTORIES_CREATED, 0), with(DIRECTORIES_DELETED, 0), - // keeping: no delete operations. - withWhenKeeping(getDeleteMarkerStatistic(), 0), - withWhenKeeping(FAKE_DIRECTORIES_DELETED, 0), - // delete all possible fake dirs above the file - withWhenDeleting(FAKE_DIRECTORIES_DELETED, - directories), - withWhenDeleting(getDeleteMarkerStatistic(), - isBulkDelete() ? 1: directories)); + // no delete operations. + with(stat, 0), + with(FAKE_DIRECTORIES_DELETED, 0)); } } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMiscOperationCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMiscOperationCost.java index 6a6baa03ead414..bfffc498b71aa9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMiscOperationCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMiscOperationCost.java @@ -49,7 +49,6 @@ /** * Use metrics to assert about the cost of misc operations. - * Parameterized on directory marker keep vs delete */ @RunWith(Parameterized.class) public class ITestS3AMiscOperationCost extends AbstractS3ACostTest { @@ -68,15 +67,13 @@ public class ITestS3AMiscOperationCost extends AbstractS3ACostTest { @Parameterized.Parameters(name = "{0}") public static Collection params() { return Arrays.asList(new Object[][]{ - {"keep-markers-auditing", true, true}, - {"delete-markers-unaudited", false, false} + {"auditing", true}, + {"unaudited", false} }); } public ITestS3AMiscOperationCost(final String name, - final boolean keepMarkers, final boolean auditing) { - super(keepMarkers); this.auditing = auditing; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMkdirCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMkdirCost.java index 395eac2987b3ca..262a99fdb48fd5 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMkdirCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AMkdirCost.java @@ -18,12 +18,7 @@ package org.apache.hadoop.fs.s3a.performance; -import java.util.Arrays; -import java.util.Collection; - import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,30 +35,12 @@ /** * Use metrics to assert about the cost of mkdirs. - * Parameterized directory marker keep vs delete */ -@RunWith(Parameterized.class) public class ITestS3AMkdirCost extends AbstractS3ACostTest { private static final Logger LOG = LoggerFactory.getLogger(ITestS3AMkdirCost.class); - /** - * Parameterization. - */ - @Parameterized.Parameters(name = "{0}") - public static Collection params() { - return Arrays.asList(new Object[][]{ - {"keep-markers", true}, - {"delete-markers", false} - }); - } - - public ITestS3AMkdirCost(final String name, - final boolean keepMarkers) { - super(keepMarkers); - } - /** * Common operation which should be low cost as possible. */ diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java index 68438dde2b5b14..8cd1307e0eaf6f 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3AOpenCost.java @@ -88,10 +88,6 @@ public class ITestS3AOpenCost extends AbstractS3ACostTest { */ private boolean prefetching; - public ITestS3AOpenCost() { - super(true); - } - @Override public Configuration createConfiguration() { Configuration conf = super.createConfiguration(); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ARenameCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ARenameCost.java index ff2b3c1161f2e7..9717d6455d09c9 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ARenameCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestS3ARenameCost.java @@ -18,15 +18,10 @@ package org.apache.hadoop.fs.s3a.performance; - -import java.util.Arrays; -import java.util.Collection; import java.util.UUID; import org.assertj.core.api.Assertions; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,36 +30,15 @@ import static org.apache.hadoop.fs.s3a.Statistic.*; import static org.apache.hadoop.fs.s3a.performance.OperationCost.*; -import static org.apache.hadoop.fs.s3a.performance.OperationCostValidator.probe; /** * Use metrics to assert about the cost of file API calls. - *

    - * Parameterized on directory marker keep vs delete */ -@RunWith(Parameterized.class) public class ITestS3ARenameCost extends AbstractS3ACostTest { private static final Logger LOG = LoggerFactory.getLogger(ITestS3ARenameCost.class); - /** - * Parameterization. - */ - @Parameterized.Parameters(name = "{0}") - public static Collection params() { - return Arrays.asList(new Object[][]{ - {"keep-markers", true}, - {"delete-markers", false}, - }); - } - - public ITestS3ARenameCost(final String name, - final boolean keepMarkers) { - super(keepMarkers); - - } - @Test public void testRenameFileToDifferentDirectory() throws Throwable { describe("rename a file to a different directory, " @@ -101,28 +75,10 @@ public void testRenameFileToDifferentDirectory() throws Throwable { always(RENAME_SINGLE_FILE_DIFFERENT_DIR), with(DIRECTORIES_CREATED, 0), with(DIRECTORIES_DELETED, 0), - // keeping: only the core delete operation is issued. - withWhenKeeping(OBJECT_DELETE_REQUEST, DELETE_OBJECT_REQUEST), - withWhenKeeping(FAKE_DIRECTORIES_DELETED, 0), - withWhenKeeping(OBJECT_DELETE_OBJECTS, 1), - - // deleting: delete any fake marker above the destination. - // the actual request count depends on whether bulk delete is - // enabled or not - - // no bulk delete: multiple marker calls - probe(isDeleting() && !isBulkDelete(), OBJECT_DELETE_REQUEST, - DELETE_OBJECT_REQUEST + directoriesInPath), - - // bulk delete: split up - probe(isDeleting() && isBulkDelete(), OBJECT_DELETE_REQUEST, - DELETE_OBJECT_REQUEST), - probe(isDeleting() && isBulkDelete(), OBJECT_BULK_DELETE_REQUEST, - DELETE_MARKER_REQUEST), - withWhenDeleting(FAKE_DIRECTORIES_DELETED, - directoriesInPath), - withWhenDeleting(OBJECT_DELETE_OBJECTS, - directoriesInPath + 1)); + // only the core delete operation is issued. + with(OBJECT_DELETE_REQUEST, DELETE_OBJECT_REQUEST), + with(FAKE_DIRECTORIES_DELETED, 0), + with(OBJECT_DELETE_OBJECTS, 1)); assertIsFile(destFilePath); assertIsDirectory(srcDir); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java index 3b9f31cb65c79a..69e557f80eaf00 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/performance/ITestUnbufferDraining.java @@ -97,13 +97,6 @@ public class ITestUnbufferDraining extends AbstractS3ACostTest { */ private FileSystem brittleFS; - /** - * Create with markers kept, always. - */ - public ITestUnbufferDraining() { - super(false); - } - @Override public Configuration createConfiguration() { Configuration conf = disablePrefetching(super.createConfiguration()); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/AbstractS3GuardToolTestBase.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/AbstractS3GuardToolTestBase.java index 22a4727739aca9..d4deb85f4470d0 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/AbstractS3GuardToolTestBase.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/AbstractS3GuardToolTestBase.java @@ -33,7 +33,6 @@ import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.ExitUtil; -import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.BucketInfo.IS_MARKER_AWARE; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.E_S3GUARD_UNSUPPORTED; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.INVALID_ARGUMENT; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.SUCCESS; @@ -169,12 +168,9 @@ public void testBucketInfoMarkerAware() throws Throwable { // run a bucket info command S3GuardTool.BucketInfo infocmd = toClose(new S3GuardTool.BucketInfo(conf)); - String info = exec(infocmd, S3GuardTool.BucketInfo.NAME, + exec(infocmd, S3GuardTool.BucketInfo.NAME, "-" + MARKERS, S3GuardTool.BucketInfo.MARKERS_AWARE, fsUri.toString()); - - assertTrue("Output should contain information about S3A client " + info, - info.contains(IS_MARKER_AWARE)); } /** diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/TestAuthoritativePath.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/TestAuthoritativePath.java deleted file mode 100644 index 95bb5a567f7197..00000000000000 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/TestAuthoritativePath.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3a.s3guard; - -import java.net.URI; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -import org.junit.Before; -import org.junit.Test; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.s3a.S3AUtils; -import org.apache.hadoop.test.AbstractHadoopTestBase; - -import static org.apache.hadoop.fs.s3a.Constants.AUTHORITATIVE_PATH; -import static org.apache.hadoop.fs.s3a.S3ATestConstants.UNIT_TEST_EXAMPLE_PATH; -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests of auth path resolution. - */ -public class TestAuthoritativePath extends AbstractHadoopTestBase { - - private final Path root = new Path("/"); - - private URI fsUri; - - private static final String BASE = "s3a://bucket"; - - @Before - public void setup() throws Exception { - fsUri = new URI(BASE +"/"); - } - - private Configuration authPathsConf(String... paths) { - Configuration conf = new Configuration(false); - conf.set(AUTHORITATIVE_PATH, String.join(",", paths)); - return conf; - } - - @Test - public void testResolution() throws Throwable { - assertAuthPaths(l("/one"), "/one/"); - } - - @Test - public void testResolutionWithFQP() throws Throwable { - assertAuthPaths(l("/one/", - BASE + "/two/"), - "/one/", "/two/"); - } - @Test - public void testOtherBucket() throws Throwable { - assertAuthPaths(l("/one/", - UNIT_TEST_EXAMPLE_PATH, - BASE + "/two/"), - "/one/", "/two/"); - } - - @Test - public void testOtherScheme() throws Throwable { - assertAuthPaths(l("/one/", - UNIT_TEST_EXAMPLE_PATH, - "http://bucket/two/"), - "/one/"); - } - - /** - * Get the auth paths; qualification is through - * Path.makeQualified not the FS near-equivalent. - * @param conf configuration - * @return list of auth paths. - */ - private Collection getAuthoritativePaths( - Configuration conf) { - - return S3Guard.getAuthoritativePaths(fsUri, conf, - p -> { - Path q = p.makeQualified(fsUri, root); - assertThat(q.toUri().getAuthority()) - .describedAs("Path %s", q) - .isEqualTo(fsUri.getAuthority()); - return S3AUtils.maybeAddTrailingSlash(q.toString()); - }); - } - - /** - * take a varargs list and and return as an array. - * @param s source - * @return the values - */ - private String[] l(String...s) { - return s; - } - - /** - * Assert that the authoritative paths from a source list - * are that expected. - * @param src source entries to set as auth paths - * @param expected the list of auth paths for a filesystem - */ - private void assertAuthPaths(String[] src, String...expected) { - Configuration conf = authPathsConf(src); - List collect = Arrays.stream(expected) - .map(s -> BASE + s) - .collect(Collectors.toList()); - Collection paths = getAuthoritativePaths(conf); - assertThat(paths) - .containsExactlyInAnyOrderElementsOf(collect); - } - -} diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3ADirectoryPerformance.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3ADirectoryPerformance.java index b09bd91357e7d5..8addbbe3049593 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3ADirectoryPerformance.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3ADirectoryPerformance.java @@ -53,8 +53,6 @@ import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectResponse; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_KEEP; import static org.apache.hadoop.fs.s3a.Statistic.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.*; import static org.apache.hadoop.fs.contract.ContractTestUtils.*; @@ -227,11 +225,6 @@ public void testMultiPagesListingPerformanceAndCorrectness() final Configuration conf = getConfigurationWithConfiguredBatchSize(batchSize); - removeBaseAndBucketOverrides(conf, - DIRECTORY_MARKER_POLICY); - // force directory markers = keep to save delete requests on every - // file created. - conf.set(DIRECTORY_MARKER_POLICY, DIRECTORY_MARKER_POLICY_KEEP); S3AFileSystem fs = (S3AFileSystem) FileSystem.get(dir.toUri(), conf); final List originalListOfFiles = new ArrayList<>(); @@ -260,7 +253,7 @@ public void testMultiPagesListingPerformanceAndCorrectness() null, 0, false); futures.add(submit(executorService, () -> writeOperationHelper.putObject(putObjectRequestBuilder.build(), - PutObjectOptions.keepingDirs(), + PutObjectOptions.defaultOptions(), new S3ADataBlocks.BlockUploadData(new byte[0], null), null))); } LOG.info("Waiting for PUTs to complete"); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/test/MinimalWriteOperationHelperCallbacks.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/test/MinimalWriteOperationHelperCallbacks.java index 5c50ebff5c6b00..c90ac823ad8e0d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/test/MinimalWriteOperationHelperCallbacks.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/test/MinimalWriteOperationHelperCallbacks.java @@ -30,7 +30,6 @@ import software.amazon.awssdk.services.s3.model.UploadPartResponse; import org.apache.hadoop.fs.s3a.WriteOperationHelper; -import org.apache.hadoop.fs.s3a.impl.PutObjectOptions; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; /** @@ -70,11 +69,5 @@ public UploadPartResponse uploadPart(final UploadPartRequest request, return s3clientSupplier.get().uploadPart(request, body); } - @Override - public void finishedWrite(final String key, - final long length, - final PutObjectOptions putOptions) { - - } } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/AbstractMarkerToolTest.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/AbstractMarkerToolTest.java index b72335d9a7a898..d5f91ac0fa686a 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/AbstractMarkerToolTest.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/AbstractMarkerToolTest.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.net.URI; import java.util.List; import org.assertj.core.api.Assertions; @@ -32,23 +31,19 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.s3a.AbstractS3ATestBase; -import org.apache.hadoop.fs.s3a.S3AFileSystem; -import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.StringUtils; import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.disableFilesystemCaching; import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; -import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBucketOverrides; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.VERBOSE; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.runS3GuardCommand; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.runS3GuardCommandToFailure; import static org.apache.hadoop.fs.s3a.tools.MarkerTool.UNLIMITED_LISTING; /** - * Class for marker tool tests -sets up keeping/deleting filesystems, - * has methods to invoke. + * Class for marker tool tests. */ public class AbstractMarkerToolTest extends AbstractS3ATestBase { @@ -58,26 +53,15 @@ public class AbstractMarkerToolTest extends AbstractS3ATestBase { /** the -verbose option. */ protected static final String V = AbstractMarkerToolTest.m(VERBOSE); - /** FS which keeps markers. */ - private S3AFileSystem keepingFS; - - /** FS which deletes markers. */ - private S3AFileSystem deletingFS; - - /** FS which mixes markers; only created in some tests. */ - private S3AFileSystem mixedFS; @Override protected Configuration createConfiguration() { Configuration conf = super.createConfiguration(); String bucketName = getTestBucketName(conf); removeBaseAndBucketOverrides(bucketName, conf, S3A_BUCKET_PROBE, - DIRECTORY_MARKER_POLICY, AUTHORITATIVE_PATH, FS_S3A_CREATE_PERFORMANCE, FS_S3A_PERFORMANCE_FLAGS); - // base FS is legacy - conf.set(DIRECTORY_MARKER_POLICY, DIRECTORY_MARKER_POLICY_DELETE); conf.setBoolean(FS_S3A_CREATE_PERFORMANCE, false); // turn off bucket probes for a bit of speedup in the connectors we create. @@ -86,54 +70,14 @@ protected Configuration createConfiguration() { return conf; } - @Override - public void setup() throws Exception { - super.setup(); - setKeepingFS(createFS(DIRECTORY_MARKER_POLICY_KEEP, null)); - setDeletingFS(createFS(DIRECTORY_MARKER_POLICY_DELETE, null)); - } - @Override public void teardown() throws Exception { // do this ourselves to avoid audits teardown failing // when surplus markers are found deleteTestDirInTeardown(); super.teardown(); - IOUtils.cleanupWithLogger(LOG, getKeepingFS(), - getMixedFS(), getDeletingFS()); - } - /** - * FS which deletes markers. - */ - public S3AFileSystem getDeletingFS() { - return deletingFS; - } - - public void setDeletingFS(final S3AFileSystem deletingFS) { - this.deletingFS = deletingFS; - } - - /** - * FS which keeps markers. - */ - protected S3AFileSystem getKeepingFS() { - return keepingFS; - } - - private void setKeepingFS(S3AFileSystem keepingFS) { - this.keepingFS = keepingFS; - } - - /** only created on demand. */ - private S3AFileSystem getMixedFS() { - return mixedFS; - } - - protected void setMixedFS(S3AFileSystem mixedFS) { - this.mixedFS = mixedFS; - } /** * Get a filename for a temp file. @@ -178,53 +122,19 @@ protected List readOutput(final File outputFile) } } - /** - * Create a new FS with given marker policy and path. - * This filesystem MUST be closed in test teardown. - * @param markerPolicy markers - * @param authPath authoritative path. If null: no path. - * @return a new FS. - */ - protected S3AFileSystem createFS(String markerPolicy, - String authPath) throws Exception { - S3AFileSystem testFS = getFileSystem(); - Configuration conf = new Configuration(testFS.getConf()); - URI testFSUri = testFS.getUri(); - String bucketName = getTestBucketName(conf); - removeBucketOverrides(bucketName, conf, - DIRECTORY_MARKER_POLICY, - BULK_DELETE_PAGE_SIZE, - AUTHORITATIVE_PATH); - if (authPath != null) { - conf.set(AUTHORITATIVE_PATH, authPath); - } - // Use a very small page size to force the paging - // code to be tested. - conf.setInt(BULK_DELETE_PAGE_SIZE, 2); - conf.set(DIRECTORY_MARKER_POLICY, markerPolicy); - S3AFileSystem fs2 = new S3AFileSystem(); - fs2.initialize(testFSUri, conf); - LOG.info("created new filesystem with policy {} and auth path {}", - markerPolicy, - (authPath == null ? "(null)": authPath)); - return fs2; - } - /** * Execute the marker tool, expecting the execution to succeed. * @param sourceFS filesystem to use * @param path path to scan - * @param doPurge should markers be purged * @param expectedMarkerCount number of markers expected * @return the result */ protected MarkerTool.ScanResult markerTool( final FileSystem sourceFS, final Path path, - final boolean doPurge, final int expectedMarkerCount) throws IOException { - return markerTool(0, sourceFS, path, doPurge, + return markerTool(0, sourceFS, path, false, expectedMarkerCount, UNLIMITED_LISTING, false); } @@ -315,7 +225,6 @@ public static MarkerTool.ScanResult markerTool( .withMinMarkerCount(expectedMarkers) .withMaxMarkerCount(expectedMarkers) .withLimit(limit) - .withNonAuth(nonAuth) .build()); Assertions.assertThat(result.getExitCode()) .describedAs("Exit code of marker(%s, %s, %d) -> %s", diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java index ab22c51f28b7ba..b6d41c4139ac94 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/tools/ITestMarkerTool.java @@ -35,12 +35,9 @@ import org.apache.hadoop.fs.s3a.test.PublicDatasetTestUtils; import org.apache.hadoop.fs.s3a.S3AFileSystem; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_AUTHORITATIVE; -import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_DELETE; import static org.apache.hadoop.fs.s3a.Constants.DIRECTORY_MARKER_POLICY_KEEP; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.BucketInfo.BUCKET_INFO; import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.runS3GuardCommand; -import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.runS3GuardCommandToFailure; import static org.apache.hadoop.fs.s3a.tools.MarkerTool.*; import static org.apache.hadoop.service.launcher.LauncherExitCodes.EXIT_INTERRUPTED; import static org.apache.hadoop.service.launcher.LauncherExitCodes.EXIT_NOT_ACCEPTABLE; @@ -48,8 +45,7 @@ import static org.apache.hadoop.service.launcher.LauncherExitCodes.EXIT_USAGE; /** - * Test the marker tool and use it to compare the behavior - * of keeping vs legacy S3A FS instances. + * Test the marker tools. */ public class ITestMarkerTool extends AbstractMarkerToolTest { @@ -81,126 +77,40 @@ public class ITestMarkerTool extends AbstractMarkerToolTest { */ private int expectedMarkersWithBaseDir; - - @Test - public void testCleanMarkersLegacyDir() throws Throwable { - describe("Clean markers under a deleting FS -expect none"); - CreatedPaths createdPaths = createPaths(getDeletingFS(), methodPath()); - markerTool(getDeletingFS(), createdPaths.base, false, 0); - markerTool(getDeletingFS(), createdPaths.base, true, 0); - } - @Test public void testCleanMarkersFileLimit() throws Throwable { - describe("Clean markers under a keeping FS -with file limit"); - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); + describe("Clean markers with file limit"); + CreatedPaths createdPaths = createPaths(getFileSystem(), methodPath()); // audit will be interrupted - markerTool(EXIT_INTERRUPTED, getDeletingFS(), + markerTool(EXIT_INTERRUPTED, getFileSystem(), createdPaths.base, false, 0, 1, false); } @Test - public void testCleanMarkersKeepingDir() throws Throwable { - describe("Audit then clean markers under a deleting FS " - + "-expect markers to be found and then cleaned up"); - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); - - // audit will find the expected entries - int expectedMarkerCount = createdPaths.dirs.size(); - S3AFileSystem fs = getDeletingFS(); - LOG.info("Auditing a directory with retained markers -expect failure"); - markerTool(EXIT_NOT_ACCEPTABLE, fs, - createdPaths.base, false, 0, UNLIMITED_LISTING, false); - - LOG.info("Auditing a directory expecting retained markers"); - markerTool(fs, createdPaths.base, false, - expectedMarkerCount); - - // we require that a purge didn't take place, so run the - // audit again. - LOG.info("Auditing a directory expecting retained markers"); - markerTool(fs, createdPaths.base, false, - expectedMarkerCount); - - LOG.info("Purging a directory of retained markers"); - // purge cleans up - assertMarkersDeleted(expectedMarkerCount, - markerTool(fs, createdPaths.base, true, expectedMarkerCount)); - // and a rerun doesn't find markers - LOG.info("Auditing a directory with retained markers -expect success"); - assertMarkersDeleted(0, - markerTool(fs, createdPaths.base, true, 0)); - } - - @Test - public void testRenameKeepingFS() throws Throwable { - describe("Rename with the keeping FS -verify that no markers" + public void testRenameDoesntCopyMarkers() throws Throwable { + describe("Rename with and verify that no markers" + " exist at far end"); Path base = methodPath(); Path source = new Path(base, "source"); Path dest = new Path(base, "dest"); - S3AFileSystem fs = getKeepingFS(); + S3AFileSystem fs = getFileSystem(); CreatedPaths createdPaths = createPaths(fs, source); // audit will find three entries int expectedMarkerCount = createdPaths.dirs.size(); - markerTool(fs, source, false, expectedMarkerCount); + markerTool(fs, source, expectedMarkerCount); fs.rename(source, dest); assertIsDirectory(dest); // there are no markers - markerTool(fs, dest, false, 0); + markerTool(fs, dest, 0); LOG.info("Auditing destination paths"); verifyRenamed(dest, createdPaths); } - /** - * Create a FS where only dir2 in the source tree keeps markers; - * verify all is good. - */ - @Test - public void testAuthPathIsMixed() throws Throwable { - describe("Create a source tree with mixed semantics"); - Path base = methodPath(); - Path source = new Path(base, "source"); - Path dest = new Path(base, "dest"); - Path dir2 = new Path(source, "dir2"); - S3AFileSystem mixedFSDir2 = createFS(DIRECTORY_MARKER_POLICY_AUTHORITATIVE, - dir2.toUri().toString()); - // line up for close in teardown - setMixedFS(mixedFSDir2); - // some of these paths will retain markers, some will not - CreatedPaths createdPaths = createPaths(mixedFSDir2, source); - - // markers are only under dir2 - markerTool(mixedFSDir2, toPath(source, "dir1"), false, 0); - markerTool(mixedFSDir2, source, false, expectedMarkersUnderDir2); - - // full scan of source will fail - markerTool(EXIT_NOT_ACCEPTABLE, - mixedFSDir2, source, false, 0, 0, false); - - // but add the -nonauth option and the markers under dir2 are skipped - markerTool(0, mixedFSDir2, source, false, 0, 0, true); - - // if we now rename, all will be good - LOG.info("Executing rename"); - mixedFSDir2.rename(source, dest); - assertIsDirectory(dest); - - // there are no markers - MarkerTool.ScanResult scanResult = markerTool(mixedFSDir2, dest, false, 0); - // there are exactly the files we want - Assertions.assertThat(scanResult) - .describedAs("Scan result %s", scanResult) - .extracting(s -> s.getTracker().getFilesFound()) - .isEqualTo(expectedFileCount); - verifyRenamed(dest, createdPaths); - } - /** * Assert that an expected number of markers were deleted. * @param expected expected count. @@ -247,8 +157,7 @@ public void testRunTooManyActions() throws Throwable { @Test public void testRunAuditWithExpectedMarkers() throws Throwable { describe("Run a verbose audit expecting some markers"); - // a run under the keeping FS will create paths - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); + CreatedPaths createdPaths = createPaths(getFileSystem(), methodPath()); final File audit = tempAuditFile(); run(MARKERS, V, AUDIT, @@ -260,28 +169,10 @@ public void testRunAuditWithExpectedMarkers() throws Throwable { expectMarkersInOutput(audit, expectedMarkersWithBaseDir); } - @Test - public void testRunAuditWithExpectedMarkersSwappedMinMax() throws Throwable { - describe("Run a verbose audit with the min/max ranges swapped;" - + " see HADOOP-17332"); - // a run under the keeping FS will create paths - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); - final File audit = tempAuditFile(); - run(MARKERS, V, - AUDIT, - m(OPT_LIMIT), 0, - m(OPT_OUT), audit, - m(OPT_MIN), expectedMarkersWithBaseDir + 1, - m(OPT_MAX), expectedMarkersWithBaseDir - 1, - createdPaths.base); - expectMarkersInOutput(audit, expectedMarkersWithBaseDir); - } - @Test public void testRunAuditWithExcessMarkers() throws Throwable { describe("Run a verbose audit failing as surplus markers were found"); - // a run under the keeping FS will create paths - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); + CreatedPaths createdPaths = createPaths(getFileSystem(), methodPath()); final File audit = tempAuditFile(); runToFailure(EXIT_NOT_ACCEPTABLE, MARKERS, V, AUDIT, @@ -293,7 +184,7 @@ public void testRunAuditWithExcessMarkers() throws Throwable { @Test public void testRunLimitedAudit() throws Throwable { describe("Audit with a limited number of files (2)"); - CreatedPaths createdPaths = createPaths(getKeepingFS(), methodPath()); + CreatedPaths createdPaths = createPaths(getFileSystem(), methodPath()); runToFailure(EXIT_INTERRUPTED, MARKERS, V, m(OPT_LIMIT), 2, @@ -325,47 +216,14 @@ public void testRunAuditManyObjectsInBucket() throws Throwable { } @Test - public void testBucketInfoKeepingOnDeleting() throws Throwable { - describe("Run bucket info with the keeping config on the deleting fs"); - runS3GuardCommandToFailure(uncachedFSConfig(getDeletingFS()), - EXIT_NOT_ACCEPTABLE, - BUCKET_INFO, - m(MARKERS), DIRECTORY_MARKER_POLICY_KEEP, - methodPath()); - } - - @Test - public void testBucketInfoKeepingOnKeeping() throws Throwable { - describe("Run bucket info with the keeping config on the keeping fs"); - runS3GuardCommand(uncachedFSConfig(getKeepingFS()), + public void testBucketInfoKeeping() throws Throwable { + describe("Run bucket info with the keeping option"); + runS3GuardCommand(uncachedFSConfig(getFileSystem()), BUCKET_INFO, m(MARKERS), DIRECTORY_MARKER_POLICY_KEEP, methodPath()); } - @Test - public void testBucketInfoDeletingOnDeleting() throws Throwable { - describe("Run bucket info with the deleting config on the deleting fs"); - runS3GuardCommand(uncachedFSConfig(getDeletingFS()), - BUCKET_INFO, - m(MARKERS), DIRECTORY_MARKER_POLICY_DELETE, - methodPath()); - } - - @Test - public void testBucketInfoAuthOnAuth() throws Throwable { - describe("Run bucket info with the auth FS"); - Path base = methodPath(); - - S3AFileSystem authFS = createFS(DIRECTORY_MARKER_POLICY_AUTHORITATIVE, - base.toUri().toString()); - // line up for close in teardown - setMixedFS(authFS); - runS3GuardCommand(uncachedFSConfig(authFS), - BUCKET_INFO, - m(MARKERS), DIRECTORY_MARKER_POLICY_AUTHORITATIVE, - methodPath()); - } /** * Tracker of created paths. diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/TestS3xLoginHelper.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/TestS3xLoginHelper.java deleted file mode 100644 index 10409df99f1ef6..00000000000000 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3native/TestS3xLoginHelper.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3native; - -import java.net.URI; -import java.net.URISyntaxException; - -import org.junit.Assert; -import org.junit.Test; - - -import static org.apache.hadoop.test.LambdaTestUtils.intercept; - -/** - * Test how URIs and login details are extracted from URIs. - */ -public class TestS3xLoginHelper extends Assert { - public static final String BUCKET = "s3a://bucket"; - private static final URI ENDPOINT = uri(BUCKET); - public static final String S = "%2f"; - public static final String P = "%2b"; - public static final String P_RAW = "+"; - public static final String USER = "user"; - public static final String PASLASHSLASH = "pa" + S + S; - public static final String PAPLUS = "pa" + P; - public static final String PAPLUS_RAW = "pa" + P_RAW; - - public static final URI WITH_USER_AND_PASS = uri("s3a://user:pass@bucket"); - - public static final URI WITH_SLASH_IN_PASS = uri( - "s3a://user:" + PASLASHSLASH + "@bucket"); - public static final URI WITH_PLUS_IN_PASS = uri( - "s3a://user:" + PAPLUS + "@bucket"); - public static final URI WITH_PLUS_RAW_IN_PASS = uri( - "s3a://user:" + PAPLUS_RAW + "@bucket"); - public static final URI USER_NO_PASS = uri("s3a://user@bucket"); - public static final URI WITH_USER_AND_COLON = uri("s3a://user:@bucket"); - public static final URI NO_USER = uri("s3a://:pass@bucket"); - public static final URI NO_USER_NO_PASS = uri("s3a://:@bucket"); - public static final URI NO_USER_NO_PASS_TWO_COLON = uri("s3a://::@bucket"); - - /** - * Construct a URI; raises an RTE if it won't parse. - * This allows it to be used in static constructors. - * @param s URI string - * @return the URI - * @throws RuntimeException on a URI syntax problem - */ - private static URI uri(String s) { - try { - return new URI(s); - } catch (URISyntaxException e) { - throw new RuntimeException(e.toString(), e); - } - } - - /** - * Assert that a built up FS URI matches the endpoint. - * @param uri URI to build the FS URI from - */ - private void assertMatchesEndpoint(URI uri) { - assertEquals("Source " + uri, - ENDPOINT, S3xLoginHelper.buildFSURI(uri)); - } - - /** - * Assert that the supplied FS URI is invalid as it contains - * username:password secrets. - * @param uri URI to build the FS URI from - */ - private void assertInvalid(URI uri) throws Exception { - intercept(IllegalArgumentException.class, - S3xLoginHelper.LOGIN_WARNING, - () -> S3xLoginHelper.buildFSURI(uri)); - } - - /** - * Assert that the login/pass details from a URI match that expected. - * @param user username - * @param pass password - * @param uri URI to build login details from - * @return the login tuple - */ - private S3xLoginHelper.Login assertMatchesLogin(String user, - String pass, URI uri) { - S3xLoginHelper.Login expected = new S3xLoginHelper.Login(user, pass); - S3xLoginHelper.Login actual = S3xLoginHelper.extractLoginDetails(uri); - if (!expected.equals(actual)) { - Assert.fail("Source " + uri - + " login expected=:" + toString(expected) - + " actual=" + toString(actual)); - } - return actual; - } - - @Test - public void testSimpleFSURI() throws Throwable { - assertMatchesEndpoint(ENDPOINT); - } - - @Test - public void testLoginSimple() throws Throwable { - S3xLoginHelper.Login login = assertMatchesLogin("", "", ENDPOINT); - assertFalse("Login of " + login, login.hasLogin()); - } - - @Test - public void testLoginWithUser() throws Throwable { - assertMatchesLogin(USER, "", USER_NO_PASS); - } - - @Test - public void testLoginWithUserAndColon() throws Throwable { - assertMatchesLogin(USER, "", WITH_USER_AND_COLON); - } - - @Test - public void testLoginNoUser() throws Throwable { - assertMatchesLogin("", "", NO_USER); - } - - @Test - public void testLoginNoUserNoPass() throws Throwable { - assertMatchesLogin("", "", NO_USER_NO_PASS); - } - - @Test - public void testLoginNoUserNoPassTwoColon() throws Throwable { - assertMatchesLogin("", "", NO_USER_NO_PASS_TWO_COLON); - } - - @Test - public void testFsUriWithUserAndPass() throws Throwable { - assertInvalid(WITH_USER_AND_PASS); - } - - @Test - public void testFsUriWithSlashInPass() throws Throwable { - assertInvalid(WITH_SLASH_IN_PASS); - } - - @Test - public void testFsUriWithPlusInPass() throws Throwable { - assertInvalid(WITH_PLUS_IN_PASS); - } - - @Test - public void testFsUriWithPlusRawInPass() throws Throwable { - assertInvalid(WITH_PLUS_RAW_IN_PASS); - } - - @Test - public void testFsUriWithUser() throws Throwable { - assertInvalid(USER_NO_PASS); - } - - @Test - public void testFsUriWithUserAndColon() throws Throwable { - assertInvalid(WITH_USER_AND_COLON); - } - - @Test - public void testFsiNoUser() throws Throwable { - assertMatchesEndpoint(NO_USER); - } - - @Test - public void testFsUriNoUserNoPass() throws Throwable { - assertMatchesEndpoint(NO_USER_NO_PASS); - } - - @Test - public void testFsUriNoUserNoPassTwoColon() throws Throwable { - assertMatchesEndpoint(NO_USER_NO_PASS_TWO_COLON); - } - - /** - * Stringifier. Kept in the code to avoid accidental logging in production - * code. - * @return login details for assertions. - */ - public String toString(S3xLoginHelper.Login login) { - final StringBuilder sb = new StringBuilder("LoginTuple{"); - sb.append("<'").append(login.getUser()).append('\''); - sb.append(", '").append(login.getPassword()).append('\''); - sb.append('>'); - return sb.toString(); - } -} From ca749694ac9393d95eb5e4a22e4ba3e5b131e666 Mon Sep 17 00:00:00 2001 From: rajdchak Date: Fri, 17 Jan 2025 13:03:31 +0000 Subject: [PATCH 09/13] Refactor integration for s3aseekablestream Renamed some files Addressed comments --- .../org/apache/hadoop/fs/s3a/Constants.java | 13 ---- .../apache/hadoop/fs/s3a/S3AFileSystem.java | 54 +------------- ...tream.java => S3ASeekableInputStream.java} | 45 +++++++---- .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 31 ++++++-- .../fs/s3a/impl/streams/InputStreamType.java | 17 +++-- .../S3ASeekableInputStreamFactory.java | 74 +++++++++++++++++++ .../s3a/impl/streams/StreamIntegration.java | 15 +++- .../fs/s3a/ITestS3APrefetchingCacheFiles.java | 2 - .../s3a/ITestS3APrefetchingInputStream.java | 3 - .../s3a/ITestS3APrefetchingLruEviction.java | 2 - .../fs/s3a/ITestS3AS3SeekableStream.java | 14 ++-- .../apache/hadoop/fs/s3a/S3ATestUtils.java | 5 +- 12 files changed, 164 insertions(+), 111 deletions(-) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{S3ASeekableStream.java => S3ASeekableInputStream.java} (81%) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java index 1d4985ca428fe4..43f8a3d8eb5358 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java @@ -1814,13 +1814,6 @@ private Constants() { public static final String ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX = "fs.s3a.analytics.accelerator"; - /** - * Config to enable Analytics Accelerator Library for Amazon S3. - * https://github.com/awslabs/analytics-accelerator-s3 - */ - public static final String ANALYTICS_ACCELERATOR_ENABLED_KEY = - ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX + ".enabled"; - /** * Config to enable usage of crt client with Analytics Accelerator Library. * It is by default true. @@ -1828,12 +1821,6 @@ private Constants() { public static final String ANALYTICS_ACCELERATOR_CRT_ENABLED = "fs.s3a.analytics.accelerator.crt.client"; - /** - * Default value for {@link #ANALYTICS_ACCELERATOR_ENABLED_KEY } - * Value {@value}. - */ - public static final boolean ANALYTICS_ACCELERATOR_ENABLED_DEFAULT = false; - /** * Default value for {@link #ANALYTICS_ACCELERATOR_CRT_ENABLED } * Value {@value}. 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 3603036c721e0e..ba64961b60612a 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 @@ -51,10 +51,9 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; +import org.apache.hadoop.fs.s3a.impl.streams.InputStreamType; import software.amazon.awssdk.core.exception.SdkException; -import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.GetBucketLocationRequest; @@ -85,11 +84,6 @@ import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; -import software.amazon.s3.analyticsaccelerator.S3SdkObjectClient; -import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; -import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; -import software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration; - import org.apache.hadoop.fs.impl.prefetch.ExecutorServiceFuturePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -316,13 +310,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, */ private S3Client s3Client; - /** - * CRT-Based S3Client created of analytics accelerator library is enabled - * and managed by the S3AStoreImpl. Analytics accelerator library can be - * enabled with {@link Constants#ANALYTICS_ACCELERATOR_ENABLED_KEY} - */ - private S3AsyncClient s3AsyncClient; - // initial callback policy is fail-once; it's there just to assist // some mock tests and other codepaths trying to call the low level // APIs on an uninitialized filesystem. @@ -522,11 +509,6 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities, */ private boolean s3AccessGrantsEnabled; - /** - * Factory to create S3SeekableInputStream if {@link this#analyticsAcceleratorEnabled} is true. - */ - private S3SeekableInputStreamFactory s3SeekableInputStreamFactory; - /** Add any deprecated keys. */ @SuppressWarnings("deprecation") private static void addDeprecatedKeys() { @@ -673,8 +655,7 @@ public void initialize(URI name, Configuration originalConf) dirOperationsPurgeUploads = conf.getBoolean(DIRECTORY_OPERATIONS_PURGE_UPLOADS, s3ExpressStore); - this.analyticsAcceleratorEnabled = - conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); + this.analyticsAcceleratorEnabled = conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics; this.analyticsAcceleratorCRTEnabled = conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); @@ -812,27 +793,6 @@ public void initialize(URI name, Configuration originalConf) // thread pool init requires store to be created initThreadPools(); - - if (this.analyticsAcceleratorEnabled) { - LOG.info("Using S3SeekableInputStream"); - if(this.analyticsAcceleratorCRTEnabled) { - LOG.info("Using S3 CRT client for analytics accelerator S3"); - this.s3AsyncClient = S3CrtAsyncClient.builder().maxConcurrency(600).build(); - } else { - LOG.info("Using S3 async client for analytics accelerator S3"); - this.s3AsyncClient = store.getOrCreateAsyncClient(); - } - - ConnectorConfiguration configuration = new ConnectorConfiguration(conf, - ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); - S3SeekableInputStreamConfiguration seekableInputStreamConfiguration = - S3SeekableInputStreamConfiguration.fromConfiguration(configuration); - this.s3SeekableInputStreamFactory = - new S3SeekableInputStreamFactory( - new S3SdkObjectClient(this.s3AsyncClient), - seekableInputStreamConfiguration); - } - // The filesystem is now ready to perform operations against // S3 // This initiates a probe against S3 for the bucket existing. @@ -1934,14 +1894,6 @@ private FSDataInputStream executeOpen( true, inputStreamStats); - if (this.analyticsAcceleratorEnabled) { - return new FSDataInputStream( - new S3ASeekableStream( - this.bucket, - pathToKey(path), - s3SeekableInputStreamFactory)); - } - // do not validate() the parameters as the store // completes this. ObjectReadParameters parameters = new ObjectReadParameters() @@ -4348,8 +4300,6 @@ protected synchronized void stopAllServices() { closeAutocloseables(LOG, getStore()); store = null; s3Client = null; - s3AsyncClient = null; - s3SeekableInputStreamFactory = null; // At this point the S3A client is shut down, // now the executor pools are closed diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java similarity index 81% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java index ef6a299081587d..6eaf0217aacaf6 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java @@ -24,28 +24,27 @@ import org.apache.hadoop.fs.FSExceptionMessages; import org.apache.hadoop.fs.StreamCapabilities; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.hadoop.fs.FSInputStream; - import software.amazon.s3.analyticsaccelerator.S3SeekableInputStream; -import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; import software.amazon.s3.analyticsaccelerator.util.S3URI; -public class S3ASeekableStream extends FSInputStream implements StreamCapabilities { +public class S3ASeekableInputStream extends ObjectInputStream implements StreamCapabilities { private S3SeekableInputStream inputStream; private long lastReadCurrentPos = 0; - private final String key; private volatile boolean closed; - public static final Logger LOG = LoggerFactory.getLogger(S3ASeekableStream.class); + public static final Logger LOG = LoggerFactory.getLogger(S3ASeekableInputStream.class); - public S3ASeekableStream(String bucket, String key, - S3SeekableInputStreamFactory s3SeekableInputStreamFactory) { - this.inputStream = s3SeekableInputStreamFactory.createStream(S3URI.of(bucket, key)); - this.key = key; + public S3ASeekableInputStream(final ObjectReadParameters parameters, final S3SeekableInputStreamFactory s3SeekableInputStreamFactory) { + super(parameters); + S3ObjectAttributes s3Attributes = parameters.getObjectAttributes(); + this.inputStream = s3SeekableInputStreamFactory.createStream(S3URI.of(s3Attributes.getBucket(), s3Attributes.getKey())); } /** @@ -139,6 +138,24 @@ public int available() throws IOException { return super.available(); } + @Override + protected boolean isStreamOpen() { + return !isClosed(); + } + + protected boolean isClosed() { + return inputStream == null; + } + + @Override + protected void abortInFinalizer() { + try { + close(); + } catch (IOException ignored) { + + } + } + @Override public synchronized void close() throws IOException { if(!closed) { @@ -148,7 +165,7 @@ public synchronized void close() throws IOException { inputStream = null; super.close(); } catch (IOException ioe) { - LOG.debug("Failure closing stream {}: ", key); + LOG.debug("Failure closing stream {}: ", getKey()); throw ioe; } } @@ -165,11 +182,11 @@ private void onReadFailure(IOException ioe) throws IOException { if (LOG.isDebugEnabled()) { LOG.debug("Got exception while trying to read from stream {}, " + "not trying to recover:", - key, ioe); + getKey(), ioe); } else { LOG.info("Got exception while trying to read from stream {}, " + "not trying to recover:", - key, ioe); + getKey(), ioe); } this.close(); } @@ -177,7 +194,7 @@ private void onReadFailure(IOException ioe) throws IOException { protected void throwIfClosed() throws IOException { if (closed) { - throw new IOException(key + ": " + FSExceptionMessages.STREAM_IS_CLOSED); + throw new IOException(getKey() + ": " + FSExceptionMessages.STREAM_IS_CLOSED); } } } \ No newline at end of file diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index e2fbb07f2440cd..e9f53132735802 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -29,6 +29,7 @@ import java.util.concurrent.CompletionException; import javax.annotation.Nullable; +import org.apache.hadoop.fs.s3a.impl.streams.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.awscore.exception.AwsServiceException; @@ -37,6 +38,7 @@ import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; @@ -73,10 +75,6 @@ import org.apache.hadoop.fs.s3a.UploadInfo; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.audit.AuditSpanS3A; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; -import org.apache.hadoop.fs.s3a.impl.streams.StreamThreadOptions; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTracker; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; @@ -88,8 +86,7 @@ import org.apache.hadoop.util.functional.Tuples; import static java.util.Objects.requireNonNull; -import static org.apache.hadoop.fs.s3a.Constants.BUFFER_DIR; -import static org.apache.hadoop.fs.s3a.Constants.HADOOP_TMP_DIR; +import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3AUtils.extractException; import static org.apache.hadoop.fs.s3a.S3AUtils.getPutRequestLength; import static org.apache.hadoop.fs.s3a.S3AUtils.isThrottleException; @@ -230,13 +227,33 @@ public class S3AStoreImpl @Override protected void serviceInit(final Configuration conf) throws Exception { - objectInputStreamFactory = createStreamFactory(conf); + if(conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics) { + final S3AsyncClient s3AsyncClient = getOrCreateAsyncCRTClient(conf); + objectInputStreamFactory = createStreamFactory(conf, s3AsyncClient); + } else { + objectInputStreamFactory = createStreamFactory(conf); + } addService(objectInputStreamFactory); // init all child services super.serviceInit(conf); } + private S3AsyncClient getOrCreateAsyncCRTClient(final Configuration conf) throws Exception { + final S3AsyncClient s3AsyncClient; + boolean analyticsAcceleratorCRTEnabled = conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, + ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); + LOG.info("Using S3SeekableInputStream"); + if(analyticsAcceleratorCRTEnabled) { + LOG.info("Using S3 CRT client for analytics accelerator S3"); + s3AsyncClient = S3CrtAsyncClient.builder().maxConcurrency(600).build(); + } else { + LOG.info("Using S3 async client for analytics accelerator S3"); + s3AsyncClient = getOrCreateAsyncClient(); + } + return s3AsyncClient; + } + @Override protected void serviceStart() throws Exception { super.serviceStart(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java index 4ca9a6305a2372..ef226d43a7b7ff 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -18,10 +18,12 @@ package org.apache.hadoop.fs.s3a.impl.streams; +import java.util.function.BiFunction; import java.util.function.Function; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; +import software.amazon.awssdk.services.s3.S3AsyncClient; /** * Enum of input stream types. @@ -40,20 +42,17 @@ public enum InputStreamType { */ Prefetch("prefetch", c -> new PrefetchingInputStreamFactory()), - /** * The analytics input stream. */ - Analytics("analytics", c -> { - throw new IllegalArgumentException("not yet supported"); - }); + Analytics("analytics", (c, s3AsyncClient) -> new S3ASeekableInputStreamFactory(s3AsyncClient)); /** * Name. */ private final String name; - private final Function factory; + private final BiFunction factory; /** * String name. * @return the name @@ -62,7 +61,11 @@ public String getName() { return name; } - InputStreamType(String name, final Function factory) { + InputStreamType(String name, Function factory) { + this(name, (c, s) -> factory.apply(c)); + } + + InputStreamType(String name, BiFunction factory) { this.name = name; this.factory = factory; } @@ -71,7 +74,7 @@ public String getName() { * Factory constructor. * @return the factory associated with this stream type. */ - public Function factory() { + public BiFunction factory() { return factory; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java new file mode 100644 index 00000000000000..a3c4e5908356dc --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java @@ -0,0 +1,74 @@ +/* + * 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.apache.hadoop.fs.s3a.impl.streams; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.s3a.S3ASeekableInputStream; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.s3.analyticsaccelerator.S3SdkObjectClient; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; +import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; +import software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration; + +import java.io.IOException; + +import static org.apache.hadoop.fs.s3a.Constants.*; + +public class S3ASeekableInputStreamFactory extends AbstractObjectInputStreamFactory { + + private final S3AsyncClient s3AsyncClient; + private S3SeekableInputStreamFactory s3SeekableInputStreamFactory; + + public S3ASeekableInputStreamFactory(S3AsyncClient s3AsyncClient) { + super("S3ASeekableInputStreamFactory"); + this.s3AsyncClient = s3AsyncClient; + } + + @Override + protected void serviceInit(final Configuration conf) throws Exception { + super.serviceInit(conf); + ConnectorConfiguration configuration = new ConnectorConfiguration(conf, + ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); + S3SeekableInputStreamConfiguration seekableInputStreamConfiguration = + S3SeekableInputStreamConfiguration.fromConfiguration(configuration); + this.s3SeekableInputStreamFactory = + new S3SeekableInputStreamFactory( + new S3SdkObjectClient(this.s3AsyncClient), + seekableInputStreamConfiguration); + } + + @Override + public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { + return new S3ASeekableInputStream( + parameters, + s3SeekableInputStreamFactory); + } + + /** + * Get the number of background threads required for this factory. + * @return the count of background threads. + */ + @Override + public StreamThreadOptions threadRequirements() { + return new StreamThreadOptions(0, 0, false, false); + } + + +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index 85ca41beaf914d..67a06075376528 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -23,6 +23,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.store.LogExactlyOnce; +import software.amazon.awssdk.services.s3.S3AsyncClient; import static org.apache.hadoop.fs.s3a.Constants.INPUT_STREAM_TYPE; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_ENABLED_KEY; @@ -57,6 +58,18 @@ public static ObjectInputStreamFactory createStreamFactory(final Configuration c } return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) .factory() - .apply(conf); + .apply(conf, null); } + + /** + * Create the s3 seekable input stream factory. + * @param s3AsyncClient s3 async client + * @return a stream factory. + */ + public static ObjectInputStreamFactory createStreamFactory(final Configuration conf, final S3AsyncClient s3AsyncClient) { + InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; + return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) + .factory() + .apply(conf, s3AsyncClient); } + } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java index e9e8410c344705..679c4b5afbfd72 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingCacheFiles.java @@ -91,8 +91,6 @@ public Configuration createConfiguration() { final String bufferDirBase = configuration.get(BUFFER_DIR); bufferDir = bufferDirBase + "/" + UUID.randomUUID(); configuration.set(BUFFER_DIR, bufferDir); - // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used - configuration.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return configuration; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java index 1d904be28dd4cb..d894adb66c7388 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingInputStream.java @@ -34,7 +34,6 @@ import org.apache.hadoop.fs.statistics.IOStatistics; import org.apache.hadoop.test.LambdaTestUtils; -import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_ENABLED_KEY; import static org.apache.hadoop.fs.s3a.Constants.PREFETCH_BLOCK_SIZE_KEY; import static org.apache.hadoop.fs.s3a.S3ATestUtils.enablePrefetching; import static org.apache.hadoop.fs.statistics.IOStatisticAssertions.assertThatStatisticMaximum; @@ -77,8 +76,6 @@ public Configuration createConfiguration() { Configuration conf = enablePrefetching(super.createConfiguration()); S3ATestUtils.removeBaseAndBucketOverrides(conf, PREFETCH_BLOCK_SIZE_KEY); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); - // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used - conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return conf; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java index b71cc43d89707c..d43953dfe82e10 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3APrefetchingLruEviction.java @@ -90,8 +90,6 @@ public Configuration createConfiguration() { PREFETCH_BLOCK_SIZE_KEY); conf.setInt(PREFETCH_MAX_BLOCKS_COUNT, Integer.parseInt(maxBlocks)); conf.setInt(PREFETCH_BLOCK_SIZE_KEY, BLOCK_SIZE); - // When both Prefetching and Analytics Accelerator enabled Analytics Accelerator is used - conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, false); return conf; } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java index c6ecee95051010..0d53ef741eeb0a 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java @@ -28,9 +28,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX; -import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_ENABLED_KEY; -import static org.apache.hadoop.fs.s3a.Constants.ANALYTICS_ACCELERATOR_CRT_ENABLED; +import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; @@ -46,8 +44,8 @@ public void testConnectorFrameWorkIntegration(boolean useCrtClient) throws IOExc describe("Verify S3 connector framework integration"); Configuration conf = getConfiguration(); - removeBaseAndBucketOverrides(conf, ANALYTICS_ACCELERATOR_ENABLED_KEY); - conf.setBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, true); + removeBaseAndBucketOverrides(conf, INPUT_STREAM_TYPE); + conf.set(INPUT_STREAM_TYPE, "Analytics"); conf.setBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, useCrtClient); String testFile = "s3a://noaa-cors-pds/raw/2023/017/ohfh/OHFH017d.23_.gz"; @@ -94,10 +92,10 @@ public void testConnectorFrameworkConfigurable(boolean useCrtClient) { S3SeekableInputStreamConfiguration configuration = S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration); - assertSame("S3ASeekableStream configuration is not set to expected value", + assertSame("S3ASeekableInputStream configuration is not set to expected value", PrefetchMode.ALL, configuration.getLogicalIOConfiguration().getPrefetchingMode()); - assertEquals("S3ASeekableStream configuration is not set to expected value", + assertEquals("S3ASeekableInputStream configuration is not set to expected value", 1, configuration.getPhysicalIOConfiguration().getBlobStoreCapacity()); } @@ -123,7 +121,7 @@ public void testInvalidConfigurationThrows() { ConnectorConfiguration connectorConfiguration = new ConnectorConfiguration(conf, ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); - assertThrows("S3ASeekableStream illegal configuration does not throw", + assertThrows("S3ASeekableInputStream illegal configuration does not throw", IllegalArgumentException.class, () -> S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration)); } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java index 4159ff2f9b2fd2..28fba0e5ddcbcc 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/S3ATestUtils.java @@ -45,6 +45,7 @@ import org.apache.hadoop.fs.s3a.impl.StatusProbeEnum; import org.apache.hadoop.fs.s3a.impl.StoreContext; import org.apache.hadoop.fs.s3a.impl.StoreContextBuilder; +import org.apache.hadoop.fs.s3a.impl.streams.InputStreamType; import org.apache.hadoop.fs.s3a.prefetch.S3APrefetchingInputStream; import org.apache.hadoop.fs.s3a.statistics.BlockOutputStreamStatistics; import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics; @@ -587,8 +588,8 @@ public static void skipIfAnalyticsAcceleratorEnabled( } public static boolean isAnalyticsAcceleratorEnabled(final Configuration conf) { - return conf.getBoolean(ANALYTICS_ACCELERATOR_ENABLED_KEY, - ANALYTICS_ACCELERATOR_ENABLED_DEFAULT); + return conf.getEnum(INPUT_STREAM_TYPE, + InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics; } /** From 9b19f248afe6d0f57f4e5eb66c54d4a97bf7a8a1 Mon Sep 17 00:00:00 2001 From: rajdchak Date: Tue, 21 Jan 2025 20:52:41 +0000 Subject: [PATCH 10/13] Allow passing of factory params --- .../fs/s3a/impl/streams/FactoryParams.java | 53 +++++++++++++++++++ .../fs/s3a/impl/streams/InputStreamType.java | 9 ++-- .../s3a/impl/streams/StreamIntegration.java | 6 ++- 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java new file mode 100644 index 00000000000000..e4c76837e27dcf --- /dev/null +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java @@ -0,0 +1,53 @@ +/* + * 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.apache.hadoop.fs.s3a.impl.streams; + +import software.amazon.awssdk.services.s3.S3AsyncClient; + +/** + * Factory parameters class to hold various parameters needed for stream creation. + */ +public class FactoryParams { + private final S3AsyncClient s3AsyncClient; + + private FactoryParams(Builder builder) { + this.s3AsyncClient = builder.s3AsyncClient; + } + + public S3AsyncClient getS3AsyncClient() { + return s3AsyncClient; + } + + public static class Builder { + private S3AsyncClient s3AsyncClient; + + public Builder withS3AsyncClient(S3AsyncClient s3AsyncClient) { + this.s3AsyncClient = s3AsyncClient; + return this; + } + + public FactoryParams build() { + return new FactoryParams(this); + } + } + + public static Builder builder() { + return new Builder(); + } +} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java index ef226d43a7b7ff..966d66c5e3bfd1 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -23,7 +23,6 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.s3a.prefetch.PrefetchingInputStreamFactory; -import software.amazon.awssdk.services.s3.S3AsyncClient; /** * Enum of input stream types. @@ -45,14 +44,14 @@ public enum InputStreamType { /** * The analytics input stream. */ - Analytics("analytics", (c, s3AsyncClient) -> new S3ASeekableInputStreamFactory(s3AsyncClient)); + Analytics("analytics", (c, factoryParams) -> new S3ASeekableInputStreamFactory(factoryParams.getS3AsyncClient())); /** * Name. */ private final String name; - private final BiFunction factory; + private final BiFunction factory; /** * String name. * @return the name @@ -65,7 +64,7 @@ public String getName() { this(name, (c, s) -> factory.apply(c)); } - InputStreamType(String name, BiFunction factory) { + InputStreamType(String name, BiFunction factory) { this.name = name; this.factory = factory; } @@ -74,7 +73,7 @@ public String getName() { * Factory constructor. * @return the factory associated with this stream type. */ - public BiFunction factory() { + public BiFunction factory() { return factory; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index 67a06075376528..46dd3266cab4c4 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -63,13 +63,17 @@ public static ObjectInputStreamFactory createStreamFactory(final Configuration c /** * Create the s3 seekable input stream factory. + * @param conf configuration * @param s3AsyncClient s3 async client * @return a stream factory. */ public static ObjectInputStreamFactory createStreamFactory(final Configuration conf, final S3AsyncClient s3AsyncClient) { + FactoryParams factoryParams = FactoryParams.builder() + .withS3AsyncClient(s3AsyncClient) + .build(); InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) .factory() - .apply(conf, s3AsyncClient); } + .apply(conf, factoryParams); } } From 0dd1a7a2cca26ef4d715dfcacdce6be614a5344b Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Wed, 22 Jan 2025 16:51:31 +0000 Subject: [PATCH 11/13] HADOOP-19354. Support stream factory callbacks - Add callbacks from stream factories to creator. - Initial operation is to ask for an async client. - Callbacks and wiring up done in S3AStoreImpl. Change-Id: I544f05da15e3b57e9a538d337b972e4e07dc8877 --- .../libaws/analyticsaccelerator-s3-0.0.2.jar | Bin 0 -> 1293335 bytes hadoop-tools/hadoop-aws/pom.xml | 9 ++- .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 66 +++++++++++++++++- .../AbstractObjectInputStreamFactory.java | 35 ++++++++++ .../streams/ObjectInputStreamFactory.java | 23 ++++++ .../s3a/impl/streams/StreamIntegration.java | 8 +++ .../PrefetchingInputStreamFactory.java | 3 +- 7 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 hadoop-tools/hadoop-aws/libaws/analyticsaccelerator-s3-0.0.2.jar diff --git a/hadoop-tools/hadoop-aws/libaws/analyticsaccelerator-s3-0.0.2.jar b/hadoop-tools/hadoop-aws/libaws/analyticsaccelerator-s3-0.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..69d056dd20a2dd9d1465693bbc9e0e096c9c86d8 GIT binary patch literal 1293335 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

    MdXfG4XbU`crhc>x5_W@%Zw?G$#HV72<}+9W1uA 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%0Du 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 z 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 z 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

    9{sdOx=E+to4=D;uYIROTlJKsNKP`jA>G!{W;9n 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 PT7?iKH0hWas7C7DXHzSuh2Sqw%ey8Yh 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

    |OmQyepOjz}}gs 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

    IY|oANU4<7vtGC;7_XOum8a&sKGJ#8h9!GU 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

    !-XUO9$e`Aj3Ko*;GnRe7=&>|H3 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�G}}u51`ngMK5FU$x<(Q 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

    S0i@HH$l67VPRyc#E{!^pY|70H}QA&=i{Dx*OZV zQTj*|m}{lpy;ojb*afUYy?Pk8%sIj@9{n~B>c&kapAbOHzr%OjD2rCVr=gMkFtFqwFS_>gdF9m;ZJQZ&rXS}p^(hvT`qH|=DCFx zm2PAvCI{Ok@~9`XE*Rn)@E`Q#2LrjVw;_Tl8681tVd0@s7)OsHUi!Y^@eBpw2nlz< z5FW&Hw%*e1hHK{0fZyyam81fTV#Y& z!5Pb`m*V@bqS|bTiZZEcqM*aoc>9b^;};Lxw312-b zmJ#KbBR!rmqb@TNR;;uBcI@gxDb=frpUG)>EV2hr*ySE1+O%ogfhd1`9agpqxI%$= ziRS8P-r*$vP6>`5L?`Xtj8TaS4Llx)&+$$z9CRU#s+>Y$30yGapBfKYP(1_Z53k^r zm*!YWm1Je*c6%Jo%jVni2gHEj4uWaLR<|D*y*3DnCiODaI~S_iB(QHBgg`fFx~#5E zY`BOFST9~Ga<>#JX{t97Ep%-p(#+{~{oDZ|Yu_6X_gq1WOZFa7td&9)AkA$%6Us}s zL1{`0cqa-{;P81kB(fV*Q5d?oR+w#**QG)LE^io9rP#;hBz>x9msh*pF2jYxE^IqR zB(n=vEIjg1%wz>Bxp<14SI0*B8!%IJ?tYm2Q;w~e^xNp=^7nvRBdyJaVM?S);vF{@ zvNLw_1ndm*(;WM~CcYq`Aa=tqOald5wE;MRn0nJcy5ib2pn`8kCRr+VGSFhqKU~-7 ze@DZsxKXfm%WU#u5f;-lyHESGVud5$sLR>H(NzB%9ar27ycBRLji=L6t9?tuX`)Wb zCE0`GKSerSswaNdP}+p3{Xs=s%jW0bH&d1@QGHHh!yV@uVvAmVt-QbNk{JLH!_P0P zJ~y`El+GpD+C6KJ13p|JWMh)X_KG{uyI^gpV4@`UFw4zNUA8sbC(;{-$u7k4 zAiSZl_kt@Z`iEbZp&D0uIeEH2FY0o+rOvH>0cRIIL0b?VrAYB2#j1u*4QtH!Q{>ld zXg-m9JzUjU+wTCqygWba*`FXiFOF& zmePgw7)<8#$!*Mtn{naHkN%8CUBx2`WwJ<-;8?q|L z0JhW9RqRt&opHrfb>*uDxeLCBRI-!CiSj;*AVBr3>B=9LbQAKv@bh21XmPQ~e>%U) zpaQY}eR}YJqTs(njDHh^|4a{VXjpsvb(P8^)sC163lR)gI3`%IX9TN8djtgP2!-1q znE;~{9GfsphT6C-rE5x1G}b>DHH0iuLl#$b6sRf`BiNzUt5n~Csgzbc02)_6j&nZ# z^z|vfWT%fLj)A=(%;LW%WToHw9<_CDxpyWdee$`02!MXjIpiQ(GqF>&VkxX9$JAJK zH**@)Q^Z&q6I32QlB+Ny%w+(78B&^xzt@Q_{Tly~dvdDEtDuh^#U^63qei=mQ=1wo zY$XDlaocOiYPZ;QTsnIkh%gy)^(a4)H-rI67#s;cS@v86h3K!Ih&d2U2M>kN{NYhg2X&?YsHC7;_5N? z6w^2Z5h*o@=oD4dX`_IX)={?ze_AwG!$9yog|rwJ86*u>nxCN{;0xXic*^U;-9tPS z-5MpAS^+eDrBN7&Or#d+=!L#JXrx%G#9{>d3g(^+s7oWfa~6Byq9Y-vnhdS0<(Pod zutb3FXC2sSa5ETUAnG03%>Q9h#d zL2bv3`eV0%)iUZeP%ske$}+T(Ao<@!;B`Gr6ZMRTJz2#L$U?UugG2Wk8m!SL6u0GA zhd^Wvnyfq;26Z$jX)G>-x*GjFO{KWww;1{nF)_gLj%Qb`B3hRzuzV3KrHjb zQX)aiuHPTjxKB|OqFQn04JhNvdR)*`A)B>O^3`mMl<(8BgAh{Z@+iCX5z(i>lQIcdY` zh&0hQHwPJ6p=oJW17>wJ#NSIR#{^z|eTk5mTrYA^WfVbDpAqX1exsJBT9#w#N2uE_ z$&}PE=6X$}u_MA#M;xNfSwl_<>2w?4K_@*rDH=JJ0)_OTylc#kli2?7RQs+jP0%#v z;YPw*7K0-F znr$bFq+Y|+6q)y_Ru>%}vYFKwvn_7ovwGqa;-{^jk8%or^$Ml&x>!T5c!;*EBeW!~R6UC8N7~7R5c-Dt zGHAX{)B&ZEK9j|WqA_)H0^DjL$rJ@oDRlGH{w0aA5fp<>BZDXwZXg5$S4>qv@1d z6K7-JUEv7X=~Uy4_MmSOm=-#Pvo$A;9&dmoih3NtGN+w5V24R)0ME)l~;o?PT@cRi@+Tfv8^iUJ%-okCO&L#Eq6Gh-- zN6DN(s-PTSAtp*cA2AxuuJPLvqKxhK_b}k4#(V+}h zbTyy#Ci&szcFmpMK3fDVKv0^mqyt)hwg=teNeTnYY%0pNTvKO07~p&D2fSKiV$T(j z0QvtZ$?pLE!tf)ob>?jlXKpJSIqG{Xn`J#)K%Na? zH@62V+0^O3MRbHmz2B_1nX{%KKW2T?&geJdi2PUhJjUL<71x13@uUY|-)O7%ZG$tA zP4UZA{MImsMV&GQ7wkEDpoCOsMrP8I-U ztbOZ9H;ivNWv1ekV|;+C@w(hhc6svrD$} zOSYbo`P(LzUByO|to29x`5cHpGC&ZPA9h$0>B8jVGG8M!?kXO6qx-M55arOd-_@jEaz4I8I#dZ0d|gB`B{PK{o#^wj*}>dgCO2k+;A z&^9~mYv`<>)-ICbJzF!>`@$w>M)aOIk{Nh*OJPDawMT}&xF3t>3#U9qXxljsNU1X| zXJhEqjCLR-KI@Y%FW+c}r8lN~Fd`(@8?ac|Wk}sab^Alyu7rO;yUi;0j8XT%#o8&D zHI$x??D3ty!D*)mlo??VzCs6OS5WO;Z?%ay{rliz#A}#b)~XKuEv+yfxm?&vZ}})q z%GzeB>Nza*vCM~lDl(IjJZ%l@!)`s{+VDAM`0$J+LXd; zNkPMW{F&gv-C?k)aZ3={^8=W#w7gqBu+9PMV$DsCP7+h8sKWd-oISjsqA_bv^p_y= zGA6Ymv{_C|d)c!_-KMCsmeIDAqTNExJ1M3nRi2C+7PaDM9)}uglwA#uBOe*>7m)Mk zF1*F%n!@BBmm?1HjaQt1tLax>SeN}waZ}4Hu3yKP(i`#PS6?aL{=;M1F1!QvMst!9 z`W`X$H&mJoBCr?Tx9n9Pnhk!3pEN&COdM5qy9jn;s?-e zmDHfPfrA1Qlu%(MXT34K*zh*ber0;xl>B%*ZQ}oyIUo;{!tqO0mM&xr{pp>;WsliTXOG!v zu)^81iZB^_q;%|by$n))p@6?^U1M03aHH3yoaAxd0!0oyf&DUUp>}530Onm=pt5|| zg$c*EFkRW%CxLl=wKW&Hj4g30uzZlM6~oOwm3i2$;H;mTHG3xF;#o!^1Xj+{eN1|YC%!15O`!b$EH}%#=@r7 zN;~aQriP1_evnlH`wMf9HNX!WD>UCzDWnB4f*cga|T?b>r7p)`9~;*OCGlibwds?)Lc8*=~?`_VT2 zrc42F&fJc#sw*oky;_^4cr>labO;>|&QJ%|q2y^0Xg70ncRMbM9dQ)QD{f~&8=Mv) zjPl)snvLX7c~`ad$d5y8N;$9x()4)!41T@i@e@3IgCS!}gCP<26Frau%=W-D7_O-H zeSkzD$o{rTetuqZSkMV1(iwElJi1OFO%=)dCFzqgL;Qh;;Dpe`bf0x%qm945Xl4E@ z*0?RwL<u>Wia}^QF zF}VVUAln$qJNu(PP>5L|&JZpmyD^S*CPy~Ag}O&JrUcQ5-YkM8hcX!#XKBC-*|myX z171=nSC41)lj=Oz%*zNt(a59H-vZiN{furMV##<}h6}lSe-^RkXKr=O^Ff|j%gBJL zMs<(%rpg>5i)-YwC;+K77KdS{$L|sNC80zQyqRA`idP?gi_ndKN!JsTSdW^KH}bAb zRm1D&`PK6&N!mk>dGp`s@JVes?LzH*n90{Z|4W3yKXzGc175;J@IQXIQ~cZQ`~TH0 z>z_hAp#kltCF=Y+WpO}NRc)p2Gj?leP1W4k+$4V9X$7b=lB~~MAc}vN$=ABj5x1;y zIoL?jC2V9bg!TJjEnqfIWG+^T6hE74W(^>;HqU65(~!t(JdmGdZY=!mh9W=#`kChG z+7xfxPbLYQL$lS!X8aljlH)W0YNMXuryy1iJC1DFYf#2pLj z{KQ4TbX8&vEc_(wrpy1hu`(O?q|xx+Rn>R4`4^Z}-+Gt`NJoiqL&66OG zdlTmf>4ly=e7HgKymOu8_5h7+-I;tjba*Wxj9HV5v}urlPbLt#PEWOCO(ERzr>ccK zJEH6wU^bz-Zzvcz&^nqvE8t^BX(5Rkc+Q`_ssGT7JALz)gW$tGH3QAiUKHifm!W#; z3QenVx!#%`wG})i5lkhMe86u8ZU`u-a!Z#CwSWq*>s^c8swo-U2=%f=JsD?dGbik& ztPCluUKWefCV%xkFj%cAukEL*acdhcLtfL@nhqtujO z@YAJ~N|V7SNDuX@EjFwS@D3|fBEmq`N;RyVhCx_ndug0fQ4Ogdy1Q%J+f4d3Eb@`H zd7bo9!X&6wemy~OmgJpcE*}l}XjvOzzFTBzs|5Ox7&6-h zjCeTzO^gM+!H64F_j`C+bCg=a7t_&m_l{QgSr}C0MG`iJ3>DKMyfs z<4WY`9IG(bF}YUsUSR#Z4FBK6aMo|a4NPDB1v>Y0v7s>#rT#A4bq0wW)uu^4lq&hx z)%n|nAayfE|TWgiYMy_AM6mi@58=%<}5ixpQ$ zjS`h+Ki9cG^nIz#+NVU%WBWiXey$}Fll%QVgmp|eI`1-&n*m!abyy3O!SFhtGE9hy zjMoV8_dS_3n9n?ZstnTnQ;j)RBOK68vz2=<;JxdXkNaoNc!j)g9B4&H@%B`UeKN>B zF{0j1tA?-7OnPzs!*BOWjDdigz|}$7gf+&8j6INq6ir^y&mZ{8M6&fzF{YFcf-`DD z{5KT%*(xxWWf~*4LmxBGh*W4%&kyP&IpNv0A7MJah`cf{i`%)lCDCW3g}f&+_)tu0`xsPT(oCwCIQnSJC zGKeEF?^#IE%CIAp3QsI_5aT`fG(TBJdKbpDZ50OFU!JYf?+l-XAavWZqm(DBXlJR5 zc?rA>H>P73SAd*5OMo-F`?+x6gXM?lTfvTxFZ01wSh;gq!vQ(39&Q924D2(iBA3O( z;JMdN;b$tS$0ySG&vv=&ubo|{H73H?t{R-aalP4zUS+wXP_kOvbD7; zHEY+8>fzzw=*w4cZP+ZJol4)qlzGlCp=XUaF>UTyBg@1~rC*<*x+=fA1-$Csk$XtH z53gr^jni-j5~Mr#<@SB|cuSZDWs26o(ln?5vFl;*;-sIrHP6@d-Tb?iEY2fO&CSV= za)RhZUnN8z8TTR4C-PJW@JzfegIi2Ok!6xlsAE>qO6WU1!^Q!QHP2ux*VaK}SJP}P z!q2o>vl&6C9qEvN3r0%~E{C(D4{5P%cSE8L_!O*s1ZZn!KYDHqgGRm(sm&z{m1&Qn zRX;~!XZvbE(RX}LycRoK3Fv>`-g&5H;8>kHJ@dUw6%9s6`)GPn0K!t5XNM;#_Q*I4)$NZcK<-y$o-?#_5lE|)vqTF{?7l(bYQkm8(esp| z7Rnaqbx%=rl_1%`6U8VIH5kSU{h=iBapV=v6h-CS&qkyLn9(E(%@oGbDJIBA`c!z$ z9Olud9%_eBtTKhyHQNBLt8$9?7ypGG?r3$T@^n&YOrbJ_@ya#DlADDtn)$^QJ&7Wb zH0t8XWKP2}lqwE6+c5?8VJ{TEouYfXD7gvl%iD#&?Gl)hs6H2J(>97K5~!mQT7A~U z>9ZJSIN?LluE!tk%%1pVIw$r1skm%KB0)WxK!r^lbgs*^q z9Jwt4d05#Xp@7HVLb$^MHja7@PdbL?K#cmJ-re2uNAy{NgVid9Z>1z0Zl;uOH|DY* zr4PJNq711?*|hSKcEd^U4?xA8A(w_S$d%>g9bmlf~n;Y>ACn>a54)tKCy1|YeMDFV|S0kcWm%rIaDc@EzGYEzbLqO!rqHgYDI5;vWD*iCDp5~#%Zv)&gad*P!= zhMxJJr7_#4`w(e}Ly9*ODB=P7837@!^nuIs3sw9pRrjjB$1E}6wD6*K<($Lv9Jbc8 z!dgNK%*#Pcts?@brw(py?vBf!0U(Ila7J<>ScaguX&nZEt101u$SagQTcp*uCrXah zq8S3_abCEli1%wN=At=X{^8Q))!|dVWWvN@yRaL$<>mBD3Wj9Bg(x8WfLqez=eST? zdxD8&b-UT(lzVDT4s>m-Y)yOk;*&qZ0~nYzi|7CFP_@d;WO2mr)N%s0Ulz6sRQc zX{d*BmI;Ve_x@B58mPx2OY4Of`%z*9J2}FcNy5)w{Mi%u9U#h2`HkfW@C%{4H^Q8~IU^)Z0jQO&aETHBRwsvRt&#V0P(h~w5 z9Wvd(rIp70t+|q})eKIvhWU(dDV@#%x`&6%j4j9O#rSs9?NyXKE&3HB%G3*mP3#0J zUmq4l4Fc{VG9}wcnO8kxgE8`9>;iS1M`gS<#E8o}HP`ennq{ggjCi>9iKDLBpf@9Y zyo3)oEgJyYU_V(AIGqGY4r&JYB{}4-es)ZPo4SHq5P_St%r?M*OxC~_H7>!Z*wxZ( z+>~BbA7cvuk3sOWyb^cO^^PHDD(bXWXGX<_A z=jFzR^PESG3Z9+~Z&1V?BI7_`&4JSNSYbR7)4*&$q#?L`_X6vcn?=>IB@0opf~>(J zXWui+1;WWi>DrXWcaiEh1}%Zk5<#8zZyHUp*sHmMpQpPYZ1D{i+{ynHMfrN6(D2S;TI(=?;&%3Rjw4&2J z86{uuWZl9V@M}Dmk|+|uQJHdt5dytTJEeGpPCD=I3}*rx8H+{b$if3Vzy)Kg1BKep zrM^AMPKK>C z!A`VPCXTtnZov_ue_>EH1BGILGo}9>Tl{w)dVHI%Ud}gc*f&c3-MMj8(tWl0sBt54 zK?RMY2$gI>WxqT<&N>PHgqwbY2;uC+`!oMH3Y z%miG7V`x~WH{RuGN1dq6{FG1IXwy>QQ@f3zjTPH|v4Zsz+W72Rztjtu^%tqNZ&L3E zT1>{)u+0mcap&;qgZA<*@YoAp{;fAo9R4ot3*shejb+Yr*_6&~8Xn{vmwfZDO2e^l zzapRed{8s?0@sFzQc{J$?2{k0npQ^s3TI&vd2u`q`4Bnz7Nw@TLgVW}_@dmZ7QA{9 zAOJPnU#lxMM7_;JK1o?EVQ~6vIl~)gy*9?caoX?y2Ge-Kr0J*%aRWTsft~st{Qs9{zRjULEHJil!jCu^y zUVuntXM(^+d4@%<-Wl;F#4k;Uu0gy=3DFhiAgf>Zzo1Y5(WWtEOb#@4$78;hZ^;#X`&9V|-1`Xo`gVE0oqWpmnjy%~;S` zm1;P)$+f*Mvm0(Mir{=9Y@6;UZbj%YOyAb%Ye5cP(*$Z_$<`5k6ZR{Pt5J8KtGDb- z$J;Ak-w)tz)^4Qd;ity{d>V7?MXEEhDVBHP0lvn^bDjc=QG5#*J-6H5+H#ebX;y#1 zlXLK3+rLZA%;O4X4VE1~1XT`l_|>Dp-vIwus>6@n-}|akj_%IxP0zC))|jY&dFWYP zbypAc)b$!SN(d=(*&5O2D|0( z%*CLcl*eVpu$+EY5z^5s$WA3Df3r<7A*`H(pwodS1cbva95JL;9=&Bn)&bh`<5jGL z;j-*DO=v=`q1T;D+^Zy`>Gu|WZM8S_p(as8PbM*%OQfasRiX$)ur=(}$dyouhp%0} zZPtE+S~i-1H8-{>LM>wh@9L^xOLHxNGOj9pc0bAbG=uz=ckHk+3qu$M%ex%Fsf(?| z5Tu|y1zij*1P*@ZDWKC0q#HMqJ4vzc1oFM9gC-I`dcC)w=8;B7MFpUVq4@SpVO#uh z$i|7PjRn+mAC9d@f%kxiZTUN^8%1e=$4}sjFsS6i2TM}V4BjJY4;f+ba(v6PyUc*? ze%r;}^G9Fs8n1$N&zSES+``KOhL-YpcL>%ZvHJC+RdVrh>tn-eg?6{dqD@eCUA}5F zK@+{{t-A2nKJ6^BN=@clC4bfT+=X_*?ajO!HnQj6$ZjP>pRl6(&A z<`P>H$_ z51u=PiPv6ko6G%SizfcYuk=lbx**vgDJlY`PL!lTZP8pqX%An8sw^^VO6;cv1?gkv z*@%)(U>QxG#l*K0!S|X5$G`t+dfx|*E9$2of|)gQvw;3Z1h_Jq`)kr5*LNN7IGJ*F z`&P~Ia+ag(3mz-tw-awj)5@ltL3JA6Zjlzwl+O<8oIOP)yzp5&s6AAF7p|ey1f;s| zUq#m%K5$`dL)E6$cj(XZ7q+@BIqTaAg~@d#rU&CI%MJb=xfUq5=pS&M=w3Tyx1FK`f$W$ zr19}84J0I(J5vxLx^OE=BjdTR(KzNR4!#X2ulzEx;Fd;Koi$E+IxvDlQ=u3o%lE0*^4iS4huoCv)nUbb6{dqOpl}isuGm zqsvi8gO|dX+Nec>Fl&=W^=;T`H#cEvnUVVEQHI#jW6MM?43TnIt)N*F`w~WXp@iLd z)WH>qA{jdx4)uHjqN$V9aYr_+%TBPPJ{BD=9?oU$cPa3pI-aT}z*Vb?dT=;`biMZ?f|b zj;p)JLp1D?^;2{OvimD7=OC`h&f7qW=?CmuPX}76ha1QF6UN`lY3U13z2o|&jxdn? zx9neoLqfU~qA5c)ZAzBMuEEL+fEJn{i9oXpLm%ayX2LT4F_&C3}oR@>R%1{W(UEFw%7@_m!Zq!ZTm zf=}5qyM=Emv)PnejOHqY7AaS-_zJLbLXLk;3-M{((-BvbH%5d(hqt)AQf)AHCS77| zt{%*t;PIc?#1~q^@hEe8OWk8s36}YVu*X_Z7LY9{h}f2US4MWvd*7!p#2OgG6c;k0 z{KBCk@}8Pw6P+RoopX$%k0SDGnF($%`oKBq`K?Ab_XY%}|ND;GGx-`x2ds0$zEglb zkgVp_P3G0DP^smQgX@M|Kar+UX{&fzW3^Pj<$kdoYdC{$+HRI#@jUSTdt-I^3Q>DD zR$KpeMV?j=(Mc75y?{UqUcml?9B~&vF@Df54n)dzbd+vf%5}_35#1>4oY?6S=k??J z4fZfaLNTyQuvjm&a3eBC7BMg(Y0x+?83EmS{$G?DYCZwwm1v`S2%{-^VlI1581a2r z#JX|QOU|*O*+|J`0u2Qq4US|e;;L>giCDy2@zbu(u}&{5906>Cv4sH)FT5zDc%7(d z2~M!__+rNZPO(8P#ALFvFRC${fuT z6G`Aho>W+_)ioXj@DZ46CLUkHmaDkCrzB$*v#VR!yn6Kc0`;!a zmPqkFK2^m3j&TufZ=W(kBAi`l5||xI&t!Vb^!|F}@O-|z()9(N4#CH0H7wc?o;WOL zt=VXlTHq+=RHqqIw9sj=MQN?ja1mL!P0v0k&uEHjtl(VN*>1)X=d7+exePQWbxh_p zO-*ZUnZ>nFmiC@sJbbYu%sOm_8Mf=9EnhS<*IWLm(S)C}fW{Kc$1@pO9-LM=VHLbf zXDi_CdsN-!1~{|DHMJ$jBN{DtZ%TA2bdSxnR|3GlFNe|0%et(tCeRjNF^NMG^Mf*Fw$KgoF=LS zW%Xs72TNk#*PSnq#82M!Lt?I>HtJg<6LS~m;;#8aY}*I_`3)jiEQ6;qPyDlRrXgWR zLK|r`m%RcBF#VugM&p=B>2&EU#foYk+_7iUy)CnnY3z7-D-KhWrezBf^v_-7JQ;bKMrac9i1B-`};Y~!b-f- z|4u*HTF1mOJx!h>b1^@8e5Ow{MAK1&U=nyp3igjn+?3{HeM(`-Z^dhvXvnQs@?mlK z^}>oh!qwoE4WwgK?g*c{C!x{fCTye3!uDw^O`={f0iLB`)Xe@90xMT*jx)0E4#!?lb5yBNS9inhCync)q+vS#4PVl z=qP&cZS;C6cr~zzze3y2f=nD`5vH1L4^{51W5IQ+Ui5@Ax4tklT3J<35jCDXk5d6C z(P<=lUZ^k=I+j{8w?2h9VCAi` zEZXtwCld6FNop&m8Q~bTt(c?;Pc?J6f-L(ewpT!`pbeKgD3bEYaZy8ycI5g zzTqV>fBZF}V9A7d(jJ@1o>SuV#gRyv`nVk^euSoQKQ5TK*Kb&5@D+#RQX)f}Hrdip z7GpAtA~8wJarze_ecsWFK((9PT+24|3D&_5S(xM@B(;{ z%;W(33cWM0M8=@5eYtNLvqatkVTS$_W($<>D{c#hbpme&`?Lv&w!7*RH`=)X+4e-B+2KTXZ^9sj$@lEwdbToR9AX<=*BzYa ztv1Ie=qF{Ae*=RTyzG~fN{2W?QEZ6}h0XN>L*SzEWt9mYSLF zsrR2X*k{DGu|l@cdl%q-zP*pPXYx*e*~@rX+0s)heE4ch_JQAL1>^i*#^`1b zpR7Ww-<$&O?BQ@_@ScTx$0@H2gjv0X%zr3Oh)oLT#3TZyixiC})Tt!}TSF<88qNPw|JcExI7_98RDhij}Eg+zpmdCR@K4JvRWtVm?hlL zuzDx7d`PaMTd!V?;{kq(jvav*nI5t+^&FMlWIb)VA@^=Pcl0t$VLnV@R;SSqN8Lqd zU0+JLnHvt`h#SE^)n%TL;kZ)k8$~ItNK@crRe3zSEtvoA~nsU_gd-J5+ z(W~`^6XcpveR5Kw%mcXFM z8?@i&SC9SXIi^!BZixbN}B=BO^ z{+kr8CICqO(d^1!iD##6SPrjiT+#4n-9%vK;%w8ea=cGHB@F$J6Ti0P>4bn6PZcgt2LuNk_47sM?($tQM&oY}=Fg3y* z*-a@opdLm4Hy%rgQz5a~00i`)0bqe%BG{eY+{hu34)?nNSdWT}BY1+cqT9PUFx;kQ zRN&j|Y!GOf*_NB4ls0zcl}`h+wN>m-a$b&iM0sLpWiaXs>|`C`BN1z+iz&P(sN1I} zT;U~~)(v}lsn(yf)Oyu-)&1jS2UqB~)7X*w`{a`39NiCk8PZ{NPd*b+0%E|gECjD`dJiMw}0V3y%er*JU>-KFep-HBOotl1tZd2VJ8XKe;*t6J)8+J#V8oD<3 zGNFZ}X3Pzqs++=|*zatNrW@(rxoah_En^M^o2z!5)O(>*dvjOkpoMg*N_J-PO2Z`3 zhS+}0Fbh`m9NQq}Hd+~)5YC>c9CA>wT1D$%pOcI;_amw}nxi&M=E0}ct}u2P&P$*Q z8%Q;VpM=hJtTDp8od|zBGr%PhpMX^;?49Lq)}#YxSVu4rRwC$#!MEPX^INyD7eqg;?pvA3WJyE)XKBmM|9YoQ@FDruhcQOA*2w zF`)q+&W&&^31qxq-A4%G; zhw|NF3orLI%n6Qmb`C#NxrKs>UE-%a00EU%;32ao3!d)Jw!z06?s5YOS=q-OD&S_Q zB({QSg(X&Mkl_|9V>9G~QwSqmmn%2X9HQIfidB3Ms33PO);x_lxRHbKuiSFP1mBMZ z06T@G%XAgoy&@ZiBCG|DF2q&rz-rc?;=+M?-n`c|7Q%DUYi zV7i4K#2vdMuM|P`i-y+_eBfLBt?Mq!~8@%iLUng5~{0RAd9c^EynWJq` zTAG%dD-O7P*)bStw|+1>G|$e^Nqf%LlT8pi4q@RUwUMA_0#K8;rfcetizB^N2>J=ErHEmfRlUI_JOs zx3ObG7%%Jncf|pY^W%r!|C6!fKaj2ev9D15j+-)ekaMs#G*b1)1^qhkV$)FGVf&3Rtt#TK*q zR{=u8s^&ius9RSW5#iPCDplIFANt;Vu9vv+;*8Y?P<#2KmEWNHxAm*@uBpwpbH}Oo zw;90C%6>XfO=OjthNaqxTn4>$iy{B83jZ)4BCFs4`+?0Y=B!-fC(x)?#8b8anI7B| zXMf1KO~ci`>};Pk=6>yD)C(61N!$8!?cxn%O+u!)X#)S*tYJJN3>E|LzDZoJiP!={ zQ8`}zjm*fQNL+bE!R%ZItbHgJ#pz^e1{M^EaI#U#yIJ_r9 z`F%1e7D6l_Anu31*H=UVHPz-ByhZ8&1L_+?#AK+k-Ocjku09Bk|#@1lv>Hu z7w)K;QWA{+>1lJ>gYccNcp>hwQdpy;9EP~lib=oZ+5(HFvz188?t`6_GYBery*+1j zG)=3xwC9B|8uT3Md~Fh_c&KTVVReH+G=~^rc3PUN(ekX-j@Ep)hekz^BUHf=^8CE^ED^380H0E9!lwM zM5+O%x>%wtwN2i3zK>o3rj~}dp66I z80y+IX-e>*Rtc}fp%`|Rzw`M{0;{^}fQTuclrUgD)jt9!a7TGfp6=-{UCzZSr>gEA zcNTxa>_++jRT!FbbIR-}1#+%uGNFSuZ5j7wvQZ>-;G#pifnG{{)AdmIi{JEXLF?;X zJ66|cvM4sLYe@0P`J77c!F^l6>k62}3DIc7*<+EwD$#SC5C)fPw(Q@zx$~ZDT3ehV_%Pa4y>si;txM%AS zH16mtF;nay;Sn}Gm_ozk_%P}WF<~Y{$>G6-^HR~E9ax!1fSP6jturB@LOqP-w`UK? zS&8B+*t)}uuj-6Ss#kd;^WNJaQTURBJ&-JQN_}I44GwOB;ioD z8Gb@tCy9qNwbTZarJ_c%CjiNw9Hhx~nHMJ3u7@VD7wvzP=XMV@)4cgMZ!fjYMIZD@ z)4(a5ow^}y$sKPgZ4sliN87riy|XgKGHv*QY^ZZx%pxz{(XG(Qu6)GLFQ0q2QL3tc zf&*>o1$Z!*10?uWn^g@_sv7zuH{zSc#?Qsz&gn1kuF#Y>O@bni(FUSR?Zeg9FEH}7 zFGRRmsx!I6%n633*%+Tz&hkZm>DT|han%&(GO`I3k_IW&pgq2|`n%A=k=v-`-32W6 zL~$|tfho#nmpIT|*nEjWX(7r`()@{09v!gg5xPT`-BtKtUhQ(hyfvs}@tGjRs zt6CC_yLr9(%3yV!N3n!$qjd>;H*W`W0kAhz^ilqV&|wOcSlILeYEe2+If&BtgiCMS z!@%J8f+zy)Bwk?-WO!kSNS_9U-=H^o>~@o&J8xFF9_l^6C(P-w#CWRGp2`YV;P>?% zSfw;P7&FQ)9BJM7q`As-a;GcyL3z~z*aZv^xG&xWJZJLW3Qf&L+zyWXB-AS>po zds_+sN0bP!@6b#Qq-S*ZGdAapZQh>x>(&){zoVM}mLW+tK;!+Vw%gCO8`1OroY>x+ zwohHPh^|n=choDumizn%Fo67>VibTm^L1lhBk+$j0%dQFa;V}6^T zdk{HTCd|e96 zi?gub$jqZDM?s9s4&}?mdLDsGQ&~el3z^+JL2}ibZ3TcGHMl6d7fbnB zc}MQ@VC3o&D+5-4rJ3|Q^9InyfrC^!RlP9ken$1k2L}=jBh1wzEX_i&wL-YHmEa=0 zV&?0|^-y4|s|4js8&Gb~sFD)F%Wj6AJsmIft$-NwT9_?a<6fCbmF5|Xvs2NVfw1wE zDadVTsQSeWM!2#aQK{nHN1t<>j?)hiK9W@UDLbXfMbQw|l1R9#tICL~kN-B~>Hhqh zO#Tjou=_?9N&cG^*FWm4@5v7Fe*`{MDQ(Hl$)S8+>QQA4N&go5=6=>D;e*P*|0HC9 z4oAG#4}9vls7IBIxVVV?R8EH=<;BSPD2P02PU>C6z-Z%|UU=|A6M=sxqN!GYu?9X16}W}i-K1J@ z456+u(~IHa3g;f83FoT0*zuZYHuBJlB(YZK@?vlPH|et^%F&wTWX;C1tEIkeQtrHX zj(&tbU7(B*K>sc~8Grf><<)0|Zk?i6?H-3o@&;Dbi>-%_XVEeq z5oyP4gmaa+0yQS;0)c7wkWwYbaHzKiFEZ9xk-;Y=x?K;xSanF~qj(Csamc2JNlaog zY^^2=$N;O>7cy>vjT~OV1>Q>?A&T&X39zsVR{e-o(~vi83G^z!!KYH4<;KrHdaFAS z>{I8=sJ~TmYfbOE9B{9XFtrRiSqJE2Rf!BBubG?03ShNmx^^lc1x$ zT&I1*%3Tia8?%I)2bZ$6J<0oI{lGe+4HYmAI|FHMUtUHsM37aG0@uB&u$LXo>zh3FU>N zjJqCs-|!)u@>dQ-4=G^~CbiSFZIr)Xz@}5Zb7k8hDL>}0a;CkB5u?l&Kv5hyvqfa@ zFl3UM|Cq|-y#BWUiP;QC!XMuh>b>s(3Hg8X_x~5I>%U;dyHvIu*Mty0C&dev$;0-3 z=hE1aiz}}9jai$&#Kj^Zr34n|DPl7Tn(EQsE}%7$IL5ES(7g+CqkzFPabNdi`=aQ} zy5Nc?XTUgf;hkMRy7YXwG<6jCetz81{lMRb8^E3NKIYp|NbMZ;b-x#K~-)T zI*9SRmR4Pq+T2yqPW91Vh4-FAzO9QjabH_IEVAoqB(%&18@_(JgeI^#_w3$J?m6Oo zgI)44;%YK|9;`;Ck=d8QSxlcL1Y`>E;pOI@XPD#Yt|Ho4(ar_oV>5!iqBkqr zJyiA7B*DG~>i_~%voI8_} z+XwZ^#G+{qn3pSJ$rG_?oi&0{O^;|S77sXN;9)!2kLTt;Gw?Zp?@Y?E+SB57?2fYH z?OGfb_++DQs>?LB#^?zq(7f;b5tU7~?*vJq^=rf!s56op25aOhPpst*S8YEQynh2~ zV_NAu4A;MI`o(3bEt{|AJ=iAau~RAm%`TvGotO^)G4GT|2^Vy>fG+g<9`u9k*eKY% zHQZ90&*V5IKJg3p$mfJ36(T4nsMkX@4;lxYO}LSZqhq0{%GnH`K_+OI#-HM`Zo$K< ziB|I=+@P->SdRe9i9*iBA=i_^kMUI~nrTub>I#6h70RL$ilu50HFv|IhB4CD zVsx)31~(M%wUf_GdJl@{JrhBC=dCwUkydn{SwmK`N3w!Gk)1 zqjH#m0W6hyq?98t?9?$idk~A42R32IP-+ns26HQan0=@sifyy^sKgzcVR*i7?S4FP zM)sF@50e}0t6RJVzj};3SE=(Z-@lge|2V7iAOAJB|1C8{BtL!_|C@62Kcmq9kGz`y z@Jgyfx}hAo`}8c-%~}l7=o>|&QWIQ2sjLqpL?Y@LIq4A-{LXY+#ubOINSnaJu}@fa zPM8;WOeD1-6raX!&Nn+|8y}N@LV*c)Yt= z?_f`+na{>#eDDwI6ugn5_lw))7+zET%_bgG%B91(pgEa6vGLPW>p&bWmGAf{-U;rA zh6y7Cq7;`E9?PEj++|EmWHO{pj@ySr7Io`YG8LLoQLam*3!AwwujOi6WWqu4I=N0e z@|A0<3!^lS3v4O}Rj5VZr}!FiC>DQEM?&t=;+umof+C10X&P}Ht0}$WNXAQ|AvlAy zoFXGZYFa(=B*9WMN3%7F6Fpg|Q)?yVzT$~ne;sm=)nfhK4b3O-6KbV@6aV!#tkl}_ z%`MKnrh)F&$Z@dry0=EOh}xyv*wWihj=#W?USx#|`N6%Kxxk4Ls3T9%c_OkbOsWuj zRzwWYW$&bYzvqZYt}rIJd0waiY|K|AdF%44Ynxpc zZvA6!of)>dKU-9Z{?z7Ho97pS9UACE9HZ@s`--w zGcicIhGUgJRcnC2sy+!K`~^Lb88%=ax3%a_2Ea5L2t(LcGTUJvmYy$YRp_9kw&3m6 z=kfm%YvMCrhY{uR$F730%`#Yyo1QqBr^H z@8%;FvY%fE>imypJ4suWm|-pKnl~EW%~PIDk@5qrNSO6K*o*Dp?sXgBCyxNGG+AVG zGE>asdy#ewI+I`e2M%%0RgnSegSrf3MQ{DtCGkqI&}E#+_1`W{ItD|Qz2p^5j!y|suwLGo5?if2_AGhO@f)_8Py)CPU5 z7T0o5+wUs(WzImD2JaEAv~BOzpw6+c?izD$By{lktihD$~v?nFkWr@G%c^mebnb5Lts0#v);%z``%rf_C-C-1QB}r z3C1)6BI$s8!i(C^wbu!g)+~z^#erjXst7X&Yi3;7X4kkG{Dq~z&r`CkmgY+AGiLrppw?WeCF29TiDMJu)K}7U71@jp0!;cyR9g%CO*Aw z9}zSOY@2y^pYc8B_h|%kV=PAb z7~YDlx~J_VHpSV^eZkIbpQNpGZVm=L0pk1FIYUQ{=C9myb&4ahwPk*E9*UnqFYBCR zB)`h0dUhq-S5ipm-`Y={6*dP*!%7kW8JbdIIiU7SdZAA`_sUf? zU&R|WnhKzj>D5*@r01{Q!8MjeZ^3#WW>-w{T9U|)_!;N#e-566WtxZnPVFf9xTAgw z-kGS@Vc$NFFmtx+)S4uhuibjIMi_uudA&UNV2SjZ z8j4ZVNTt|}!3JoUnCE9Y(58y(tL#xAtriAQ9Ht*5sl(&B@a~LmIE`$DI0MPHzty#o zr~a`e%>ks^aEWtgYW?!OGRaG$MgJ)x?<`l}s+%kXwiif6lAE!ag(8{Ej!P~cB zYI0a$S1*M2tNr#liS*bcC=jx=PEJ?df|Ozy4B8z2xH&E9c-bV~eW=n1+T58pT|BaT z(e{p^5_o0>)6Ev=YhZVH$*>O^ES3$GoOKj=$_E)~bBf`q*yDQfUG!r0q?o$8x_r~3 z5*nwWkw;SX+v|*2>S?DjbJ6pcZt2S|{_s{~NLC-bvCOyL=L#|jJwZjJGfI%9#@fUo zWi{j@YmjB%+SHsMt@LE?7} z=J3f>_rj34MRxIEYxl$gcvD+$c8hfhmjkrYcE})SA za)F+h6E!rIN9*_+lpp@a^np+en%2nNwny>u?qvQ2ElJ|aaKowf$!~YAPVS8~yitW2 zuCcAK@fI~8*lfMKWD$JZ<|Ux27=AV_<$I>4qK<5Cnp~m?=aEdFMR`Ixx2s2f%iK$bbv(#{T%M5C z;oh8Ugx2kip)|JneE0SVR2y-;%^fsTr}wc1w{&|2+tJR0!S4{3<|Fz3awE|HqLA)} zBLlP(j^6fxBJF*LR7CB7eVcpNwZYW(yH}zVdT&-j6=z^nqO?H49Q7NFNn3M6!sOR> z0c6*->&x%_7d-V_f;Epgpbo+BZqcR=!D7uJZ~t3gpc@dfeggSu7BQlzLdCLTBRtf0 zQn@hwU&pubDO_4Dyu;*0xc73Eg9R@Po{6m1M_GJ``Wc#zWhg!`mP~Z(V}UN${2St4jf%JE##=_rhj&c8KH_{rX`#+ox+M zEBjGehb_eC+8ob!I!>8^L+K}VoI0pw5>g-qH&0t)B&ZiZ&X_Kx<-*(jC}y@PD6?%O zSaxs^Mu;9$qVRW>J;&0h<_4ACMXWHP+B&R6;-M9prCA@i z+0Z%B5q@hrl$1RQY`5~zi%(nXTIw0SLO*f9cb`u?me+`gOWqg9poneE^lWpA?Ma3K z{~)jpXIGM>aQ5l6$HAAh$V8EgNrcQotKLw1!%^$snw4QC^j0oQ$w2N&AJdTm}Ys49PfVLjcMA=u`Eh#jg9$GY_GL}1m zl)@6*wP{J6d%P{lo~>`FJxWS*R9Y_|M&jdxr~5gyU;R{jTw$88fl!G>0;C)o zK)E1?DKiLyrc+pdPlVK%{Cag`eLTgP>pCU~t-zuR?V{Xx|p{MC;8dFN|kzoO7# zy5(y@k10!E9Oj3b8zvX_8hrF&zkG81pioN6QILngL38_yOctAqgkpR;F^kMxHQJZX zpkX~0NC!ND($8z+_h%{zpz5CxiMFVreDWx7EYOC=M`YDu523m>XezZ%n})R6?+9K? z#jyQwhK{i87Bi)~V7XoJuy=m)22-C>(%d=h57p5<2#~nu7ntDLm%)aIi$~P^*G+2( zd^kfpWS_@--peKPC~f4a2Q=MY@DY^eOyv)t|Jr8O+!2Uh|B$+zKcueWzu9K~qu%*X zWAy)*-CdVQTh2VcK0kl_aGL#jdq3{-Yu|OG2C1~eZM4zWHLP214!oM3FYZ`y z%B}a&nKZJ%v3HlIMFT0C%$&w1llKHWFRQUJABD3yKd~Fb!+n^NHh74ts~oP`iW&i5E1xcQVI=pt(_=nq3|Re3+p4mu`Trmm~w0T5-Tp{OuQKb=a@9BpBR z!=7*w=W<$jN@aWyRR1lwjJt6>UL1~U^K9S|QoO0&$#*vr%9^~XNJNxyX1M_L6db0) zL+Iq#Y&n;(<$0m2+Ey+;h0>72D{ErB&D)*}hrS6Ly@RgrI5#9J+FAuksM3ja9wZkK z8W=;rkeC=b#V6z1g^*6estn5x+-Nn4I1j435QPd*uc%Hnidk^5Kdk~i3ym441im?3 zSf{Q5oIsp&Kh&d7SfUWNQH^s8?vH3+z`^)Mn9?hMh+`Ym!21 z56IcVC+pC6qW+@W<;~YVi4=3$jv&aQMa)q&j7U4*VnLlqhj7Bm5MPfNE!EhxjF`HX zKIw@`$wJXy{SYhJEunm>&v~Vn|B^k>;d={VQj`Tcv||~ zPHewr<8Uqn;9ZAhbMM|wDh9UEfU@V{@p6dhfXf zS@INV|LaS4AnZBhl;Q!{xrzM2rQE=~=^m5@&vFa9u)d6yV9K?nDyov!h6OSMtck#=3M;kX=gr;}6fix<9-_rGnkYY4w4gq`xuY!TE0b;!KET+G`I6|=IzMpT zqo3#GH{SqfgdKqrYESPv`Ad+<5~ODK$1G$IVXP(y;Hlh7vthUV*ij^UU44NI_BvG+i_Jk*s6aT2KGq>c0YWJCNOnU6AE z^ij*5w44l`Rod?m0U6A`~=HKa_xlN-Yzuxq5JXL*}wCow0bS zo+%}^NsG;A5;S1~r^RV-K{8O11?{KVu$T(+H$ATH*U3|W>d6Ey84@rE!ah6>C=tXfA!je*oZjA3QJL4&oCTunED zs1K#+D_ly`%`XjEHJ zU2Br^w$x%rFpUEBbfb)&j8Ijd#!d#BFcfnwlE|!nUn3|Cod#(jxT95229&rjn@6hr z>R|8sYj4`p)wvkKZkaOcZxOU;V{#K7X_8*G&dxE8F{6jxxw0!nuqFDMi**IYLB4ew z6v#5_id~IJennosvbaiS&iq!2v+qL{-zsQ`)S=%LZ#Wke<~jOOB2 z3+gi7g2MvF=@H@D2ArK5V8Sb0Awa82cmmJOroo+)NJcR(sw+w=^wk2-0$v1zl+-3f z>a_dKTNXb-vkwOY*?ARr>)rs~xh1(6pQK!-9-e}iAJ(d$q7OP|L={Y)5uR7~W9;bk zfi`%HBP3zeQhOHI{Za@{r7OnF=})KE$|&IIme=-(t(1Qio~uSt~WZ< zD`Ym(2@-E7(R> zsaTS%JSjzb%cv#qvRXy&k0Mt2fqXMXT;2%DDi*_ksoH2YpH-z!$aOx2xOD z-jjiiWi(@fMSlSo~QT8vo z%3RFu^TOXArG;+yQI6G|x2QdD!)C{@8V&NT%ce!EvdTsca=@~rFcA*VfqmGAC&KbF zP^cGn>b`3a3@1>pF31yal;)a<7Ap{!nN-J_Wx9|oRQOarS;zMyxHLXR$LH0}mJ^ui z9^wuc5CRjcM4!Ur#}(e`U*$Csj1ch`nd(TcC!DN3tLh6DdmJvrn}9&@@MT(M$0=4Q$ppKpbP^gi+`+o*STXV zGL%6Jo&aq}xck?n4K(WFqFc^@5O7Rr(Mlo_R_`EI@8HDSeh{Wr#uL79GO%8SdS(Fb zWGx6D-{Q1!%hOyvp!`17*3Hrbu=fqb5d=)S)UZwEbcaRBnOF%jTVyA zu_TmqB`q0W<}^nwp;NH)36tODi_QTP-IjjT`Tg|YB&ptTRQ~?SJ$(D^iL}SgM+G?mAV=wOm08hxjI&+v`t&*e z+t;IIv`3&3`4Wr#HWQmsc(c_hSQnQAXwh`Pn-yGY7 zvDh3|KwiT>a33!8-{fIn&B#G*{gK9HjU@78Lb{moeSZo?*|O##HiyjivDk9bkc-rV zxEhzy<>-^wKu9N=*vVdPnX{ZUPb#p&>KA+{13-wyo+l+yd`x=#Bmt>b3{#D2_b$q* z`BHhuakW|`8R{*(0Dy3$6tGUAc;}vgX;zOLrf2vf*jtY;#3O|&7f~+EUSNMj5!*Oj zcc5(rHi3lf8mNS_q}j5>tSzqAUbJ;6|~9@E4`EO)7Vajk!8ZB3x6X|d^)kD@ei zpkYZ{wW<@gF{Ihbs^YP95ntTL#`p=0xCeCe;r;G1!|nR}Yxvry<2!@%;i>cacPXk8 zz%p9!3m5_ptZrp`x>r7n#-iC9`MnwTBaH zseQ6x0pT~3i*PQ*byF~cx?vc~{GJ}V+deS4unuYqAr0NErK#3iyrM_DqF%f&j|qP+ zZG-XaU9l6uzCgSS{gQS!8=API`jRxq4E9Uq(prYh`U(hOmkVc~_V}4p&c&?^0tx69`0ef0yHb)AL$`O1cK?DMF$&O-~dS_1| z?P}T^eW#Yh-~?k)_-lM$5HP@^NS{J4I(cz{d_M1&QYv1~ls;#AmfVnm299O&A-(v`nkpw&iJ@UPRhoSRK*&Y9J8uyLlL68dQdzT*=RBBR3k&-? zV>5hWGITo0Vmhv>u(6;P(W8y_z|t{^M63#2k>R%!Ra`D*=N6p{0WxYiIlp})Ml1ct zsPwixyBJ1 zB=R*;l1}}x%)s{Z&5MjDp+Rg6K;*LpR^g{8+}FKE-j>52YR~zc4N@gV5HWn${Bi6N zQl^3Yl$g~xROZYMHYQ_{gzkF)B!*U|Ve^Q>jzN}3eAPP+jB z4ED~7PmT!d;$mW^_OYL|*Lc{R_m5AClucArErVCpOT-9t$jhr(Kc@+vy@9=MJRV=s zQ}c>!5PEK&#g^HOxD7qf{$z=OGRwd5@kdnP_-Ue=e8^9l&gfK@9iCws$8zsHS70@( zuxW;-cTK*Qul43;355RTvLkWl`fjgW zqHr{&G;5OMu0!+^a*(@o&NwSs89t<6r*^YYS*cZ~588Fw&vHX$EF`^PL*S_e;atb! z@FL25T6OWO<(_)uvY&dRA4E?{f^=bSt-*2f%!qTd7elQ@CgBHsLX7~+a?zfhnjw(;F#lqvp`=7{22M|m z(HZB6ew9YKeAZohoT(An2RKeL&Z}A50c?Tnjf4ABu6NU%t#9eVyl742M|`cAMOsjI zQ^dK=i4eiy^Y&=v2QW@v26UU-)`%WGds`*h*VBf@UGc{cqEC7ruR+{E6ycZ2Jw`!oI*N8qdVsl@j7MU)Z&X}!c6a)6rE2MSFDCl$_ppLqWg)6Nx zW833cx_`-l^%>ko&j%kLrj$tt*=)Lig+DHSKq`1XkW-_vt84^2jT?`NygT8RkKDL2 z!sL2Y%QqI>%`^3kz(Fte_fPS11$Jt%9-xYV7Fc(liS`+NyWTMQy6m@b%~HCTZ(YLJ zl+M&fYt^zT#Z0iFH}E2ZOQm0X9N<5Z!X?(_5txwN_M>_C>FaOuFtn;Kb4|ZcHpJxW zTkd9@^b~V2(Z1q!v&+5Ln^?@auR3-#>o;<%+XdqRd8^N1RsGf;;BhmCpz){*ww-tl zR*9#2lQ2-HF9S=O9Wd}_vN-E~#y%d)3*Q$ElR=7*$7us?uT@J(w^kT%J)(MDsRv*X zX=#sy11e7?C4LM%-L+B9zdLsZHBcBZ&YtSx+* zc8iC@R{NL^pL9J{NaHX=Y!nJpu(Fg@EU&R=w^^e*BX(>dRTx>bH9-MfzGCV63+bkA zv>hu)^KNa_uH)kc6pvWLf#k-EoxJLmd}2ox!Wp%cIB3HO^k-}E2;}T(=b#79oaL&w zax+z7ImXSe?RVzWFHbD#>j3<1=K?(0X3Pj@yBH0{n`gonnAkjtI3I{W{2wu@iwCEI z=pwo7$Tn!%gO}nyo}?iGQcpiv9b)=e61@g;W|VM`dptR!1?3QehMpaOTU)DhQv2>p z50|PVZ1Q$Ax@S5=;9k^kHYQ((C*8+CYnm&zjc{I|I0afoOKY#s`v7cHr^D^fyz5al zp6G%hyrtG~oN_jOg4{Ptjy&NilV>7z*FE=z;LrUJ7hsz~Rr?;T-mREd*b7jieFOBM z;q*usCcM`Im)?pLp;!Hh$PmeDP1DDN;I4t)G5W;AYA;+UyE3ZL!|=U`Cx!tvz%so( z^9L_b@|LjGx;B68z~O$Q`fP^~k44^GLTHlNTpu_iZ`qvMB?Y8|swB)gTaVdY9q{sS zFAT3Fp7{(Y=P2N=8(luY&BC&x%&3jO9!=XVLlU~CLDJ-d(bTqd``dS<+o`~RAbE8T zn%WBkZv}@1DDH|^i@HqK(R~c;?tBsMP7NjFR)3>>k`A_tM83YDU2GlJnxp?pQ2Jr+t;Y^Czu zwMF(#&tV<}!!cQ)4O{{^SNaU%bU91$Tv=lEToKK8vTXTdh%tRqL&5BE;8>mryruzb zYRa;9R@R6wV~#_lJYc&jg7ip=YsZ5BLcVI2J-w|oL6WSoWDRnFBU7%>pXpBL3f&&_Jh&*JM4_jN zsLF3)Nl2j-Q`l(|mrLvOfUj8C(jV_gyP50w1tEkTK4{ry0%JfG3PFcT66VILmKnUN z?@bI#G4f7#R2`Y6TPzQJ3;Gdf4=FdE>AgWd)q%hsoOyVV=K>~UZJ6a{Tv9oi{KAip zqpv6ZdT*TSj$ORO!-J(v@k;Gr#jpFzrwe+}9<7JxZ3mu%Ax@NIn5j6TnksKLK6lL{ zZT^n%W)yK{biPqhu3DehLpF1%1YO_D99EBls;smYYrbTaNN(d zT&VXz&sOvce;gOO&=E350Nt^NGM3CSRwgw^EdwI8T`?#FGKjwKD41YfQ?LbgO_T1A zXUMuFqa5K!nmFw^ohX2P#j~)JD@@;G8204{2vC;V&7G?lUcr{Kr5RRH4GFVTOuBmTcL z#s6t58kMvh5S7rprQ4)LIUC{3@zjVfhBg!M zU+m5!QCSHXv~7R;_(Eps4WrY1{Qe>xe$L!19(8UdyTyOce!h6;o_=qAJ>KsA0qN@B1z$NxFQc(r^?ipt4$g$~qr|DeNZl^5`@+ zgo)JqhOQ;Lh_=;uIy-`1m1T>hyIDDC@gBE*JROamvH=-Gg+?yB_of)Z8<*Yinzr>u z@(jkC))h(xZR=W&<=c6c7&v-u?k3Jo>V&KMOB8!l8VUd2MzfK7{us zDu6KFuXh_$#nAe4QVGa^TwmziU3+u=4u`7oeN(b2ZC?s&rpdenFVdMc}?lym$L>IUjsm z=$Zw`bbTP!@ZK@f+wzLdVXrXaFEGfSG8Qj@(z_y_e9H6i6x@THy3&xUK=r0hwyBQ6 z4ul10CQ&~E`|`@xmr>r^6C)_0oZpm#(ad6>)*WwX<1q+7ahI$y!&4~KJNg%%#MP2b z?1=hqA#J+W*YVRdfN6&BX@+zHmRJ#$DI!Sb^%pacx z<-3arg&@<^nro?7SzYQsdu?m9 zheLincd{gDaYA-mq|CciTw-Q08{%3wQ#fyQ z*t27}d=-S|&oz&#-3ld+QdD7VSI4Kd4!ut}wD$WkUpK}O2Y%px1d7CG{lhVdp+QZn zzs=;Aoj)G6Dy(14_jkDHu&oDPU>-Ob6%b51r9!W;hn5XN6iH0jw`I_IF5G5;mL1j5 zr-+r0I#BKs33?HL;FI7oI?jH+X&*cjlLKv3JDIPcb5Poe`0_=aVsWvF<~|K5DbI0) zd?+!zOj1J4nQ_aiP~Lbh%D8Mp=akGUqs?kPiLMz|ygdK}kBRiLjjH)c(C-O9H2K3s zjch!FYT%_!ABLnSpohPbv3cq|iMQ?|G5D4}x^MOnY**DUzAbFr5i4N7 z4=s4#2`kt|Ogt-^fKEF43^lVo^XEuh-@P-wgZ8Xc{{) z0mcv^9BW$^vx3_I?4*%&iNy4z1S& zWRxPl89O#W#CEcH7sNe;Dm|wZYdsdm5qLvKeFqbz>RNJOY zNLUiPzA7P;sUDtPQoSQ(@(S#(rFM>hh?GD^&y8!mkP5@6as1aw{pqmFT9uvID`i6MFRC0nM$4#LEG`XKAf_Z!HCq=b{_z z9S0tvrXy9$el_kB7_EpOLK$m?Tiq1$-LT#I7V!dj*-~&*2W=3`>J^C!Qw!Z2hM+8Y{?2Y!3rT_ zXdBQhz-Rfp9BD$B;=h%fqb;$*P55G%yS&x9&ae$}x)SsoyeUMD-$>YSTk?nx;v;8` zF#MYn2fP3w=7{2Dw9cPLHZi-7lz3DH9{LpkC*|=ytOJjs5HAL`A5O=3wsQ42N@PBJ zKtWG&*9^t~)nRRoT8S|U9Gm=GO!Vn1I?cW)>Gv<5%AV(20%q`c zyBOA9?4--kPZ5-BrY-pnZ6Aao$hvPBwoc0mP*jEorr`{^XQ-0#iA|1M0XVicitL8c zw4S+qLAjla=27P1id=%1s*6K^l-uXKC2nLNI9B@Y57#N-SKgidp6#KVk1(#7<6Etn zCue9bS%P#mE5nL}G}F3OgfeZ>oy>soo8}1^=Nq4X3BABumq);qn6!%`+wu-1{?0Rl z@Q>6n>$*|tnU6R+3Zo`NcXp`~En^@ZC^`;n!jzw^qT^nDRuilo$|S37c%AkUQP6>O zFBwZo6PeS=h7B`ujB1NJ&6de2Ryzl74!KB^K}?VvpN0>DeQ20kL!lBxD74?>mM4tCBx`r(IO2(l>oxsla*JI#RHXr5ye0AW)OAqN(h(!K667F~vrX&k z8n(6+v*=~2RI%B*$g=Knk^d2l(x@lD8$2}JH2a1~i>^@0z^d-sYT7TJi94a?O}!KT z@$}-`k$6tznpF>?xS+^nkt*98(<)IP&6#oQnM`Z^lQjhO!SKxQP78YRpNKbyJW}Vm&^4pWD!c#kD|y858$RhL%pCt z@B5PxtZy~E20Yc9;d5P`H1>}DD8LCB@3h&w8&Mj{7X!(&xaY%{gj#qQJGoR7HSNZ`kOD;e>BF$Y7WcqU^J5$S5FrYqA5l2 zm#?uUnamEmz>!NDo@Lk3j^QYr$`nPTR&^shu?6~kAS-h0awL?aMra z(+)M;4QzTdO5EqG(Ij`7h52Hj`JI+bbuB6#+5EB{@WoEFcn~cKg(s^}Q_z|x!8$#< ze#SrR_uR1ViiPRSjeoH1Dg-pg^9;=#Pl6fX02dndn=1F!AZf9CKnw2tV1VRB$SnTb zEV(m6FQDKx0h>?5-N*DTWF2mh&z%jj4Bgf_|xL?3!eeFb$Pn`Z~n zWK8p3xn+vIC^N(9ey>1O$-RR4p^YsiMZ(*sxF*wQ2T*6Ld=Pw%YMxdO@R(J|5}4_g zmP38_MferE@#UL7LPtTVb1#b@!q2Mr$oF>xCS!ad)-2rA8HUAX!r2#$$$~ryzx5Gxp2 z8W}j+*#Glb(nimaU(Zs{+Q7*EpC-Cf>DmEN2+jKm!^5iOiHEzZFq?q6^)6s)k?czZ7_;VeI?8xwXFy@Lqu10-PDQDL$uye+dI_1rJgI2 zEDp>Je0N7Ej5*9Y(0}|t+}6+xQ$3l~K)Q}cYw0Fv+b|7koEE^*=aNW&Je{~)xNjme zpgs`#v$}%s9F3;QQjE=B6KSkZT{{Yc_6&_!YXatp#k-o{d;Uh9=&HTRPtzOTeJZG_ z8nJ`X>_Kbt}kgTu0tD~PFx9g-xGKIn$ zx2+N3N^dStddMhBJr5&{-n9z;T-Q8K+_OMNpBwZZZn==b4{o1hq!;Q~~KVGZXA{vmD>2;9!^ZT}1y&UmoqpNGs3u`J<_&XS` z!WI-C!ntv^OUFgxDVrv}_dQg<(&|I&6*(W>Jzqe2T=~(X4b8puWF|+ys?gh>cylMd zBCME_Kl^iXYk1-;;Cy>;<5Y34+MQS45f@Ide>A-sbXz$!N)d@|CJY;&4_5?`nELO2 zenyNUevB22Zm}TrS^0L+k!K{Mv~D9iY{Yp?*N9ylVVs?n#f4iZNiK43-m9|*_B)>a z1FuYS6ra8_=uD%Q7zZACO@JIZE|4bx#2U+cBe0juF+vct!C_HV8Cw0%VDNJ?`z3}6 z)oz2Zi&Iy<%wga^XM+RXxm^NQk)AC=pT8cd^9396rV65dvFSTn1Ln|rhTLjB==YaE zb>qJRy1@u4g7(nEcgmghy&*zEGpJRUi zx9p-rQGMx}9}D}4ALYEwzgO)4=WXl%c=Au#|5Nn;PoXRS6Z%dJz3JE<#Gk+qnTSvI zlvMhM92kf^iC;Z-VaXpX!*Gpq^D1~#3X-(z>o=@>bRWwjX^tmfQAZi6E9cm41kUtq z_m0j^uB!>N7~*=l&R)pH#73IOwZpa7m8A8z+fT?<#tlZm?wY|?!_`eGcUewTRcSlj zS@9#1j1WVc1O9kt>1CwIV`R4EeQAnwBpuC}y-7I7Y!>*k!$Tp9sRsDGv^3h1tL9b1 zfy>^;ftU^Hr7c&HFWmypa>+w!na2KXM}vQ!8J`5^fLm~$eXgSHC|ouyd4FwPVbSy~ z$!qn+N~*2)psW_5E?6sqztp@ET^h-FO~Gh`wc3Vb!R>}MtiS-zs*T&mZuPQ+$WZHe z&49|dd$8Cr7yD_lc+=1rw#u~go%(4Jbo1fw;N7|xM4Tp!Z_B4)i zzVEM1k_66u^roUe`Fdo@N_f79P{>x7{TOF6x%i>N!A13_TLtZA;;sHlK15A(^b_ObP&kgJ1Yvp;zj2?`Y0ukZwGh?}{=+=Xf8|o|K zW)v%ZW1pso%4GX_P>6@SbDp1~z&e~&GB=jS%#lMu9D={){?4i7jvH;c zM(BHjVJdNkNUe7)0?;Pf-i#>y_EhaWp`iq1ayN6R3iE3Cry=~;MN~3wK z!J4i3XPa{dR}n2&bpO@$$R2)`Sk7KTBvz>jxXP*Bdnb|mx1WBnB1_u}bo&vsnBiB#ThF*rvF>LcbUuJAl0^GRqLv<~X|{{)$COi>n}X z1gtR$;s!cG7QbP{s@Nvh61G641ApTUVeH>@)hxE2{2I zMZLQnb#jr|FE6E;lq<#bpuzE9!N+DeyjE6Kt~#dDKB*^0;0YJN>exh4zoIPI*=h8I zhK(vOTA~*VQf3{&C$Uv(yg{&2W}M_O*aWtX<|fq?cb(|(K+QemG9Wm z0&`r)o-)u^3q5#+IBplYZuOIQ#GrV}A~{ VuV%)A&K|h4B}voJ7{tDELQ;#j4bX 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�lwmX;1FUK~P)sEJTDXybU|KFn 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 K5)J-~MDjlb*)$#i literal 0 HcmV?d00001 diff --git a/hadoop-tools/hadoop-aws/pom.xml b/hadoop-tools/hadoop-aws/pom.xml index 28605c47f33b6c..0603a88b7f1421 100644 --- a/hadoop-tools/hadoop-aws/pom.xml +++ b/hadoop-tools/hadoop-aws/pom.xml @@ -472,11 +472,18 @@ amazon-s3-encryption-client-java provided - + + + software.amazon.s3.analyticsaccelerator + analyticsaccelerator-s3 + 0.0.2 + system + ${project.basedir}/libaws/analyticsaccelerator-s3-0.0.2.jar software.amazon.awssdk.crt diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index e9f53132735802..8862d06ba0502a 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -75,6 +75,10 @@ import org.apache.hadoop.fs.s3a.UploadInfo; import org.apache.hadoop.fs.s3a.api.RequestFactory; import org.apache.hadoop.fs.s3a.audit.AuditSpanS3A; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStreamFactory; +import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.impl.streams.StreamThreadOptions; import org.apache.hadoop.fs.s3a.statistics.S3AStatisticsContext; import org.apache.hadoop.fs.statistics.DurationTracker; import org.apache.hadoop.fs.statistics.DurationTrackerFactory; @@ -82,6 +86,7 @@ import org.apache.hadoop.fs.store.audit.AuditSpanSource; import org.apache.hadoop.service.CompositeService; import org.apache.hadoop.util.DurationInfo; +import org.apache.hadoop.util.Preconditions; import org.apache.hadoop.util.RateLimiting; import org.apache.hadoop.util.functional.Tuples; @@ -227,6 +232,9 @@ public class S3AStoreImpl @Override protected void serviceInit(final Configuration conf) throws Exception { + // create and register the stream factory, which will + // then follow the service lifecycle + objectInputStreamFactory = createStreamFactory(conf); if(conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics) { final S3AsyncClient s3AsyncClient = getOrCreateAsyncCRTClient(conf); objectInputStreamFactory = createStreamFactory(conf, s3AsyncClient); @@ -235,10 +243,15 @@ protected void serviceInit(final Configuration conf) throws Exception { } addService(objectInputStreamFactory); - // init all child services + // init all child services, including the stream factory super.serviceInit(conf); + + // pass down extra information to the stream factory. + finishStreamFactoryInit(); } + + private S3AsyncClient getOrCreateAsyncCRTClient(final Configuration conf) throws Exception { final S3AsyncClient s3AsyncClient; boolean analyticsAcceleratorCRTEnabled = conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, @@ -260,9 +273,8 @@ protected void serviceStart() throws Exception { initLocalDirAllocator(); } - /** - * Return the store capabilities. + * Return the store path capabilities. * If the object stream factory is non-null, hands off the * query to that factory if not handled here. * @param path path to query the capability of. @@ -279,6 +291,7 @@ public boolean hasPathCapability(final Path path, final String capability) { } } + /** * Return the capabilities of input streams created * through the store. @@ -948,6 +961,25 @@ public File createTemporaryFileForWriting(String pathStr, return File.createTempFile(prefix, null, dir); } + /* + =============== BEGIN ObjectInputStreamFactory =============== + */ + + /** + * All stream factory initialization required after {@code Service.init()}, + * after all other services have themselves been initialized. + */ + private void finishStreamFactoryInit() { + // must be on be invoked during service initialization + Preconditions.checkState(isInState(STATE.INITED), + "Store is in wrong state: %s", getServiceState()); + Preconditions.checkState(clientManager.isInState(STATE.INITED), + "Client Manager is in wrong state: %s", clientManager.getServiceState()); + + // finish initialization and pass down callbacks to self + objectInputStreamFactory.bind(new FactoryCallbacks()); + } + @Override /* ObjectInputStreamFactory */ public ObjectInputStream readObject(ObjectReadParameters parameters) throws IOException { @@ -959,4 +991,32 @@ public ObjectInputStream readObject(ObjectReadParameters parameters) public StreamThreadOptions threadRequirements() { return objectInputStreamFactory.threadRequirements(); } + + /** + * This operation is not implemented, as + * is this class which invokes it on the actual factory. + * @param callbacks factory callbacks. + * @throws UnsupportedOperationException always + */ + @Override /* ObjectInputStreamFactory */ + public void bind(final StreamFactoryCallbacks callbacks) { + throw new UnsupportedOperationException("Not supported"); + } + + /** + * Callbacks from {@link ObjectInputStreamFactory} instances. + */ + private class FactoryCallbacks implements StreamFactoryCallbacks { + + @Override + public S3AsyncClient getOrCreateAsyncClient(final boolean requireCRT) throws IOException { + // Needs support of the CRT before the requireCRT can be used + LOG.debug("Stream factory requested async client"); + return clientManager().getOrCreateAsyncClient(); + } + } + + /* + =============== END ObjectInputStreamFactory =============== + */ } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java index d3b6c671139975..7c20f7d66f61b4 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java @@ -21,6 +21,7 @@ import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.fs.statistics.StreamStatisticNames; import org.apache.hadoop.service.AbstractService; +import org.apache.hadoop.util.Preconditions; import static org.apache.hadoop.util.StringUtils.toLowerCase; @@ -34,6 +35,33 @@ protected AbstractObjectInputStreamFactory(final String name) { super(name); } + /** + * Callbacks. + */ + private StreamFactoryCallbacks callbacks; + + /** + * Bind to the callbacks. + *

    + * The base class checks service state then stores + * the callback interface. + * @param factoryCallbacks callbacks needed by the factories. + */ + @Override + public void bind(final StreamFactoryCallbacks factoryCallbacks) { + // must be on be invoked during service initialization + Preconditions.checkState(isInState(STATE.INITED), + "Input Stream factory %s is in wrong state: %s", + this, getServiceState()); + this.callbacks = factoryCallbacks; + } + + /** + * Return base capabilities of all stream factories, + * defined what the base ObjectInputStream class does. + * @param capability string to query the stream support for. + * @return true if implemented + */ @Override public boolean hasCapability(final String capability) { switch (toLowerCase(capability)) { @@ -45,4 +73,11 @@ public boolean hasCapability(final String capability) { } } + /** + * Get the factory callbacks. + * @return callbacks. + */ + public StreamFactoryCallbacks callbacks() { + return callbacks; + } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java index 1293bd4f92a06d..d8fe87f9cf7fdd 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java @@ -20,6 +20,8 @@ import java.io.IOException; +import software.amazon.awssdk.services.s3.S3AsyncClient; + import org.apache.hadoop.fs.StreamCapabilities; import org.apache.hadoop.service.Service; @@ -38,6 +40,14 @@ public interface ObjectInputStreamFactory extends Service, StreamCapabilities { + /** + * Set extra initialization parameters. + * This MUST ONLY be invoked between {@code init()} + * and {@code start()}. + * @param callbacks extra initialization parameters + */ + void bind(StreamFactoryCallbacks callbacks); + /** * Create a new input stream. * There is no requirement to actually contact the store; this is generally done @@ -55,5 +65,18 @@ ObjectInputStream readObject(ObjectReadParameters parameters) */ StreamThreadOptions threadRequirements(); + /** + * Callbacks for stream factories. + */ + interface StreamFactoryCallbacks { + + /** + * Get the Async S3Client, raising a failure to create as an IOException. + * @param requireCRT is the CRT required. + * @return the Async S3 client + * @throws IOException failure to create the client. + */ + S3AsyncClient getOrCreateAsyncClient(boolean requireCRT) throws IOException; + } } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index 46dd3266cab4c4..b922b2f7f3d3c5 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -50,12 +50,20 @@ public final class StreamIntegration { */ public static ObjectInputStreamFactory createStreamFactory(final Configuration conf) { // choose the default input stream type + + // work out the default stream; this includes looking at the + // deprecated prefetch enabled key to see if it is set. InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { + + // prefetch enabled, warn (once) then change it to be the default. WARN_PREFETCH_KEY.info("Using {} is deprecated: choose the appropriate stream in {}", PREFETCH_ENABLED_KEY, INPUT_STREAM_TYPE); defaultStream = InputStreamType.Prefetch; } + + // retrieve the enum value, returning the configured value or + // the default...then instantiate it. return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) .factory() .apply(conf, null); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java index b490294b7696dd..4109580c4ce5de 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/prefetch/PrefetchingInputStreamFactory.java @@ -62,7 +62,7 @@ protected void serviceInit(final Configuration conf) throws Exception { long prefetchBlockSizeLong = longBytesOption(conf, PREFETCH_BLOCK_SIZE_KEY, PREFETCH_BLOCK_DEFAULT_SIZE, 1); checkState(prefetchBlockSizeLong < Integer.MAX_VALUE, - "S3A prefatch block size exceeds int limit"); + "S3A prefetch block size exceeds int limit"); prefetchBlockSize = (int) prefetchBlockSizeLong; prefetchBlockCount = intOption(conf, PREFETCH_BLOCK_COUNT_KEY, PREFETCH_BLOCK_DEFAULT_COUNT, 1); @@ -87,4 +87,5 @@ public ObjectInputStream readObject(final ObjectReadParameters parameters) throw public StreamThreadOptions threadRequirements() { return new StreamThreadOptions(prefetchBlockCount, 0, true, false); } + } From 1ee9f119d6e906a348e3de1b9643ccb3505606c0 Mon Sep 17 00:00:00 2001 From: rajdchak Date: Fri, 24 Jan 2025 13:41:17 +0000 Subject: [PATCH 12/13] Updated S3A integration to follow stream factory callbacks Dummy --- .../hadoop/fs/s3a/impl/S3AStoreImpl.java | 25 +-------- .../AbstractObjectInputStreamFactory.java | 2 +- .../fs/s3a/impl/streams/FactoryParams.java | 53 ------------------- .../fs/s3a/impl/streams/InputStreamType.java | 14 ++--- .../streams/ObjectInputStreamFactory.java | 2 +- .../S3ASeekableInputStreamFactory.java | 23 ++++---- .../s3a/impl/streams/StreamIntegration.java | 27 ++++------ 7 files changed, 32 insertions(+), 114 deletions(-) delete mode 100644 hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java index 8862d06ba0502a..945af711871b90 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/S3AStoreImpl.java @@ -235,12 +235,6 @@ protected void serviceInit(final Configuration conf) throws Exception { // create and register the stream factory, which will // then follow the service lifecycle objectInputStreamFactory = createStreamFactory(conf); - if(conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics) { - final S3AsyncClient s3AsyncClient = getOrCreateAsyncCRTClient(conf); - objectInputStreamFactory = createStreamFactory(conf, s3AsyncClient); - } else { - objectInputStreamFactory = createStreamFactory(conf); - } addService(objectInputStreamFactory); // init all child services, including the stream factory @@ -250,23 +244,6 @@ protected void serviceInit(final Configuration conf) throws Exception { finishStreamFactoryInit(); } - - - private S3AsyncClient getOrCreateAsyncCRTClient(final Configuration conf) throws Exception { - final S3AsyncClient s3AsyncClient; - boolean analyticsAcceleratorCRTEnabled = conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, - ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); - LOG.info("Using S3SeekableInputStream"); - if(analyticsAcceleratorCRTEnabled) { - LOG.info("Using S3 CRT client for analytics accelerator S3"); - s3AsyncClient = S3CrtAsyncClient.builder().maxConcurrency(600).build(); - } else { - LOG.info("Using S3 async client for analytics accelerator S3"); - s3AsyncClient = getOrCreateAsyncClient(); - } - return s3AsyncClient; - } - @Override protected void serviceStart() throws Exception { super.serviceStart(); @@ -969,7 +946,7 @@ public File createTemporaryFileForWriting(String pathStr, * All stream factory initialization required after {@code Service.init()}, * after all other services have themselves been initialized. */ - private void finishStreamFactoryInit() { + private void finishStreamFactoryInit() throws Exception { // must be on be invoked during service initialization Preconditions.checkState(isInState(STATE.INITED), "Store is in wrong state: %s", getServiceState()); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java index 7c20f7d66f61b4..cd955ce75359a8 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AbstractObjectInputStreamFactory.java @@ -48,7 +48,7 @@ protected AbstractObjectInputStreamFactory(final String name) { * @param factoryCallbacks callbacks needed by the factories. */ @Override - public void bind(final StreamFactoryCallbacks factoryCallbacks) { + public void bind(final StreamFactoryCallbacks factoryCallbacks) throws Exception { // must be on be invoked during service initialization Preconditions.checkState(isInState(STATE.INITED), "Input Stream factory %s is in wrong state: %s", diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java deleted file mode 100644 index e4c76837e27dcf..00000000000000 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/FactoryParams.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.apache.hadoop.fs.s3a.impl.streams; - -import software.amazon.awssdk.services.s3.S3AsyncClient; - -/** - * Factory parameters class to hold various parameters needed for stream creation. - */ -public class FactoryParams { - private final S3AsyncClient s3AsyncClient; - - private FactoryParams(Builder builder) { - this.s3AsyncClient = builder.s3AsyncClient; - } - - public S3AsyncClient getS3AsyncClient() { - return s3AsyncClient; - } - - public static class Builder { - private S3AsyncClient s3AsyncClient; - - public Builder withS3AsyncClient(S3AsyncClient s3AsyncClient) { - this.s3AsyncClient = s3AsyncClient; - return this; - } - - public FactoryParams build() { - return new FactoryParams(this); - } - } - - public static Builder builder() { - return new Builder(); - } -} diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java index 966d66c5e3bfd1..1b3155ab5f0dad 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -18,7 +18,6 @@ package org.apache.hadoop.fs.s3a.impl.streams; -import java.util.function.BiFunction; import java.util.function.Function; import org.apache.hadoop.conf.Configuration; @@ -44,14 +43,15 @@ public enum InputStreamType { /** * The analytics input stream. */ - Analytics("analytics", (c, factoryParams) -> new S3ASeekableInputStreamFactory(factoryParams.getS3AsyncClient())); + Analytics("analytics", c -> + new S3ASeekableInputStreamFactory()); /** * Name. */ private final String name; - private final BiFunction factory; + private final Function factory; /** * String name. * @return the name @@ -60,11 +60,7 @@ public String getName() { return name; } - InputStreamType(String name, Function factory) { - this(name, (c, s) -> factory.apply(c)); - } - - InputStreamType(String name, BiFunction factory) { + InputStreamType(String name, final Function factory) { this.name = name; this.factory = factory; } @@ -73,7 +69,7 @@ public String getName() { * Factory constructor. * @return the factory associated with this stream type. */ - public BiFunction factory() { + public Function factory() { return factory; } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java index d8fe87f9cf7fdd..504b6a26fccc35 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectInputStreamFactory.java @@ -46,7 +46,7 @@ public interface ObjectInputStreamFactory * and {@code start()}. * @param callbacks extra initialization parameters */ - void bind(StreamFactoryCallbacks callbacks); + void bind(StreamFactoryCallbacks callbacks) throws Exception; /** * Create a new input stream. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java index a3c4e5908356dc..63a8b6b03c9ae9 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java @@ -21,7 +21,6 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.s3a.S3ASeekableInputStream; -import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.s3.analyticsaccelerator.S3SdkObjectClient; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; @@ -33,12 +32,12 @@ public class S3ASeekableInputStreamFactory extends AbstractObjectInputStreamFactory { - private final S3AsyncClient s3AsyncClient; + private S3SeekableInputStreamConfiguration seekableInputStreamConfiguration; private S3SeekableInputStreamFactory s3SeekableInputStreamFactory; + private boolean requireCrt; - public S3ASeekableInputStreamFactory(S3AsyncClient s3AsyncClient) { + public S3ASeekableInputStreamFactory() { super("S3ASeekableInputStreamFactory"); - this.s3AsyncClient = s3AsyncClient; } @Override @@ -46,12 +45,18 @@ protected void serviceInit(final Configuration conf) throws Exception { super.serviceInit(conf); ConnectorConfiguration configuration = new ConnectorConfiguration(conf, ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); - S3SeekableInputStreamConfiguration seekableInputStreamConfiguration = + this.seekableInputStreamConfiguration = S3SeekableInputStreamConfiguration.fromConfiguration(configuration); - this.s3SeekableInputStreamFactory = - new S3SeekableInputStreamFactory( - new S3SdkObjectClient(this.s3AsyncClient), - seekableInputStreamConfiguration); + this.requireCrt = conf.getBoolean(ANALYTICS_ACCELERATOR_CRT_ENABLED, + ANALYTICS_ACCELERATOR_CRT_ENABLED_DEFAULT); + } + + @Override + public void bind(final StreamFactoryCallbacks factoryCallbacks) throws Exception { + super.bind(factoryCallbacks); + this.s3SeekableInputStreamFactory = new S3SeekableInputStreamFactory( + new S3SdkObjectClient(callbacks().getOrCreateAsyncClient(requireCrt)), + seekableInputStreamConfiguration); } @Override diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index b922b2f7f3d3c5..2e3c20e61e321a 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -18,6 +18,7 @@ package org.apache.hadoop.fs.s3a.impl.streams; +import org.apache.hadoop.fs.s3a.S3AFileSystem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +38,8 @@ public final class StreamIntegration { LoggerFactory.getLogger( "org.apache.hadoop.conf.Configuration.deprecation"); + public static final Logger LOG = LoggerFactory.getLogger(StreamIntegration.class); + /** * Warn once on use of prefetch boolean flag rather than enum. */ @@ -54,7 +57,12 @@ public static ObjectInputStreamFactory createStreamFactory(final Configuration c // work out the default stream; this includes looking at the // deprecated prefetch enabled key to see if it is set. InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; - if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { + + if(conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics) { + LOG.info("Using S3SeekableInputStream"); + defaultStream = InputStreamType.Analytics; + + } else if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { // prefetch enabled, warn (once) then change it to be the default. WARN_PREFETCH_KEY.info("Using {} is deprecated: choose the appropriate stream in {}", @@ -66,22 +74,7 @@ public static ObjectInputStreamFactory createStreamFactory(final Configuration c // the default...then instantiate it. return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) .factory() - .apply(conf, null); + .apply(conf); } - /** - * Create the s3 seekable input stream factory. - * @param conf configuration - * @param s3AsyncClient s3 async client - * @return a stream factory. - */ - public static ObjectInputStreamFactory createStreamFactory(final Configuration conf, final S3AsyncClient s3AsyncClient) { - FactoryParams factoryParams = FactoryParams.builder() - .withS3AsyncClient(s3AsyncClient) - .build(); - InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; - return conf.getEnum(INPUT_STREAM_TYPE, defaultStream) - .factory() - .apply(conf, factoryParams); } - } From ed310a04eb3ccacf54753bcf45db5706c7cb0ffd Mon Sep 17 00:00:00 2001 From: rajdchak Date: Fri, 24 Jan 2025 14:57:53 +0000 Subject: [PATCH 13/13] Addressed Steve's comments about renaming and adjusting tests --- .../streams/AnalyticsStream.java} | 12 +++++------ ...ctory.java => AnalyticsStreamFactory.java} | 9 ++++----- .../fs/s3a/impl/streams/InputStreamType.java | 2 +- .../s3a/impl/streams/StreamIntegration.java | 2 +- .../fs/s3a/ITestS3AS3SeekableStream.java | 20 +++++++++++-------- .../s3a/commit/ITestCommitOperationCost.java | 4 ++-- .../s3a/commit/ITestS3ACommitterFactory.java | 2 +- .../magic/ITestMagicCommitProtocol.java | 2 +- .../ITestS3AFileSystemStatistic.java | 2 +- 9 files changed, 29 insertions(+), 26 deletions(-) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/{S3ASeekableInputStream.java => impl/streams/AnalyticsStream.java} (91%) rename hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/{S3ASeekableInputStreamFactory.java => AnalyticsStreamFactory.java} (91%) diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStream.java similarity index 91% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStream.java index 6eaf0217aacaf6..50b9cde8d239a7 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ASeekableInputStream.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStream.java @@ -17,15 +17,15 @@ * under the License. */ -package org.apache.hadoop.fs.s3a; +package org.apache.hadoop.fs.s3a.impl.streams; import java.io.EOFException; import java.io.IOException; import org.apache.hadoop.fs.FSExceptionMessages; import org.apache.hadoop.fs.StreamCapabilities; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectInputStream; -import org.apache.hadoop.fs.s3a.impl.streams.ObjectReadParameters; +import org.apache.hadoop.fs.s3a.Retries; +import org.apache.hadoop.fs.s3a.S3ObjectAttributes; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,15 +33,15 @@ import software.amazon.s3.analyticsaccelerator.S3SeekableInputStream; import software.amazon.s3.analyticsaccelerator.util.S3URI; -public class S3ASeekableInputStream extends ObjectInputStream implements StreamCapabilities { +public class AnalyticsStream extends ObjectInputStream implements StreamCapabilities { private S3SeekableInputStream inputStream; private long lastReadCurrentPos = 0; private volatile boolean closed; - public static final Logger LOG = LoggerFactory.getLogger(S3ASeekableInputStream.class); + public static final Logger LOG = LoggerFactory.getLogger(AnalyticsStream.class); - public S3ASeekableInputStream(final ObjectReadParameters parameters, final S3SeekableInputStreamFactory s3SeekableInputStreamFactory) { + public AnalyticsStream(final ObjectReadParameters parameters, final S3SeekableInputStreamFactory s3SeekableInputStreamFactory) { super(parameters); S3ObjectAttributes s3Attributes = parameters.getObjectAttributes(); this.inputStream = s3SeekableInputStreamFactory.createStream(S3URI.of(s3Attributes.getBucket(), s3Attributes.getKey())); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStreamFactory.java similarity index 91% rename from hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java rename to hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStreamFactory.java index 63a8b6b03c9ae9..cc14ebf36fbba0 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/S3ASeekableInputStreamFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStreamFactory.java @@ -20,7 +20,6 @@ package org.apache.hadoop.fs.s3a.impl.streams; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.s3a.S3ASeekableInputStream; import software.amazon.s3.analyticsaccelerator.S3SdkObjectClient; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory; @@ -30,14 +29,14 @@ import static org.apache.hadoop.fs.s3a.Constants.*; -public class S3ASeekableInputStreamFactory extends AbstractObjectInputStreamFactory { +public class AnalyticsStreamFactory extends AbstractObjectInputStreamFactory { private S3SeekableInputStreamConfiguration seekableInputStreamConfiguration; private S3SeekableInputStreamFactory s3SeekableInputStreamFactory; private boolean requireCrt; - public S3ASeekableInputStreamFactory() { - super("S3ASeekableInputStreamFactory"); + public AnalyticsStreamFactory() { + super("AnalyticsStreamFactory"); } @Override @@ -61,7 +60,7 @@ public void bind(final StreamFactoryCallbacks factoryCallbacks) throws Exception @Override public ObjectInputStream readObject(final ObjectReadParameters parameters) throws IOException { - return new S3ASeekableInputStream( + return new AnalyticsStream( parameters, s3SeekableInputStreamFactory); } diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java index 1b3155ab5f0dad..6aab7e531c60d3 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/InputStreamType.java @@ -44,7 +44,7 @@ public enum InputStreamType { * The analytics input stream. */ Analytics("analytics", c -> - new S3ASeekableInputStreamFactory()); + new AnalyticsStreamFactory()); /** * Name. diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java index 2e3c20e61e321a..1dffc0aa3fe74a 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/StreamIntegration.java @@ -59,7 +59,7 @@ public static ObjectInputStreamFactory createStreamFactory(final Configuration c InputStreamType defaultStream = InputStreamType.DEFAULT_STREAM_TYPE; if(conf.getEnum(INPUT_STREAM_TYPE, InputStreamType.DEFAULT_STREAM_TYPE) == InputStreamType.Analytics) { - LOG.info("Using S3SeekableInputStream"); + LOG.info("Using AnalyticsStream"); defaultStream = InputStreamType.Analytics; } else if (conf.getBoolean(PREFETCH_ENABLED_KEY, false)) { diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java index 0d53ef741eeb0a..c9775f441abf29 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AS3SeekableStream.java @@ -31,6 +31,8 @@ import static org.apache.hadoop.fs.s3a.Constants.*; import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides; +import org.assertj.core.api.Assertions; + import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamConfiguration; import software.amazon.s3.analyticsaccelerator.common.ConnectorConfiguration; import software.amazon.s3.analyticsaccelerator.util.PrefetchMode; @@ -92,11 +94,13 @@ public void testConnectorFrameworkConfigurable(boolean useCrtClient) { S3SeekableInputStreamConfiguration configuration = S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration); - assertSame("S3ASeekableInputStream configuration is not set to expected value", - PrefetchMode.ALL, configuration.getLogicalIOConfiguration().getPrefetchingMode()); + Assertions.assertThat(configuration.getLogicalIOConfiguration().getPrefetchingMode()) + .as("AnalyticsStream configuration is not set to expected value") + .isSameAs(PrefetchMode.ALL); - assertEquals("S3ASeekableInputStream configuration is not set to expected value", - 1, configuration.getPhysicalIOConfiguration().getBlobStoreCapacity()); + Assertions.assertThat(configuration.getPhysicalIOConfiguration().getBlobStoreCapacity()) + .as("AnalyticsStream configuration is not set to expected value") + .isEqualTo(1); } @Test @@ -110,7 +114,7 @@ public void testConnectorFrameworkConfigurableWithCrtClient() throws IOException } @Test - public void testInvalidConfigurationThrows() { + public void testInvalidConfigurationThrows() throws Exception { describe("Verify S3 connector framework throws with invalid configuration"); Configuration conf = getConfiguration(); @@ -121,8 +125,8 @@ public void testInvalidConfigurationThrows() { ConnectorConfiguration connectorConfiguration = new ConnectorConfiguration(conf, ANALYTICS_ACCELERATOR_CONFIGURATION_PREFIX); - assertThrows("S3ASeekableInputStream illegal configuration does not throw", - IllegalArgumentException.class, () -> - S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration)); + Assertions.assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> + S3SeekableInputStreamConfiguration.fromConfiguration(connectorConfiguration)); } } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java index 39b9a769e75d6f..515313b009dc23 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestCommitOperationCost.java @@ -171,7 +171,7 @@ public void testCostOfCreatingMagicFile() throws Throwable { describe("Files created under magic paths skip existence checks and marker deletes"); skipIfAnalyticsAcceleratorEnabled(getConfiguration(), - "S3ASeekableInputStream does not support InputStreamStatistics"); + "AnalyticsStream does not support InputStreamStatistics"); S3AFileSystem fs = getFileSystem(); Path destFile = methodSubPath("file.txt"); fs.delete(destFile.getParent(), true); @@ -250,7 +250,7 @@ public void testCostOfSavingLoadingPendingFile() throws Throwable { describe("Verify costs of saving .pending file under a magic path"); skipIfAnalyticsAcceleratorEnabled(getConfiguration(), - "S3ASeekableInputStream does not support InputStreamStatistics"); + "AnalyticsStream does not support InputStreamStatistics"); S3AFileSystem fs = getFileSystem(); Path partDir = methodSubPath("file.pending"); Path destFile = new Path(partDir, "file.pending"); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java index a500bfb76a322d..9057d1e366cc3d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/ITestS3ACommitterFactory.java @@ -184,7 +184,7 @@ public void setup() throws Exception { FileSystem.closeAllForUGI(UserGroupInformation.getCurrentUser()); super.setup(); skipIfAnalyticsAcceleratorEnabled(getConfiguration(), - "S3ASeekableInputStream does not support InputStreamStatistics"); + "AnalyticsStream does not support InputStreamStatistics"); jobId = randomJobId(); attempt0 = "attempt_" + jobId + "_m_000000_0"; taskAttempt0 = TaskAttemptID.forName(attempt0); diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java index b89740ae3120cf..542f6f2b7c772e 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/commit/magic/ITestMagicCommitProtocol.java @@ -79,7 +79,7 @@ protected String getCommitterName() { public void setup() throws Exception { super.setup(); skipIfAnalyticsAcceleratorEnabled(getConfiguration(), - "S3ASeekableInputStream does not support InputStreamStatistics"); + "AnalyticsStream does not support InputStreamStatistics"); CommitUtils.verifyIsMagicCommitFS(getFileSystem()); } diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java index 5a3f7bb8fdbb28..fb1cfb781e710d 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/statistics/ITestS3AFileSystemStatistic.java @@ -44,7 +44,7 @@ public class ITestS3AFileSystemStatistic extends AbstractS3ATestBase { */ @Test public void testBytesReadWithStream() throws IOException { - // Assertions will fail as {@link S3ASeekableInputStream} + // Assertions will fail as {@link AnalyticsStream} // do not support S3AFileSystemStatistics yet. skipIfAnalyticsAcceleratorEnabled(getConfiguration(), "S3SeekableStream does not support File System Statistics");