Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

OOZIE-3621 Make TestECPolicyDisabler work with Hadoop 3 #59

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ enum Result {
}

public static void tryDisableECPolicyForPath(FileSystem fs, Path path) {
switch (check(fs, path)) {
switch (check(fs, path, GETERASURECODINGPOLICY_METHOD)) {
case DONE:
System.out.println("Done");
break;
Expand All @@ -64,12 +64,12 @@ public static void tryDisableECPolicyForPath(FileSystem fs, Path path) {
}
}

static Result check(FileSystem fs, Path path) {
static Result check(FileSystem fs, Path path, String getErasureCodingPolicyMethodName) {
if (fs instanceof DistributedFileSystem && supportsErasureCoding()) {
System.out.println("Found Hadoop that supports Erasure Coding. Trying to disable Erasure Coding for path: "+ path);
DistributedFileSystem dfs = (DistributedFileSystem) fs;
final Object replicationPolicy = getReplicationPolicy();
Method getErasureCodingPolicyMethod = getMethod(dfs, GETERASURECODINGPOLICY_METHOD);
Method getErasureCodingPolicyMethod = getMethod(dfs, getErasureCodingPolicyMethodName);
final Pair<Object,Result> currentECPolicy = safeInvokeMethod(getErasureCodingPolicyMethod, dfs, path);
if (currentECPolicy.getRight() != null) {
return currentECPolicy.getRight();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,17 @@

/**
* Test for the Erasure Coding disabler code.
*
* Noted that getErasureCodingPolicy was introduced to hadoop 3 and the returned class (ErasureCodingPolicy) does
* NOT exist in hadoop 2. That is to say, the implementation of getErasureCodingPolicy can't work with both hadoop 2
* and hadoop 3. Hence, this test makes ECPolicyDisabler#check to test another method `getFakeErasureCodingPolicy`
*/
public class TestECPolicyDisabler {

private static final String FAKE_METHOD_NAME = "getFakeErasureCodingPolicy";

static abstract class MockDistributedFileSystem extends DistributedFileSystem {
public abstract SystemErasureCodingPolicies.ReplicationPolicy getErasureCodingPolicy(Path path);
public abstract SystemErasureCodingPolicies.ReplicationPolicy getFakeErasureCodingPolicy(Path path);
public abstract void setErasureCodingPolicy(Path path, String policy);
}

Expand All @@ -59,91 +65,91 @@ public void setup() {
@Test
public void testNotSupported() {
FileSystem fs = mock(FileSystem.class);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
Assert.assertEquals("result is expected", Result.NOT_SUPPORTED, result);
}

@Test
public void testOkNotChanged() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.DEFAULT);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.DEFAULT);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
assertEquals("result is expected", Result.ALREADY_SET, result);
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verifyNoMoreInteractions(fs);
}

@Test
public void testOkChanged() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
assertEquals("result is expected", Result.DONE, result);
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verify(fs).setErasureCodingPolicy(any(), eq("DEFAULT"));
verifyNoMoreInteractions(fs);
}

@Test
public void testServerNotSupports() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
Mockito.doThrow(createNoSuchMethodException()).when(fs).setErasureCodingPolicy(any(), any());
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
assertEquals("result is expected", Result.NO_SUCH_METHOD, result);
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verify(fs).setErasureCodingPolicy(any(), eq("DEFAULT"));
verifyNoMoreInteractions(fs);
}

@Test
public void testServerNotSupportsGetErasureCodingPolicyMethod() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any(Path.class))).thenThrow(createNoSuchMethodException());
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, mock(Path.class));
when(fs.getFakeErasureCodingPolicy(any(Path.class))).thenThrow(createNoSuchMethodException());
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, mock(Path.class), FAKE_METHOD_NAME);
assertEquals("result is expected", Result.NO_SUCH_METHOD, result);
verify(fs).getErasureCodingPolicy(any(Path.class));
verify(fs).getFakeErasureCodingPolicy(any(Path.class));
verifyNoMoreInteractions(fs);
}

@Test
public void testServerNotSupportsGetName() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);

ReplicationPolicy mockPolicy = mock(ReplicationPolicy.class);
SystemErasureCodingPolicies.setSystemPolicy(mockPolicy);
when(mockPolicy.getName()).thenThrow(createNoSuchMethodException());
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
assertEquals("result is expected", Result.NO_SUCH_METHOD, result);
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verifyNoMoreInteractions(fs);
}

@Test
public void testServerNotSupportsSetErasureCodingPolicyMethod() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
Mockito.doThrow(createNoSuchMethodException()).when(fs).setErasureCodingPolicy(any(), any());
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null);
ECPolicyDisabler.Result result = ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
assertEquals("result is expected", Result.NO_SUCH_METHOD, result);
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verify(fs).setErasureCodingPolicy(any(), eq("DEFAULT"));
verifyNoMoreInteractions(fs);
}

@Test
public void testOtherRuntimeExceptionThrown() {
MockDistributedFileSystem fs = mock(MockDistributedFileSystem.class);
when(fs.getErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
when(fs.getFakeErasureCodingPolicy(any())).thenReturn(ReplicationPolicy.OTHER);
Mockito.doThrow(new RuntimeException("mock io exception")).when(fs).setErasureCodingPolicy(any(), any());
try {
ECPolicyDisabler.check(fs, null);
ECPolicyDisabler.check(fs, null, FAKE_METHOD_NAME);
Assert.fail("exception expected");
} catch (RuntimeException e) {
assertNotNull("runtime exception got", e);
}
verify(fs).getErasureCodingPolicy(any());
verify(fs).getFakeErasureCodingPolicy(any());
verify(fs).setErasureCodingPolicy(any(), eq("DEFAULT"));
verifyNoMoreInteractions(fs);
}
Expand Down