Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.
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