Merge branch 'trunk' into HADOOP-13345
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/c41f9f3b Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/c41f9f3b Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/c41f9f3b Branch: refs/heads/HADOOP-13345 Commit: c41f9f3b71da1d37a9875cf6fcf4eb4f06ad9b5f Parents: 13fafee b053fdc Author: Mingliang Liu <[email protected]> Authored: Wed Apr 12 15:12:11 2017 -0700 Committer: Mingliang Liu <[email protected]> Committed: Wed Apr 12 15:12:11 2017 -0700 ---------------------------------------------------------------------- BUILDING.txt | 2 +- LICENSE.txt | 9 +- dev-support/bin/yetus-wrapper | 44 +- dev-support/docker/Dockerfile | 16 +- .../hadoop-client-integration-tests/pom.xml | 5 + .../hadoop-client-minicluster/pom.xml | 4 - .../util/RandomSignerSecretProvider.java | 9 +- .../util/ZKSignerSecretProvider.java | 10 +- .../util/TestRandomSignerSecretProvider.java | 68 +- .../util/TestZKSignerSecretProvider.java | 154 +- .../jdiff/Apache_Hadoop_Common_2.8.0.xml | 37921 +++++++++++++++++ hadoop-common-project/hadoop-common/pom.xml | 15 +- .../hadoop-common/src/main/bin/hadoop | 69 +- .../hadoop-common/src/main/bin/hadoop-config.sh | 10 +- .../src/main/bin/hadoop-functions.sh | 217 +- .../hadoop-common/src/main/conf/hadoop-env.sh | 13 +- .../src/main/conf/log4j.properties | 1 + .../org/apache/hadoop/conf/Configuration.java | 395 +- .../apache/hadoop/fs/AbstractFileSystem.java | 16 +- .../java/org/apache/hadoop/fs/ChecksumFs.java | 13 +- .../apache/hadoop/fs/DelegateToFileSystem.java | 6 + .../hadoop/fs/FSDataOutputStreamBuilder.java | 142 + .../java/org/apache/hadoop/fs/FileStatus.java | 23 +- .../java/org/apache/hadoop/fs/FileSystem.java | 12 +- .../org/apache/hadoop/fs/FilterFileSystem.java | 5 + .../java/org/apache/hadoop/fs/FilterFs.java | 8 +- .../org/apache/hadoop/fs/FsServerDefaults.java | 30 +- .../org/apache/hadoop/fs/HarFileSystem.java | 5 + .../hadoop/fs/MD5MD5CRC32FileChecksum.java | 62 - .../org/apache/hadoop/fs/ftp/FtpConfigKeys.java | 4 +- .../java/org/apache/hadoop/fs/ftp/FtpFs.java | 7 + .../apache/hadoop/fs/local/LocalConfigKeys.java | 5 +- .../org/apache/hadoop/fs/local/RawLocalFs.java | 8 + .../hadoop/fs/permission/FsPermission.java | 7 + .../hadoop/fs/permission/PermissionStatus.java | 13 - .../apache/hadoop/fs/shell/SetReplication.java | 30 +- .../apache/hadoop/fs/shell/XAttrCommands.java | 2 +- .../org/apache/hadoop/fs/viewfs/ChRootedFs.java | 9 +- .../org/apache/hadoop/fs/viewfs/ViewFs.java | 20 +- .../apache/hadoop/ha/ZKFailoverController.java | 3 +- .../apache/hadoop/io/erasurecode/CodecUtil.java | 135 +- .../apache/hadoop/metrics2/AbstractMetric.java | 3 +- .../org/apache/hadoop/metrics2/MetricsTag.java | 3 +- .../metrics2/impl/AbstractMetricsRecord.java | 3 +- .../org/apache/hadoop/metrics2/impl/MsInfo.java | 4 +- .../hadoop/metrics2/lib/MetricsInfoImpl.java | 3 +- .../hadoop/metrics2/lib/MetricsRegistry.java | 30 +- .../hadoop/metrics2/lib/MutableGaugeFloat.java | 80 + .../metrics2/lib/MutableMetricsFactory.java | 3 + .../hadoop/metrics2/source/JvmMetricsInfo.java | 6 +- .../hadoop/metrics2/util/MetricsCache.java | 4 +- .../org/apache/hadoop/net/NetworkTopology.java | 2 +- .../java/org/apache/hadoop/net/NodeBase.java | 2 +- .../hadoop/net/unix/DomainSocketWatcher.java | 12 +- .../alias/CredentialProviderFactory.java | 16 +- .../security/ssl/SSLHostnameVerifier.java | 21 +- .../java/org/apache/hadoop/util/KMSUtil.java | 20 +- .../apache/hadoop/util/LightWeightCache.java | 20 +- .../org/apache/hadoop/util/Progressable.java | 2 +- .../org/apache/hadoop/util/StringUtils.java | 8 +- .../main/java/org/apache/hadoop/util/Time.java | 10 + .../main/java/org/apache/hadoop/util/Timer.java | 10 + .../apache/hadoop/util/UTF8ByteArrayUtils.java | 4 +- .../org/apache/hadoop/util/VersionInfo.java | 27 +- .../apache/hadoop/util/curator/ChildReaper.java | 4 +- .../src/main/native/gtest/gtest-all.cc | 2 +- .../src/main/native/gtest/include/gtest/gtest.h | 2 +- .../src/main/resources/core-default.xml | 99 +- .../src/site/markdown/FileSystemShell.md | 2 +- .../src/site/markdown/SecureMode.md | 20 +- .../src/site/markdown/UnixShellGuide.md | 31 +- .../src/site/markdown/filesystem/filesystem.md | 14 +- .../markdown/release/2.8.0/CHANGES.2.8.0.md | 2986 ++ .../release/2.8.0/RELEASENOTES.2.8.0.md | 1105 + .../conf/TestCommonConfigurationFields.java | 2 +- .../apache/hadoop/conf/TestConfiguration.java | 62 +- .../fs/FileContextMainOperationsBaseTest.java | 21 +- .../org/apache/hadoop/fs/TestAfsCheckPath.java | 1 + .../org/apache/hadoop/fs/TestFileStatus.java | 10 +- .../java/org/apache/hadoop/fs/TestFilterFs.java | 12 + .../apache/hadoop/fs/TestLocalFileSystem.java | 54 + .../fs/contract/AbstractContractMkdirTest.java | 42 + .../hadoop/fs/contract/ContractTestUtils.java | 27 + .../hadoop/fs/viewfs/TestViewfsFileStatus.java | 10 +- .../apache/hadoop/fs/viewfs/ViewFsBaseTest.java | 49 + .../erasurecode/TestCodecRawCoderMapping.java | 71 +- .../coder/TestHHXORErasureCoder.java | 2 +- .../erasurecode/coder/TestRSErasureCoder.java | 2 +- .../metrics2/lib/TestMetricsAnnotations.java | 3 + .../metrics2/lib/TestMetricsRegistry.java | 4 +- .../hadoop/metrics2/lib/TestMutableMetrics.java | 2 + .../org/apache/hadoop/test/MetricsAsserts.java | 9 +- .../hadoop/test/MultithreadedTestUtil.java | 2 +- .../java/org/apache/hadoop/util/FakeTimer.java | 25 +- .../hadoop/util/TestLightWeightCache.java | 19 +- .../src/test/resources/testConf.xml | 2 +- .../scripts/hadoop_build_custom_subcmd_var.bats | 21 + .../test/scripts/hadoop_detect_priv_subcmd.bats | 34 + .../test/scripts/hadoop_get_verify_uservar.bats | 21 - .../src/test/scripts/hadoop_verify_user.bats | 53 - .../test/scripts/hadoop_verify_user_perm.bats | 53 + .../scripts/hadoop_verify_user_resolves.bats | 44 + .../main/java/org/apache/hadoop/fs/Hdfs.java | 6 + .../java/org/apache/hadoop/hdfs/DFSClient.java | 101 +- .../hadoop/hdfs/DFSInotifyEventInputStream.java | 4 +- .../org/apache/hadoop/hdfs/DFSInputStream.java | 2 +- .../org/apache/hadoop/hdfs/DFSOutputStream.java | 44 +- .../hadoop/hdfs/DFSStripedInputStream.java | 22 +- .../hadoop/hdfs/DFSStripedOutputStream.java | 1 + .../org/apache/hadoop/hdfs/DFSUtilClient.java | 15 +- .../hadoop/hdfs/DistributedFileSystem.java | 114 +- .../org/apache/hadoop/hdfs/HAUtilClient.java | 55 + .../apache/hadoop/hdfs/KeyProviderCache.java | 17 +- .../hadoop/hdfs/NameNodeProxiesClient.java | 15 +- .../hdfs/client/HdfsClientConfigKeys.java | 3 + .../hadoop/hdfs/protocol/ClientProtocol.java | 6 +- .../hadoop/hdfs/protocol/DatanodeInfo.java | 1 + .../hdfs/protocol/FsPermissionExtension.java | 17 +- .../hadoop/hdfs/protocol/HdfsConstants.java | 6 - .../protocol/SystemErasureCodingPolicies.java | 121 + .../protocol/datatransfer/PacketReceiver.java | 2 +- .../ClientNamenodeProtocolTranslatorPB.java | 5 +- .../hadoop/hdfs/protocolPB/PBHelperClient.java | 38 +- .../namenode/ha/ClientHAProxyFactory.java | 44 + .../ha/ConfiguredFailoverProxyProvider.java | 183 + .../hdfs/server/namenode/ha/HAProxyFactory.java | 44 + .../namenode/ha/IPFailoverProxyProvider.java | 126 + .../ha/RequestHedgingProxyProvider.java | 234 + .../hdfs/server/protocol/SlowDiskReports.java | 146 + .../apache/hadoop/hdfs/web/JsonUtilClient.java | 13 +- .../src/main/proto/ClientNamenodeProtocol.proto | 1 + .../src/main/proto/hdfs.proto | 8 +- .../ha/TestRequestHedgingProxyProvider.java | 476 + hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml | 5 + .../hadoop/fs/http/client/HttpFSFileSystem.java | 7 +- .../hadoop/fs/http/server/FSOperations.java | 39 +- .../src/site/markdown/index.md | 8 +- .../fs/http/client/BaseTestHttpFSWith.java | 24 +- .../hadoop/fs/http/server/TestHttpFSServer.java | 18 + .../org/apache/hadoop/test/TestHdfsHelper.java | 17 +- hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml | 10 +- .../jdiff/Apache_Hadoop_HDFS_2.8.0.xml | 312 + hadoop-hdfs-project/hadoop-hdfs/pom.xml | 10 +- .../hadoop-hdfs/src/main/bin/hdfs | 97 +- .../hadoop-hdfs/src/main/bin/hdfs-config.sh | 5 + .../org/apache/hadoop/hdfs/DFSConfigKeys.java | 3 +- .../java/org/apache/hadoop/hdfs/DFSUtil.java | 15 +- .../java/org/apache/hadoop/hdfs/HAUtil.java | 57 +- .../org/apache/hadoop/hdfs/NameNodeProxies.java | 3 +- .../hadoop/hdfs/net/DFSNetworkTopology.java | 76 +- ...tNamenodeProtocolServerSideTranslatorPB.java | 3 +- .../DatanodeProtocolClientSideTranslatorPB.java | 7 +- .../DatanodeProtocolServerSideTranslatorPB.java | 3 +- .../apache/hadoop/hdfs/protocolPB/PBHelper.java | 68 + .../server/blockmanagement/DatanodeManager.java | 46 +- .../server/blockmanagement/SlowDiskTracker.java | 294 + .../server/blockmanagement/SlowPeerTracker.java | 2 +- .../hadoop/hdfs/server/common/Storage.java | 6 +- .../hdfs/server/datanode/BPOfferService.java | 19 +- .../hdfs/server/datanode/BPServiceActor.java | 65 +- .../hdfs/server/datanode/BlockPoolManager.java | 8 +- .../hdfs/server/datanode/BlockReceiver.java | 61 +- .../hdfs/server/datanode/DataStorage.java | 4 +- .../hdfs/server/datanode/DataXceiver.java | 4 +- .../datanode/IncrementalBlockReportManager.java | 41 +- .../datanode/checker/ThrottledAsyncChecker.java | 25 +- .../StripedBlockChecksumReconstructor.java | 48 +- .../erasurecode/StripedBlockReconstructor.java | 1 + .../erasurecode/StripedReconstructor.java | 6 + .../datanode/fsdataset/impl/BlockPoolSlice.java | 2 +- .../datanode/fsdataset/impl/FsVolumeImpl.java | 2 +- .../datanode/metrics/DataNodeDiskMetrics.java | 55 +- .../datanode/metrics/DataNodeMetrics.java | 35 + .../diskbalancer/DiskBalancerException.java | 1 + .../server/diskbalancer/command/Command.java | 29 +- .../diskbalancer/command/ReportCommand.java | 6 +- .../apache/hadoop/hdfs/server/mover/Mover.java | 11 +- .../hdfs/server/namenode/AclTransformation.java | 4 +- .../hadoop/hdfs/server/namenode/DfsServlet.java | 50 +- .../namenode/ErasureCodingPolicyManager.java | 78 +- .../server/namenode/FSDirErasureCodingOp.java | 60 +- .../server/namenode/FSDirStatAndListingOp.java | 10 +- .../hdfs/server/namenode/FSDirWriteFileOp.java | 17 +- .../server/namenode/FSImageFormatPBINode.java | 3 +- .../hdfs/server/namenode/FSNamesystem.java | 31 +- .../hadoop/hdfs/server/namenode/INodeFile.java | 16 +- .../hdfs/server/namenode/INodesInPath.java | 6 +- .../hadoop/hdfs/server/namenode/JournalSet.java | 2 +- .../hadoop/hdfs/server/namenode/NameNode.java | 6 + .../hdfs/server/namenode/NameNodeRpcServer.java | 12 +- .../server/namenode/NameNodeStatusMXBean.java | 8 + .../ha/ConfiguredFailoverProxyProvider.java | 207 - .../namenode/ha/IPFailoverProxyProvider.java | 132 - .../namenode/ha/NameNodeHAProxyFactory.java | 45 + .../ha/RequestHedgingProxyProvider.java | 241 - .../snapshot/DirectoryWithSnapshotFeature.java | 5 + .../hdfs/server/protocol/DatanodeProtocol.java | 3 +- .../OfflineImageReconstructor.java | 6 +- .../offlineImageViewer/PBImageXmlWriter.java | 6 +- .../org/apache/hadoop/hdfs/web/JsonUtil.java | 6 + .../src/main/proto/DatanodeProtocol.proto | 15 + .../src/main/webapps/hdfs/robots.txt | 2 + .../src/main/webapps/journal/robots.txt | 2 + .../src/main/webapps/secondary/robots.txt | 2 + .../src/site/markdown/ArchivalStorage.md | 2 +- .../src/site/markdown/HDFSCommands.md | 2 +- .../src/site/markdown/HDFSDiskbalancer.md | 4 +- .../src/site/markdown/HDFSErasureCoding.md | 1 + .../src/site/markdown/HdfsNfsGateway.md | 14 +- .../src/site/markdown/TransparentEncryption.md | 1 + .../org/apache/hadoop/hdfs/DFSTestUtil.java | 29 +- .../apache/hadoop/hdfs/StripedFileTestUtil.java | 6 +- .../hadoop/hdfs/TestDFSClientFailover.java | 4 +- .../hadoop/hdfs/TestDFSClientRetries.java | 5 +- .../apache/hadoop/hdfs/TestDFSOutputStream.java | 126 + .../TestDFSRSDefault10x4StripedInputStream.java | 7 +- ...TestDFSRSDefault10x4StripedOutputStream.java | 7 +- ...fault10x4StripedOutputStreamWithFailure.java | 7 +- .../hadoop/hdfs/TestDFSStripedInputStream.java | 2 +- .../hadoop/hdfs/TestDFSStripedOutputStream.java | 2 +- .../TestDFSStripedOutputStreamWithFailure.java | 2 +- .../org/apache/hadoop/hdfs/TestDFSUtil.java | 2 +- .../hdfs/TestDFSXORStripedInputStream.java | 7 +- .../hdfs/TestDFSXORStripedOutputStream.java | 7 +- ...estDFSXORStripedOutputStreamWithFailure.java | 7 +- .../hadoop/hdfs/TestDataTransferProtocol.java | 2 +- .../apache/hadoop/hdfs/TestDecommission.java | 50 + .../hadoop/hdfs/TestDistributedFileSystem.java | 35 +- .../apache/hadoop/hdfs/TestEncryptionZones.java | 208 +- .../hadoop/hdfs/TestErasureCodingPolicies.java | 71 +- .../TestErasureCodingPolicyWithSnapshot.java | 26 + .../apache/hadoop/hdfs/TestFileCreation.java | 4 +- .../org/apache/hadoop/hdfs/TestFileStatus.java | 18 +- .../hadoop/hdfs/TestFileStatusWithECPolicy.java | 22 +- .../hadoop/hdfs/TestKeyProviderCache.java | 21 +- .../java/org/apache/hadoop/hdfs/TestLease.java | 3 +- .../hadoop/hdfs/TestReconstructStripedFile.java | 2 +- .../hadoop/hdfs/TestSetrepIncreasing.java | 44 + .../TestUnsetAndChangeDirectoryEcPolicy.java | 13 +- .../hadoop/hdfs/net/TestDFSNetworkTopology.java | 57 + .../hadoop/hdfs/protocolPB/TestPBHelper.java | 144 +- .../hdfs/qjournal/client/TestQJMWithFaults.java | 2 +- .../client/TestQuorumJournalManager.java | 2 +- .../TestNameNodePrunesMissingStorages.java | 4 +- .../blockmanagement/TestSlowDiskTracker.java | 439 + .../datanode/InternalDataNodeTestUtils.java | 4 +- .../server/datanode/TestBPOfferService.java | 6 +- .../datanode/TestBlockCountersInPendingIBR.java | 146 + .../server/datanode/TestBlockPoolManager.java | 4 +- .../hdfs/server/datanode/TestBlockRecovery.java | 8 +- .../datanode/TestBpServiceActorScheduler.java | 20 +- .../server/datanode/TestDataNodeLifeline.java | 8 +- .../server/datanode/TestDataNodeMXBean.java | 2 +- .../hdfs/server/datanode/TestDataStorage.java | 2 +- .../TestDatanodeProtocolRetryPolicy.java | 4 +- .../server/datanode/TestFsDatasetCache.java | 4 +- .../hdfs/server/datanode/TestStorageReport.java | 4 +- .../TestDatasetVolumeCheckerTimeout.java | 2 +- .../checker/TestThrottledAsyncChecker.java | 118 +- .../TestThrottledAsyncCheckerTimeout.java | 45 +- .../command/TestDiskBalancerCommand.java | 71 +- .../hadoop/hdfs/server/mover/TestMover.java | 42 + .../hdfs/server/namenode/FSAclBaseTest.java | 25 +- .../server/namenode/NNThroughputBenchmark.java | 23 +- .../hdfs/server/namenode/NameNodeAdapter.java | 3 +- .../hdfs/server/namenode/TestAddBlockRetry.java | 4 +- ...stBlockPlacementPolicyRackFaultTolerant.java | 4 +- .../hdfs/server/namenode/TestDeadDatanode.java | 4 +- .../TestDefaultBlockPlacementPolicy.java | 2 +- .../server/namenode/TestEnabledECPolicies.java | 17 +- .../hdfs/server/namenode/TestFSImage.java | 13 +- .../namenode/TestFavoredNodesEndToEnd.java | 23 + .../hdfs/server/namenode/TestINodeFile.java | 7 +- .../namenode/TestNameNodeStatusMXBean.java | 148 + .../server/namenode/TestNamenodeRetryCache.java | 17 +- .../hdfs/server/namenode/TestStartup.java | 57 +- .../server/namenode/TestStripedINodeFile.java | 8 +- .../namenode/ha/TestDelegationTokensWithHA.java | 4 +- .../ha/TestRequestHedgingProxyProvider.java | 470 - .../namenode/ha/TestRetryCacheWithHA.java | 5 +- .../snapshot/TestRenameWithSnapshots.java | 6 +- .../namenode/snapshot/TestSnapshotDeletion.java | 75 + .../TestOfflineImageViewer.java | 11 +- .../hadoop/hdfs/util/TestStripedBlockUtil.java | 4 +- .../org/apache/hadoop/hdfs/web/TestWebHDFS.java | 72 + hadoop-mapreduce-project/bin/mapred | 64 +- hadoop-mapreduce-project/bin/mapred-config.sh | 1 + .../Apache_Hadoop_MapReduce_Common_2.8.0.xml | 113 + .../Apache_Hadoop_MapReduce_Core_2.8.0.xml | 27490 ++++++++++++ .../Apache_Hadoop_MapReduce_JobClient_2.8.0.xml | 16 + .../v2/app/job/impl/TaskAttemptImpl.java | 285 +- .../mapreduce/v2/app/webapp/ConfBlock.java | 2 +- .../v2/app/rm/TestRMContainerAllocator.java | 453 +- .../java/org/apache/hadoop/mapred/JobConf.java | 8 +- .../mapred/lib/FieldSelectionMapReduce.java | 2 +- .../mapred/lib/KeyFieldBasedComparator.java | 2 +- .../hadoop/mapreduce/JobResourceUploader.java | 137 +- .../apache/hadoop/mapreduce/JobSubmitter.java | 2 +- .../apache/hadoop/mapreduce/MRJobConfig.java | 8 +- .../lib/fieldsel/FieldSelectionHelper.java | 7 +- .../lib/fieldsel/FieldSelectionMapper.java | 2 +- .../lib/fieldsel/FieldSelectionReducer.java | 2 +- .../lib/input/KeyValueLineRecordReader.java | 13 +- .../mapreduce/lib/jobcontrol/JobControl.java | 2 +- .../mapreduce/lib/output/TextOutputFormat.java | 9 +- .../lib/partition/KeyFieldBasedComparator.java | 4 +- .../lib/partition/KeyFieldBasedPartitioner.java | 2 +- .../hadoop/mapreduce/util/ConfigUtil.java | 8 +- .../mapreduce/TestJobResourceUploader.java | 509 +- .../org/apache/hadoop/mapred/YARNRunner.java | 4 +- .../apache/hadoop/fs/slive/OperationOutput.java | 4 +- .../hadoop/mapred/TestFieldSelection.java | 2 +- .../mapred/TestMRTimelineEventHandling.java | 2 +- .../apache/hadoop/mapred/TestNetworkedJob.java | 3 + .../apache/hadoop/mapred/TestYARNRunner.java | 2 +- .../mapred/lib/TestKeyFieldBasedComparator.java | 4 +- .../lib/fieldsel/TestMRFieldSelection.java | 2 +- .../TestMRKeyFieldBasedComparator.java | 4 +- .../hadoop/mapreduce/v2/MiniMRYarnCluster.java | 6 +- .../apache/hadoop/mapred/ShuffleHandler.java | 68 +- .../hadoop/mapred/TestShuffleHandler.java | 31 + .../hadoop-mapreduce-client/pom.xml | 5 + hadoop-mapreduce-project/pom.xml | 1 + hadoop-project-dist/pom.xml | 2 +- hadoop-project/pom.xml | 36 +- .../hadoop/fs/s3a/DefaultS3ClientFactory.java | 4 +- .../hadoop/fs/s3a/S3ABlockOutputStream.java | 5 +- .../org/apache/hadoop/fs/s3a/S3AFileSystem.java | 11 +- .../java/org/apache/hadoop/fs/s3a/S3AUtils.java | 42 +- .../apache/hadoop/fs/s3a/S3ClientFactory.java | 3 +- ...haredInstanceProfileCredentialsProvider.java | 67 - .../fs/s3a/SimpleAWSCredentialsProvider.java | 3 +- .../fs/s3a/TemporaryAWSCredentialsProvider.java | 3 +- .../fs/s3a/s3guard/DynamoDBClientFactory.java | 2 +- .../src/site/markdown/tools/hadoop-aws/index.md | 36 +- .../site/markdown/tools/hadoop-aws/testing.md | 1 + .../fs/s3a/ITestS3AAWSCredentialsProvider.java | 43 +- .../fs/s3a/ITestS3ATemporaryCredentials.java | 2 +- .../hadoop/fs/s3a/MockS3ClientFactory.java | 2 +- .../fs/s3a/TestS3AAWSCredentialsProvider.java | 20 +- .../hadoop/fs/s3a/TestS3AGetFileStatus.java | 9 + .../s3a/s3guard/DynamoDBLocalClientFactory.java | 2 +- .../org/apache/hadoop/fs/adl/AdlConfKeys.java | 40 +- .../org/apache/hadoop/fs/adl/AdlFileSystem.java | 7 +- .../src/site/markdown/index.md | 32 +- .../apache/hadoop/fs/adl/AdlMockWebServer.java | 3 + .../hadoop/fs/adl/TestAzureADTokenProvider.java | 8 +- .../hadoop/fs/adl/TestCustomTokenProvider.java | 4 + .../apache/hadoop/fs/adl/TestGetFileStatus.java | 13 +- .../fs/adl/TestRelativePathFormation.java | 4 + .../fs/adl/TestValidateConfiguration.java | 83 +- .../adl/live/TestAdlFileSystemContractLive.java | 3 +- .../fs/azure/AzureNativeFileSystemStore.java | 2 +- .../hadoop/fs/azure/BlockBlobAppendStream.java | 2 +- .../hadoop/fs/azure/NativeAzureFileSystem.java | 69 +- .../fs/azure/RemoteSASKeyGeneratorImpl.java | 191 +- .../fs/azure/RemoteWasbAuthorizerImpl.java | 155 +- .../fs/azure/SecureStorageInterfaceImpl.java | 11 +- .../fs/azure/WasbAuthorizerInterface.java | 5 +- .../hadoop/fs/azure/WasbRemoteCallHelper.java | 3 +- .../hadoop/fs/azure/security/Constants.java | 54 + .../hadoop/fs/azure/security/SecurityUtils.java | 86 + .../security/WasbDelegationTokenIdentifier.java | 48 + .../fs/azure/security/WasbTokenRenewer.java | 150 + .../hadoop/fs/azure/security/package-info.java | 22 + ...apache.hadoop.security.token.TokenIdentifier | 16 + ...rg.apache.hadoop.security.token.TokenRenewer | 16 + .../hadoop/fs/azure/MockWasbAuthorizerImpl.java | 4 +- .../org/apache/hadoop/tools/CopyListing.java | 73 +- .../hadoop/tools/CopyListingFileStatus.java | 91 +- .../java/org/apache/hadoop/tools/DistCp.java | 96 +- .../org/apache/hadoop/tools/DistCpContext.java | 198 + .../apache/hadoop/tools/DistCpOptionSwitch.java | 12 +- .../org/apache/hadoop/tools/DistCpOptions.java | 913 +- .../org/apache/hadoop/tools/DistCpSync.java | 42 +- .../hadoop/tools/FileBasedCopyListing.java | 12 +- .../apache/hadoop/tools/GlobbedCopyListing.java | 17 +- .../org/apache/hadoop/tools/OptionsParser.java | 271 +- .../apache/hadoop/tools/SimpleCopyListing.java | 190 +- .../hadoop/tools/mapred/CopyCommitter.java | 189 +- .../apache/hadoop/tools/mapred/CopyMapper.java | 40 +- .../tools/mapred/RetriableFileCopyCommand.java | 29 +- .../tools/mapred/UniformSizeInputFormat.java | 5 +- .../apache/hadoop/tools/util/DistCpUtils.java | 126 +- .../src/site/markdown/DistCp.md.vm | 3 +- .../apache/hadoop/tools/TestCopyListing.java | 51 +- .../hadoop/tools/TestCopyListingFileStatus.java | 1 + .../apache/hadoop/tools/TestDistCpOptions.java | 500 + .../org/apache/hadoop/tools/TestDistCpSync.java | 68 +- .../hadoop/tools/TestDistCpSyncReverseBase.java | 44 +- .../apache/hadoop/tools/TestDistCpSystem.java | 368 +- .../apache/hadoop/tools/TestDistCpViewFs.java | 10 +- .../hadoop/tools/TestFileBasedCopyListing.java | 9 +- .../hadoop/tools/TestGlobbedCopyListing.java | 11 +- .../apache/hadoop/tools/TestIntegration.java | 20 +- .../apache/hadoop/tools/TestOptionsParser.java | 81 +- .../contract/AbstractContractDistCpTest.java | 6 +- .../hadoop/tools/mapred/TestCopyCommitter.java | 39 +- .../mapred/TestUniformSizeInputFormat.java | 15 +- .../mapred/lib/TestDynamicInputFormat.java | 17 +- .../hadoop/tools/util/TestDistCpUtils.java | 123 +- hadoop-tools/hadoop-kafka/pom.xml | 26 - .../hadoop/metrics2/impl/TestKafkaMetrics.java | 4 +- .../org/apache/hadoop/yarn/sls/SLSRunner.java | 22 +- .../hadoop/yarn/sls/appmaster/AMSimulator.java | 29 +- .../sls/scheduler/FairSchedulerMetrics.java | 308 +- .../sls/scheduler/ResourceSchedulerWrapper.java | 972 - .../sls/scheduler/SLSCapacityScheduler.java | 686 +- .../yarn/sls/scheduler/SLSFairScheduler.java | 339 + .../yarn/sls/scheduler/SchedulerMetrics.java | 602 +- .../yarn/sls/scheduler/SchedulerWrapper.java | 23 +- .../hadoop/yarn/sls/scheduler/Tracker.java | 46 + .../apache/hadoop/yarn/sls/utils/SLSUtils.java | 1 + .../apache/hadoop/yarn/sls/web/SLSWebApp.java | 12 +- .../yarn/sls/appmaster/TestAMSimulator.java | 87 +- .../yarn/sls/nodemanager/TestNMSimulator.java | 32 +- .../hadoop/streaming/StreamKeyValUtil.java | 8 +- hadoop-yarn-project/hadoop-yarn/bin/yarn | 62 +- .../hadoop-yarn/bin/yarn-config.sh | 1 + .../jdiff/Apache_Hadoop_YARN_Client_2.8.0.xml | 2316 + .../jdiff/Apache_Hadoop_YARN_Common_2.8.0.xml | 2665 ++ .../Apache_Hadoop_YARN_Server_Common_2.8.0.xml | 829 + .../records/ApplicationSubmissionContext.java | 57 +- .../org/apache/hadoop/yarn/conf/HAUtil.java | 30 +- .../hadoop/yarn/conf/YarnConfiguration.java | 31 +- .../src/main/proto/yarn_protos.proto | 2 +- .../pom.xml | 5 + .../distributedshell/TestDistributedShell.java | 30 +- .../apache/hadoop/yarn/client/cli/LogsCLI.java | 6 + .../hadoop/yarn/client/ProtocolHATestBase.java | 6 +- .../hadoop/yarn/client/TestRMFailover.java | 39 +- .../api/impl/TestAMRMClientOnRMRestart.java | 59 +- .../hadoop/yarn/client/cli/TestLogsCLI.java | 58 +- .../hadoop/yarn/client/cli/TestRMAdminCLI.java | 32 +- .../pb/ApplicationSubmissionContextPBImpl.java | 66 +- .../impl/pb/ContainerLaunchContextPBImpl.java | 13 + .../yarn/api/records/impl/pb/ProtoUtils.java | 6 +- .../client/api/impl/TimelineV2ClientImpl.java | 9 +- .../logaggregation/AggregatedLogFormat.java | 29 +- .../nodelabels/CommonNodeLabelsManager.java | 22 + .../org/apache/hadoop/yarn/webapp/WebApp.java | 4 +- .../src/main/resources/yarn-default.xml | 9 + .../TestApplicationClientProtocolRecords.java | 29 + .../org/apache/hadoop/yarn/conf/TestHAUtil.java | 86 +- .../logaggregation/TestAggregatedLogFormat.java | 123 +- .../logaggregation/TestAggregatedLogsBlock.java | 25 +- .../logaggregation/TestContainerLogsUtils.java | 15 +- .../timeline/RollingLevelDBTimelineStore.java | 263 +- .../webapp/TestTimelineWebServices.java | 27 - .../server/nodemanager/DirectoryCollection.java | 3 +- .../yarn/server/nodemanager/NodeManager.java | 26 +- .../nodemanager/NodeStatusUpdaterImpl.java | 4 +- .../containermanager/ContainerManagerImpl.java | 18 +- .../localizer/ContainerLocalizer.java | 3 +- .../localizer/ResourceLocalizationService.java | 16 +- .../logaggregation/AppLogAggregatorImpl.java | 72 +- .../nodemanager/metrics/NodeManagerMetrics.java | 41 + .../timelineservice/NMTimelinePublisher.java | 8 + .../nodemanager/DummyContainerManager.java | 5 +- .../TestContainerManagerWithLCE.java | 299 +- .../nodemanager/TestNodeManagerResync.java | 2 +- .../nodemanager/TestNodeStatusUpdater.java | 2 +- .../containermanager/TestContainerManager.java | 45 + .../TestContainerManagerRecovery.java | 11 +- .../launcher/TestContainerLaunch.java | 12 +- .../localizer/TestLocalCacheCleanup.java | 17 +- .../TestLocalCacheDirectoryManager.java | 8 +- .../TestResourceLocalizationService.java | 412 +- .../TestAppLogAggregatorImpl.java | 8 +- .../TestNMTimelinePublisher.java | 10 +- .../conf/capacity-scheduler.xml | 24 +- .../hadoop-yarn-server-resourcemanager/pom.xml | 5 + .../server/resourcemanager/ClientRMService.java | 290 +- .../server/resourcemanager/RMAppManager.java | 110 +- .../server/resourcemanager/RMAuditLogger.java | 5 + .../server/resourcemanager/RMServerUtils.java | 68 +- .../server/resourcemanager/ResourceManager.java | 2 +- .../metrics/TimelineServiceV2Publisher.java | 11 +- .../nodelabels/RMNodeLabelsManager.java | 12 + .../recovery/FileSystemRMStateStore.java | 8 +- .../recovery/LeveldbRMStateStore.java | 8 + .../server/resourcemanager/rmapp/RMApp.java | 3 +- .../server/resourcemanager/rmapp/RMAppImpl.java | 54 +- .../rmapp/attempt/RMAppAttemptImpl.java | 35 +- .../rmcontainer/RMContainer.java | 3 +- .../rmcontainer/RMContainerImpl.java | 2 +- .../scheduler/AbstractYarnScheduler.java | 5 + .../scheduler/AppSchedulingInfo.java | 47 +- .../scheduler/ClusterNodeTracker.java | 65 +- .../scheduler/ResourceScheduler.java | 9 + .../scheduler/SchedulerApplicationAttempt.java | 5 + .../scheduler/SchedulerNode.java | 6 +- .../scheduler/capacity/AbstractCSQueue.java | 20 +- .../scheduler/capacity/CSQueue.java | 14 - .../scheduler/capacity/CSQueueMetrics.java | 21 + .../scheduler/capacity/CSQueueUtils.java | 32 +- .../CapacitySchedulerConfiguration.java | 12 + .../capacity/CapacitySchedulerQueueManager.java | 33 + .../scheduler/capacity/LeafQueue.java | 18 +- .../scheduler/capacity/ParentQueue.java | 19 +- .../scheduler/capacity/PlanQueue.java | 4 +- .../scheduler/capacity/ReservationQueue.java | 2 +- .../allocator/RegularContainerAllocator.java | 41 +- .../scheduler/common/fica/FiCaSchedulerApp.java | 10 +- .../fair/AllocationFileLoaderService.java | 2 +- .../scheduler/fair/FSAppAttempt.java | 20 +- .../scheduler/fair/FSOpDurations.java | 8 - .../scheduler/fair/FSPreemptionThread.java | 25 +- .../scheduler/fair/FSSchedulerNode.java | 133 +- .../scheduler/fair/FairScheduler.java | 49 +- .../scheduler/fair/QueueManager.java | 2 +- .../LocalitySchedulingPlacementSet.java | 8 +- .../resourcemanager/webapp/dao/AppInfo.java | 2 +- .../server/resourcemanager/ACLsTestBase.java | 10 - .../server/resourcemanager/Application.java | 2 +- .../yarn/server/resourcemanager/MockRM.java | 45 +- .../server/resourcemanager/RMHATestBase.java | 20 +- .../ReservationACLsTestBase.java | 5 +- .../server/resourcemanager/TestAppManager.java | 195 +- .../resourcemanager/TestApplicationCleanup.java | 44 +- .../TestApplicationMasterLauncher.java | 11 +- .../TestApplicationMasterService.java | 19 +- .../resourcemanager/TestClientRMService.java | 8 +- .../TestNodeBlacklistingOnAMFailures.java | 213 +- .../yarn/server/resourcemanager/TestRM.java | 10 +- .../resourcemanager/TestRMAdminService.java | 95 + .../resourcemanager/TestRMServerUtils.java | 297 + .../TestReservationSystemWithRMHA.java | 5 +- .../resourcemanager/TestSignalContainer.java | 13 +- .../applicationsmanager/MockAsm.java | 6 +- .../TestAMRMRPCNodeUpdates.java | 18 +- .../TestRMAppLogAggregationStatus.java | 2 + .../metrics/TestSystemMetricsPublisher.java | 3 +- .../recovery/TestLeveldbRMStateStore.java | 19 +- .../TestCapacitySchedulerPlanFollower.java | 7 + .../TestFairSchedulerPlanFollower.java | 4 + .../TestSchedulerPlanFollowerBase.java | 9 +- .../resourcetracker/TestNMReconnect.java | 14 +- .../server/resourcemanager/rmapp/MockRMApp.java | 11 +- .../rmapp/TestRMAppTransitions.java | 9 +- .../attempt/TestRMAppAttemptTransitions.java | 19 +- .../rmcontainer/TestRMContainerImpl.java | 1 - .../capacity/TestApplicationLimits.java | 4 +- .../TestApplicationLimitsByPartition.java | 4 +- .../capacity/TestApplicationPriority.java | 29 +- .../capacity/TestCapacityScheduler.java | 264 +- .../TestCapacitySchedulerDynamicBehavior.java | 11 + .../scheduler/capacity/TestLeafQueue.java | 170 +- .../scheduler/capacity/TestParentQueue.java | 18 +- .../fair/TestContinuousScheduling.java | 36 + .../scheduler/fair/TestFSSchedulerNode.java | 403 + .../scheduler/fair/TestFairScheduler.java | 78 + .../fair/TestFairSchedulerPreemption.java | 19 + .../scheduler/fair/TestSchedulingPolicy.java | 1 - .../security/TestClientToAMTokens.java | 23 +- .../webapp/TestRMWebServicesApps.java | 131 +- .../hadoop/yarn/server/MiniYARNCluster.java | 22 +- .../hadoop/yarn/server/TestMiniYarnCluster.java | 34 +- .../pom.xml | 5 + .../pom.xml | 19 + .../collector/TimelineCollector.java | 37 +- .../collector/TimelineCollectorManager.java | 7 +- .../collector/TimelineCollectorWebService.java | 12 +- .../collector/TestTimelineCollector.java | 63 + .../src/site/markdown/DockerContainers.md | 4 +- .../hadoop-yarn/hadoop-yarn-ui/pom.xml | 7 +- .../webapp/app/components/app-attempt-table.js | 7 - .../main/webapp/app/components/timeline-view.js | 199 +- .../main/webapp/app/helpers/prepend-protocol.js | 29 + .../src/main/webapp/app/services/hosts.js | 6 +- .../templates/components/app-attempt-table.hbs | 36 +- .../templates/components/container-table.hbs | 22 +- .../app/templates/components/timeline-view.hbs | 61 +- .../tests/unit/helpers/prepend-protocol-test.js | 28 + 574 files changed, 93155 insertions(+), 8494 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-common-project/hadoop-common/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/AbstractFileSystem.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-project/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/DefaultS3ClientFactory.java ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/DefaultS3ClientFactory.java index c411fdd,0000000..a329580 mode 100644,000000..100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/DefaultS3ClientFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/DefaultS3ClientFactory.java @@@ -1,233 -1,0 +1,233 @@@ +/* + * 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 com.amazonaws.ClientConfiguration; +import com.amazonaws.Protocol; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.S3ClientOptions; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.util.VersionInfo; +import org.slf4j.Logger; + +import java.io.IOException; +import java.net.URI; + +import static org.apache.hadoop.fs.s3a.Constants.*; +import static org.apache.hadoop.fs.s3a.S3AUtils.createAWSCredentialProviderSet; +import static org.apache.hadoop.fs.s3a.S3AUtils.intOption; + +/** + * The default factory implementation, which calls the AWS SDK to configure + * and create an {@link AmazonS3Client} that communicates with the S3 service. + */ +public class DefaultS3ClientFactory extends Configured implements + S3ClientFactory { + + private static final Logger LOG = S3AFileSystem.LOG; + + @Override - public AmazonS3 createS3Client(URI name, URI uri) throws IOException { ++ public AmazonS3 createS3Client(URI name) throws IOException { + Configuration conf = getConf(); + AWSCredentialsProvider credentials = - createAWSCredentialProviderSet(name, conf, uri); ++ createAWSCredentialProviderSet(name, conf); + final ClientConfiguration awsConf = createAwsConf(getConf()); + AmazonS3 s3 = newAmazonS3Client(credentials, awsConf); + return createAmazonS3Client(s3, conf, credentials, awsConf); + } + + /** + * Create a new {@link ClientConfiguration}. + * @param conf The Hadoop configuration + * @return new AWS client configuration + */ + public static ClientConfiguration createAwsConf(Configuration conf) { + final ClientConfiguration awsConf = new ClientConfiguration(); + initConnectionSettings(conf, awsConf); + initProxySupport(conf, awsConf); + initUserAgent(conf, awsConf); + return awsConf; + } + + /** + * Wrapper around constructor for {@link AmazonS3} client. Override this to + * provide an extended version of the client + * @param credentials credentials to use + * @param awsConf AWS configuration + * @return new AmazonS3 client + */ + protected AmazonS3 newAmazonS3Client( + AWSCredentialsProvider credentials, ClientConfiguration awsConf) { + return new AmazonS3Client(credentials, awsConf); + } + + /** + * Initializes all AWS SDK settings related to connection management. + * + * @param conf Hadoop configuration + * @param awsConf AWS SDK configuration + */ + private static void initConnectionSettings(Configuration conf, + ClientConfiguration awsConf) { + awsConf.setMaxConnections(intOption(conf, MAXIMUM_CONNECTIONS, + DEFAULT_MAXIMUM_CONNECTIONS, 1)); + boolean secureConnections = conf.getBoolean(SECURE_CONNECTIONS, + DEFAULT_SECURE_CONNECTIONS); + awsConf.setProtocol(secureConnections ? Protocol.HTTPS : Protocol.HTTP); + awsConf.setMaxErrorRetry(intOption(conf, MAX_ERROR_RETRIES, + DEFAULT_MAX_ERROR_RETRIES, 0)); + awsConf.setConnectionTimeout(intOption(conf, ESTABLISH_TIMEOUT, + DEFAULT_ESTABLISH_TIMEOUT, 0)); + awsConf.setSocketTimeout(intOption(conf, SOCKET_TIMEOUT, + DEFAULT_SOCKET_TIMEOUT, 0)); + int sockSendBuffer = intOption(conf, SOCKET_SEND_BUFFER, + DEFAULT_SOCKET_SEND_BUFFER, 2048); + int sockRecvBuffer = intOption(conf, SOCKET_RECV_BUFFER, + DEFAULT_SOCKET_RECV_BUFFER, 2048); + awsConf.setSocketBufferSizeHints(sockSendBuffer, sockRecvBuffer); + String signerOverride = conf.getTrimmed(SIGNING_ALGORITHM, ""); + if (!signerOverride.isEmpty()) { + LOG.debug("Signer override = {}", signerOverride); + awsConf.setSignerOverride(signerOverride); + } + } + + /** + * Initializes AWS SDK proxy support if configured. + * + * @param conf Hadoop configuration + * @param awsConf AWS SDK configuration + * @throws IllegalArgumentException if misconfigured + */ + private static void initProxySupport(Configuration conf, + ClientConfiguration awsConf) throws IllegalArgumentException { + String proxyHost = conf.getTrimmed(PROXY_HOST, ""); + int proxyPort = conf.getInt(PROXY_PORT, -1); + if (!proxyHost.isEmpty()) { + awsConf.setProxyHost(proxyHost); + if (proxyPort >= 0) { + awsConf.setProxyPort(proxyPort); + } else { + if (conf.getBoolean(SECURE_CONNECTIONS, DEFAULT_SECURE_CONNECTIONS)) { + LOG.warn("Proxy host set without port. Using HTTPS default 443"); + awsConf.setProxyPort(443); + } else { + LOG.warn("Proxy host set without port. Using HTTP default 80"); + awsConf.setProxyPort(80); + } + } + String proxyUsername = conf.getTrimmed(PROXY_USERNAME); + String proxyPassword = conf.getTrimmed(PROXY_PASSWORD); + if ((proxyUsername == null) != (proxyPassword == null)) { + String msg = "Proxy error: " + PROXY_USERNAME + " or " + + PROXY_PASSWORD + " set without the other."; + LOG.error(msg); + throw new IllegalArgumentException(msg); + } + awsConf.setProxyUsername(proxyUsername); + awsConf.setProxyPassword(proxyPassword); + awsConf.setProxyDomain(conf.getTrimmed(PROXY_DOMAIN)); + awsConf.setProxyWorkstation(conf.getTrimmed(PROXY_WORKSTATION)); + if (LOG.isDebugEnabled()) { + LOG.debug("Using proxy server {}:{} as user {} with password {} on " + + "domain {} as workstation {}", awsConf.getProxyHost(), + awsConf.getProxyPort(), + String.valueOf(awsConf.getProxyUsername()), + awsConf.getProxyPassword(), awsConf.getProxyDomain(), + awsConf.getProxyWorkstation()); + } + } else if (proxyPort >= 0) { + String msg = + "Proxy error: " + PROXY_PORT + " set without " + PROXY_HOST; + LOG.error(msg); + throw new IllegalArgumentException(msg); + } + } + + /** + * Initializes the User-Agent header to send in HTTP requests to the S3 + * back-end. We always include the Hadoop version number. The user also + * may set an optional custom prefix to put in front of the Hadoop version + * number. The AWS SDK interally appends its own information, which seems + * to include the AWS SDK version, OS and JVM version. + * + * @param conf Hadoop configuration + * @param awsConf AWS SDK configuration + */ + private static void initUserAgent(Configuration conf, + ClientConfiguration awsConf) { + String userAgent = "Hadoop " + VersionInfo.getVersion(); + String userAgentPrefix = conf.getTrimmed(USER_AGENT_PREFIX, ""); + if (!userAgentPrefix.isEmpty()) { + userAgent = userAgentPrefix + ", " + userAgent; + } + LOG.debug("Using User-Agent: {}", userAgent); + awsConf.setUserAgentPrefix(userAgent); + } + + /** + * Creates an {@link AmazonS3Client} from the established configuration. + * + * @param conf Hadoop configuration + * @param credentials AWS credentials + * @param awsConf AWS SDK configuration + * @return S3 client + * @throws IllegalArgumentException if misconfigured + */ + private static AmazonS3 createAmazonS3Client(AmazonS3 s3, Configuration conf, + AWSCredentialsProvider credentials, ClientConfiguration awsConf) + throws IllegalArgumentException { + String endPoint = conf.getTrimmed(ENDPOINT, ""); + if (!endPoint.isEmpty()) { + try { + s3.setEndpoint(endPoint); + } catch (IllegalArgumentException e) { + String msg = "Incorrect endpoint: " + e.getMessage(); + LOG.error(msg); + throw new IllegalArgumentException(msg, e); + } + } + enablePathStyleAccessIfRequired(s3, conf); + return s3; + } + + /** + * Enables path-style access to S3 buckets if configured. By default, the + * behavior is to use virtual hosted-style access with URIs of the form + * http://bucketname.s3.amazonaws.com. Enabling path-style access and a + * region-specific endpoint switches the behavior to use URIs of the form + * http://s3-eu-west-1.amazonaws.com/bucketname. + * + * @param s3 S3 client + * @param conf Hadoop configuration + */ + private static void enablePathStyleAccessIfRequired(AmazonS3 s3, + Configuration conf) { + final boolean pathStyleAccess = conf.getBoolean(PATH_STYLE_ACCESS, false); + if (pathStyleAccess) { + LOG.debug("Enabling path style access!"); + s3.setS3ClientOptions(S3ClientOptions.builder() + .setPathStyleAccess(true) + .build()); + } + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ABlockOutputStream.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java index f56259c,9eb5575..29f84b0 --- 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 @@@ -1643,11 -1525,8 +1643,9 @@@ public class S3AFileSystem extends File * @throws IOException other IO problems * @throws AmazonClientException on failures inside the AWS SDK */ - // TODO: If we have created an empty file at /foo/bar and we then call - // mkdirs for /foo/bar/baz/roo what happens to the empty file /foo/bar/? - private boolean innerMkdirs(Path f, FsPermission permission) + private boolean innerMkdirs(Path p, FsPermission permission) throws IOException, FileAlreadyExistsException, AmazonClientException { + Path f = qualify(p); LOG.debug("Making directory: {}", f); incrementStatistic(INVOCATION_MKDIRS); FileStatus fileStatus; @@@ -1694,7 -1559,7 +1692,8 @@@ String key = pathToKey(f); createFakeDirectory(key); + S3Guard.makeDirsOrdered(metadataStore, metadataStoreDirs, username); + deleteUnnecessaryFakeDirectories(f.getParent()); return true; } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ClientFactory.java ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ClientFactory.java index 387eb43,d4e09e3..e7603d9 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ClientFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3ClientFactory.java @@@ -42,7 -55,179 +42,6 @@@ public interface S3ClientFactory * @return S3 client * @throws IOException IO problem */ - AmazonS3 createS3Client(URI name, URI uri) throws IOException; + AmazonS3 createS3Client(URI name) throws IOException; - /** - * The default factory implementation, which calls the AWS SDK to configure - * and create an {@link AmazonS3Client} that communicates with the S3 service. - */ - static class DefaultS3ClientFactory extends Configured - implements S3ClientFactory { - - private static final Logger LOG = S3AFileSystem.LOG; - - @Override - public AmazonS3 createS3Client(URI name) throws IOException { - Configuration conf = getConf(); - AWSCredentialsProvider credentials = - createAWSCredentialProviderSet(name, conf); - ClientConfiguration awsConf = new ClientConfiguration(); - initConnectionSettings(conf, awsConf); - initProxySupport(conf, awsConf); - initUserAgent(conf, awsConf); - return createAmazonS3Client(conf, credentials, awsConf); - } - - /** - * Initializes all AWS SDK settings related to connection management. - * - * @param conf Hadoop configuration - * @param awsConf AWS SDK configuration - */ - private static void initConnectionSettings(Configuration conf, - ClientConfiguration awsConf) { - awsConf.setMaxConnections(intOption(conf, MAXIMUM_CONNECTIONS, - DEFAULT_MAXIMUM_CONNECTIONS, 1)); - boolean secureConnections = conf.getBoolean(SECURE_CONNECTIONS, - DEFAULT_SECURE_CONNECTIONS); - awsConf.setProtocol(secureConnections ? Protocol.HTTPS : Protocol.HTTP); - awsConf.setMaxErrorRetry(intOption(conf, MAX_ERROR_RETRIES, - DEFAULT_MAX_ERROR_RETRIES, 0)); - awsConf.setConnectionTimeout(intOption(conf, ESTABLISH_TIMEOUT, - DEFAULT_ESTABLISH_TIMEOUT, 0)); - awsConf.setSocketTimeout(intOption(conf, SOCKET_TIMEOUT, - DEFAULT_SOCKET_TIMEOUT, 0)); - int sockSendBuffer = intOption(conf, SOCKET_SEND_BUFFER, - DEFAULT_SOCKET_SEND_BUFFER, 2048); - int sockRecvBuffer = intOption(conf, SOCKET_RECV_BUFFER, - DEFAULT_SOCKET_RECV_BUFFER, 2048); - awsConf.setSocketBufferSizeHints(sockSendBuffer, sockRecvBuffer); - String signerOverride = conf.getTrimmed(SIGNING_ALGORITHM, ""); - if (!signerOverride.isEmpty()) { - LOG.debug("Signer override = {}", signerOverride); - awsConf.setSignerOverride(signerOverride); - } - } - - /** - * Initializes AWS SDK proxy support if configured. - * - * @param conf Hadoop configuration - * @param awsConf AWS SDK configuration - * @throws IllegalArgumentException if misconfigured - */ - private static void initProxySupport(Configuration conf, - ClientConfiguration awsConf) throws IllegalArgumentException { - String proxyHost = conf.getTrimmed(PROXY_HOST, ""); - int proxyPort = conf.getInt(PROXY_PORT, -1); - if (!proxyHost.isEmpty()) { - awsConf.setProxyHost(proxyHost); - if (proxyPort >= 0) { - awsConf.setProxyPort(proxyPort); - } else { - if (conf.getBoolean(SECURE_CONNECTIONS, DEFAULT_SECURE_CONNECTIONS)) { - LOG.warn("Proxy host set without port. Using HTTPS default 443"); - awsConf.setProxyPort(443); - } else { - LOG.warn("Proxy host set without port. Using HTTP default 80"); - awsConf.setProxyPort(80); - } - } - String proxyUsername = conf.getTrimmed(PROXY_USERNAME); - String proxyPassword = conf.getTrimmed(PROXY_PASSWORD); - if ((proxyUsername == null) != (proxyPassword == null)) { - String msg = "Proxy error: " + PROXY_USERNAME + " or " + - PROXY_PASSWORD + " set without the other."; - LOG.error(msg); - throw new IllegalArgumentException(msg); - } - awsConf.setProxyUsername(proxyUsername); - awsConf.setProxyPassword(proxyPassword); - awsConf.setProxyDomain(conf.getTrimmed(PROXY_DOMAIN)); - awsConf.setProxyWorkstation(conf.getTrimmed(PROXY_WORKSTATION)); - if (LOG.isDebugEnabled()) { - LOG.debug("Using proxy server {}:{} as user {} with password {} on " + - "domain {} as workstation {}", awsConf.getProxyHost(), - awsConf.getProxyPort(), - String.valueOf(awsConf.getProxyUsername()), - awsConf.getProxyPassword(), awsConf.getProxyDomain(), - awsConf.getProxyWorkstation()); - } - } else if (proxyPort >= 0) { - String msg = - "Proxy error: " + PROXY_PORT + " set without " + PROXY_HOST; - LOG.error(msg); - throw new IllegalArgumentException(msg); - } - } - - /** - * Initializes the User-Agent header to send in HTTP requests to the S3 - * back-end. We always include the Hadoop version number. The user also - * may set an optional custom prefix to put in front of the Hadoop version - * number. The AWS SDK interally appends its own information, which seems - * to include the AWS SDK version, OS and JVM version. - * - * @param conf Hadoop configuration - * @param awsConf AWS SDK configuration - */ - private static void initUserAgent(Configuration conf, - ClientConfiguration awsConf) { - String userAgent = "Hadoop " + VersionInfo.getVersion(); - String userAgentPrefix = conf.getTrimmed(USER_AGENT_PREFIX, ""); - if (!userAgentPrefix.isEmpty()) { - userAgent = userAgentPrefix + ", " + userAgent; - } - LOG.debug("Using User-Agent: {}", userAgent); - awsConf.setUserAgentPrefix(userAgent); - } - - /** - * Creates an {@link AmazonS3Client} from the established configuration. - * - * @param conf Hadoop configuration - * @param credentials AWS credentials - * @param awsConf AWS SDK configuration - * @return S3 client - * @throws IllegalArgumentException if misconfigured - */ - private static AmazonS3 createAmazonS3Client(Configuration conf, - AWSCredentialsProvider credentials, ClientConfiguration awsConf) - throws IllegalArgumentException { - AmazonS3 s3 = new AmazonS3Client(credentials, awsConf); - String endPoint = conf.getTrimmed(ENDPOINT, ""); - if (!endPoint.isEmpty()) { - try { - s3.setEndpoint(endPoint); - } catch (IllegalArgumentException e) { - String msg = "Incorrect endpoint: " + e.getMessage(); - LOG.error(msg); - throw new IllegalArgumentException(msg, e); - } - } - enablePathStyleAccessIfRequired(s3, conf); - return s3; - } - - /** - * Enables path-style access to S3 buckets if configured. By default, the - * behavior is to use virtual hosted-style access with URIs of the form - * http://bucketname.s3.amazonaws.com. Enabling path-style access and a - * region-specific endpoint switches the behavior to use URIs of the form - * http://s3-eu-west-1.amazonaws.com/bucketname. - * - * @param s3 S3 client - * @param conf Hadoop configuration - */ - private static void enablePathStyleAccessIfRequired(AmazonS3 s3, - Configuration conf) { - final boolean pathStyleAccess = conf.getBoolean(PATH_STYLE_ACCESS, false); - if (pathStyleAccess) { - LOG.debug("Enabling path style access!"); - s3.setS3ClientOptions(S3ClientOptions.builder() - .setPathStyleAccess(true) - .build()); - } - } - } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBClientFactory.java ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBClientFactory.java index ecdc3e1,0000000..0c88230 mode 100644,000000..100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBClientFactory.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBClientFactory.java @@@ -1,131 -1,0 +1,131 @@@ +/* + * 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.io.IOException; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.google.common.base.Preconditions; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.conf.Configurable; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.fs.s3a.DefaultS3ClientFactory; + +import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_REGION_KEY; +import static org.apache.hadoop.fs.s3a.S3AUtils.createAWSCredentialProviderSet; + +/** + * Interface to create a DynamoDB client. + * + * Implementation should be configured for setting and getting configuration. + */ [email protected] +public interface DynamoDBClientFactory extends Configurable { + Logger LOG = LoggerFactory.getLogger(DynamoDBClientFactory.class); + + /** + * Create a DynamoDB client object from configuration. + * + * The DynamoDB client to create does not have to relate to any S3 buckets. + * All information needed to create a DynamoDB client is from the hadoop + * configuration. Specially, if the region is not configured, it will use the + * provided region parameter. If region is neither configured nor provided, + * it will indicate an error. + * + * @param defaultRegion the default region of the AmazonDynamoDB client + * @return a new DynamoDB client + * @throws IOException if any IO error happens + */ + AmazonDynamoDB createDynamoDBClient(String defaultRegion) throws IOException; + + /** + * The default implementation for creating an AmazonDynamoDB. + */ + class DefaultDynamoDBClientFactory extends Configured + implements DynamoDBClientFactory { + @Override + public AmazonDynamoDB createDynamoDBClient(String defaultRegion) + throws IOException { + assert getConf() != null : "Should have been configured before usage"; + + final Configuration conf = getConf(); + final AWSCredentialsProvider credentials = - createAWSCredentialProviderSet(null, conf, null); ++ createAWSCredentialProviderSet(null, conf); + final ClientConfiguration awsConf = + DefaultS3ClientFactory.createAwsConf(conf); + + final String region = getRegion(conf, defaultRegion); + LOG.debug("Creating DynamoDB client in region {}", region); + + return AmazonDynamoDBClientBuilder.standard() + .withCredentials(credentials) + .withClientConfiguration(awsConf) + .withRegion(region) + .build(); + } + + /** + * Helper method to get and validate the AWS region for DynamoDBClient. + * + * @param conf configuration + * @param defaultRegion the default region + * @return configured region or else the provided default region + * @throws IOException if the region is not valid + */ + static String getRegion(Configuration conf, String defaultRegion) + throws IOException { + String region = conf.getTrimmed(S3GUARD_DDB_REGION_KEY); + if (StringUtils.isEmpty(region)) { + region = defaultRegion; + } + try { + Regions.fromName(region); + } catch (IllegalArgumentException | NullPointerException e) { + throw new IOException("Invalid region specified: " + region + "; " + + "Region can be configured with " + S3GUARD_DDB_REGION_KEY + ": " + + validRegionsString()); + } + return region; + } + + private static String validRegionsString() { + final String DELIMITER = ", "; + Regions[] regions = Regions.values(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < regions.length; i++) { + if (i > 0) { + sb.append(DELIMITER); + } + sb.append(regions[i].getName()); + } + return sb.toString(); + + } + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md index 0d8e803,a3a0bb1..d7a2b3c --- 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 @@@ -41,9 -41,9 +41,10 @@@ The specifics of using these filesystem See also: + * [Testing](testing.html) * [Troubleshooting S3a](troubleshooting_s3a.html) +* [S3Guard](s3guard.html) ### Warning #1: Object Stores are not filesystems http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AAWSCredentialsProvider.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/MockS3ClientFactory.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/c41f9f3b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBLocalClientFactory.java ---------------------------------------------------------------------- diff --cc hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBLocalClientFactory.java index be1642a,0000000..750cfb3 mode 100644,000000..100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBLocalClientFactory.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBLocalClientFactory.java @@@ -1,148 -1,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.s3guard; + +import java.io.File; +import java.io.IOException; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.local.main.ServerRunner; +import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer; +import org.apache.commons.lang3.StringUtils; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.fs.s3a.DefaultS3ClientFactory; +import org.apache.hadoop.net.ServerSocketUtil; + +import static org.apache.hadoop.fs.s3a.S3AUtils.createAWSCredentialProviderSet; +import static org.apache.hadoop.fs.s3a.s3guard.DynamoDBClientFactory.DefaultDynamoDBClientFactory.getRegion; + +/** + * A DynamoDBClientFactory implementation that creates AmazonDynamoDB clients + * against an in-memory DynamoDBLocal server instance. + * + * You won't be charged bills for issuing any DynamoDB requests. However, the + * DynamoDBLocal is considered a simulator of the DynamoDB web service, so it + * may be stale or different. For example, the throttling is not yet supported + * in DynamoDBLocal. This is for testing purpose only. + * + * To use this for creating DynamoDB client in tests: + * 1. As all DynamoDBClientFactory implementations, this should be configured. + * 2. The singleton DynamoDBLocal server instance is started automatically when + * creating the AmazonDynamoDB client for the first time. It still merits to + * launch the server before all the tests and fail fast if error happens. + * 3. The sever can be stopped explicitly, which is not actually needed in tests + * as JVM termination will do that. + * + * @see DefaultDynamoDBClientFactory + */ +public class DynamoDBLocalClientFactory extends Configured + implements DynamoDBClientFactory { + + /** The DynamoDBLocal dynamoDBLocalServer instance for testing. */ + private static DynamoDBProxyServer dynamoDBLocalServer; + private static String ddbEndpoint; + + private static final String SYSPROP_SQLITE_LIB = "sqlite4java.library.path"; + + @Override + public AmazonDynamoDB createDynamoDBClient(String defaultRegion) + throws IOException { + startSingletonServer(); + + final Configuration conf = getConf(); + final AWSCredentialsProvider credentials = - createAWSCredentialProviderSet(null, conf, null); ++ createAWSCredentialProviderSet(null, conf); + final ClientConfiguration awsConf = + DefaultS3ClientFactory.createAwsConf(conf); + // fail fast in case of service errors + awsConf.setMaxErrorRetry(3); + + final String region = getRegion(conf, defaultRegion); + LOG.info("Creating DynamoDBLocal client using endpoint {} in region {}", + ddbEndpoint, region); + + return AmazonDynamoDBClientBuilder.standard() + .withCredentials(credentials) + .withClientConfiguration(awsConf) + .withEndpointConfiguration( + new AwsClientBuilder.EndpointConfiguration(ddbEndpoint, region)) + .build(); + } + + /** + * Start a singleton in-memory DynamoDBLocal server if not started yet. + * @throws IOException if any error occurs + */ + public synchronized static void startSingletonServer() throws IOException { + if (dynamoDBLocalServer != null) { + return; + } + + // Set this property if it has not been set elsewhere + if (StringUtils.isEmpty(System.getProperty(SYSPROP_SQLITE_LIB))) { + String projectBuildDir = System.getProperty("project.build.directory"); + if (StringUtils.isEmpty(projectBuildDir)) { + projectBuildDir = "target"; + } + // sqlite4java lib should have been copied to $projectBuildDir/native-libs + System.setProperty(SYSPROP_SQLITE_LIB, + projectBuildDir + File.separator + "native-libs"); + LOG.info("Setting {} -> {}", + SYSPROP_SQLITE_LIB, System.getProperty(SYSPROP_SQLITE_LIB)); + } + + try { + // Start an in-memory local DynamoDB instance + final String port = String.valueOf(ServerSocketUtil.getPort(0, 100)); + dynamoDBLocalServer = ServerRunner.createServerFromCommandLineArgs( + new String[]{"-inMemory", "-port", port}); + dynamoDBLocalServer.start(); + ddbEndpoint = "http://localhost:" + port; + LOG.info("DynamoDBLocal singleton server was started at {}", ddbEndpoint); + } catch (Throwable t) { + String msg = "Error starting DynamoDBLocal server at " + ddbEndpoint; + LOG.error(msg, t); + throw new IOException(msg, t); + } + } + + /** + * Stop the in-memory DynamoDBLocal server if it is started. + * @throws IOException if any error occurs + */ + public synchronized static void stopSingletonServer() throws IOException { + if (dynamoDBLocalServer != null) { + LOG.info("Shutting down the in-memory DynamoDBLocal server"); + try { + dynamoDBLocalServer.stop(); + } catch (Throwable t) { + String msg = "Error stopping DynamoDBLocal server at " + ddbEndpoint; + LOG.error(msg, t); + throw new IOException(msg, t); + } + } + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
