[
https://issues.apache.org/jira/browse/HADOOP-18671?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17718665#comment-17718665
]
ASF GitHub Bot commented on HADOOP-18671:
-----------------------------------------
taklwu commented on code in PR #5553:
URL: https://github.com/apache/hadoop/pull/5553#discussion_r1182853373
##########
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestViewDistributedFileSystem.java:
##########
@@ -195,18 +202,103 @@ public void testQuota() throws IOException {
@Test
public void testPathCapabilities() throws IOException {
- Configuration conf = getTestConfiguration();
- try (MiniDFSCluster cluster = new
MiniDFSCluster.Builder(conf).numDataNodes(0).build()) {
- URI defaultUri =
URI.create(conf.get(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY));
- conf.set("fs.viewfs.mounttable." + defaultUri.getHost() +
".linkFallback",
- defaultUri.toString());
- try (ViewDistributedFileSystem fileSystem = (ViewDistributedFileSystem)
FileSystem.get(
- conf)) {
- final Path testFile = new Path("/test");
- assertTrue("ViewDfs supports truncate",
- fileSystem.hasPathCapability(testFile,
CommonPathCapabilities.FS_TRUNCATE));
- }
+ try (MiniDFSCluster cluster = new
MiniDFSCluster.Builder(getViewFsConfiguration())
+ .numDataNodes(0).build();
+ ViewDistributedFileSystem fileSystem = (ViewDistributedFileSystem)
FileSystem.get(
+ cluster.getConfiguration(0))) {
+ final Path testFile = new Path("/test");
+ assertTrue("ViewDfs supports truncate",
+ fileSystem.hasPathCapability(testFile,
CommonPathCapabilities.FS_TRUNCATE));
+ final boolean isLeaseRecoverable =
fileSystem.hasPathCapability(testFile, LEASE_RECOVERABLE);
+ assertThat(isLeaseRecoverable).describedAs("path capabilities %s=%s in
%s",
+ LEASE_RECOVERABLE, fileSystem.hasPathCapability(testFile,
LEASE_RECOVERABLE),
+ fileSystem).isTrue();
+ assertThat(fileSystem).describedAs("filesystem %s", fileSystem)
+ .isInstanceOf(LeaseRecoverable.class);
+ assertThat(fileSystem).describedAs("filesystem %s",
fileSystem).isInstanceOf(SafeMode.class);
+ }
+ }
+
+ @Test
+ public void testSafeMode() throws IOException {
+ testSafeMode(this::executeAssertionsWithSafeMode);
+ }
+
+ @Test
+ public void testSafeModeWithDeprecatedAPIs() throws IOException {
+ testSafeMode(this::executeAssertionsWithDeprecatedAPIs);
+ }
+
+ private void testSafeMode(Consumer<ViewDistributedFileSystem>
executeAssertionsFunction)
+ throws IOException {
+ try (MiniDFSCluster cluster = new
MiniDFSCluster.Builder(getViewFsConfiguration())
+ .numDataNodes(0).build();
+ ViewDistributedFileSystem fileSystem = (ViewDistributedFileSystem)
FileSystem.get(
+ cluster.getConfiguration(0))) {
+ executeAssertionsFunction.accept(fileSystem);
}
}
+ private SafeMode verifyAndGetSafeModeInstance(FileSystem fs) {
+ Assertions.assertThat(fs)
+ .describedAs("File system %s must be an instance of %s", fs,
SafeMode.class.getClass())
+ .isInstanceOf(SafeMode.class);
+ return (SafeMode) fs;
+ }
+
+ private void executeAssertionsWithSafeMode(ViewDistributedFileSystem
fileSystem) {
+ SafeMode fsWithSafeMode = verifyAndGetSafeModeInstance(fileSystem);
+ assertSafeModeStatus(fsWithSafeMode, SafeModeAction.GET, false,
+ "Getting the status of safe mode before entering should be off.");
+ assertSafeModeStatus(fsWithSafeMode, SafeModeAction.ENTER, true,
+ "Entering Safe mode and safe mode turns on.");
+ assertSafeModeStatus(fsWithSafeMode, SafeModeAction.GET, true,
+ "Getting the status of safe mode after entering, safe mode should be
on.");
+ assertSafeModeStatus(fsWithSafeMode, SafeModeAction.LEAVE, false,
+ "Leaving safe mode, and safe mode switches off.");
+ assertSafeModeStatus(fsWithSafeMode, SafeModeAction.FORCE_EXIT, false,
+ "Force exist safe mode at any time, safe mode should always switches
off.");
+ }
+
+ private void executeAssertionsWithDeprecatedAPIs(ViewDistributedFileSystem
fileSystem) {
+ assertSafeModeStatus(fileSystem,
HdfsConstants.SafeModeAction.SAFEMODE_GET, false,
+ "Getting the status of safe mode before entering should be off.");
+ assertSafeModeStatus(fileSystem,
HdfsConstants.SafeModeAction.SAFEMODE_ENTER, true,
+ "Entering Safe mode and safe mode turns on.");
+ assertSafeModeStatus(fileSystem,
HdfsConstants.SafeModeAction.SAFEMODE_GET, true,
+ "Getting the status of safe mode after entering, safe mode should be
on.");
+ assertSafeModeStatus(fileSystem,
HdfsConstants.SafeModeAction.SAFEMODE_LEAVE, false,
+ "Leaving safe mode, and safe mode switches off.");
+ assertSafeModeStatus(fileSystem,
HdfsConstants.SafeModeAction.SAFEMODE_FORCE_EXIT, false,
+ "Force exist safe mode at any time, safe mode should always switches
off.");
+ }
+
+ private void assertSafeModeStatus(SafeMode fsWithSafeMode, SafeModeAction
action,
+ boolean expectedStatus, String message) {
+ try {
+
Assertions.assertThat(fsWithSafeMode.setSafeMode(action)).describedAs(message)
+ .isEqualTo(expectedStatus);
+ } catch (Exception e) {
Review Comment:
yup, and thanks that `ConsumerRaisingIOE` really helps in this case
> Add recoverLease(), setSafeMode(), isFileClosed() APIs to FileSystem
> --------------------------------------------------------------------
>
> Key: HADOOP-18671
> URL: https://issues.apache.org/jira/browse/HADOOP-18671
> Project: Hadoop Common
> Issue Type: New Feature
> Components: fs
> Reporter: Wei-Chiu Chuang
> Priority: Major
> Labels: pull-request-available
>
> We are in the midst of enabling HBase and Solr to run on Ozone.
> An obstacle is that HBase relies heavily on HDFS APIs and semantics for its
> Write Ahead Log (WAL) file (similarly, for Solr's transaction log). We
> propose to push up these HDFS APIs, i.e. recoverLease(), setSafeMode(),
> isFileClosed() to FileSystem abstraction so that HBase and other applications
> do not need to take on Ozone dependency at compile time. This work will
> (hopefully) enable HBase to run on other storage system implementations in
> the future.
> There are other HDFS features that HBase uses, including hedged read and
> favored nodes. Those are FS-specific optimizations and are not critical to
> enable HBase on Ozone.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]