Skip to content

Commit 21bc0e6

Browse files
authored
HDDS-15609. Legacy SCM Finalize command should become a no-op (#10543)
1 parent 22948f4 commit 21bc0e6

2 files changed

Lines changed: 74 additions & 19 deletions

File tree

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_DONE_MSG;
3333
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_REQUIRED_MSG;
3434
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.ALREADY_FINALIZED;
35-
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.STARTING_FINALIZATION;
3635

3736
import com.google.common.annotations.VisibleForTesting;
3837
import com.google.common.base.Strings;
@@ -1150,15 +1149,19 @@ public ReplicationManagerReport getReplicationManagerReport() {
11501149
return scm.getReplicationManager().getContainerReport();
11511150
}
11521151

1152+
/*
1153+
* This command is deprecated and is retained for backward compatibility. It no longer finalizes SCM
1154+
* as the process is driven from OM which will trigger the SCM finalize process.
1155+
*/
11531156
@Override
11541157
@Deprecated
1155-
public StatusAndMessages finalizeScmUpgrade(String upgradeClientID) throws
1156-
IOException {
1157-
if (!scm.getVersionManager().needsFinalization()) {
1158-
return new StatusAndMessages(ALREADY_FINALIZED, Collections.emptyList());
1159-
}
1160-
finalizeUpgrade();
1161-
return new StatusAndMessages(STARTING_FINALIZATION, Collections.emptyList());
1158+
public StatusAndMessages finalizeScmUpgrade(String upgradeClientID) {
1159+
// This command is kept only for legacy upgrade scripts which would have first finalized SCM and then
1160+
// made a call to OM to finalize it. The new flow, is that a single call to OM triggers the finalization process.
1161+
// The legacy OM command now calls the new one and correctly starts the flow, so this command has become a
1162+
// noop. Regardless of whether SCM is finalized or not, we return ALREADY_FINALIZED to allow any scripts to move
1163+
// on and call OM to start the process.
1164+
return new StatusAndMessages(ALREADY_FINALIZED, Collections.emptyList());
11621165
}
11631166

11641167
@Override

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMClientProtocolServer.java

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919

2020
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState.CLOSED;
2121
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_READONLY_ADMINISTRATORS;
22+
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.ALREADY_FINALIZED;
2223
import static org.junit.jupiter.api.Assertions.assertEquals;
2324
import static org.junit.jupiter.api.Assertions.assertFalse;
2425
import static org.junit.jupiter.api.Assertions.assertThrows;
2526
import static org.junit.jupiter.api.Assertions.assertTrue;
2627
import static org.mockito.ArgumentMatchers.any;
2728
import static org.mockito.Mockito.mock;
29+
import static org.mockito.Mockito.never;
30+
import static org.mockito.Mockito.verify;
2831
import static org.mockito.Mockito.when;
2932

3033
import java.io.File;
@@ -48,11 +51,15 @@
4851
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
4952
import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocolServerSideTranslatorPB;
5053
import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
54+
import org.apache.hadoop.hdds.scm.server.upgrade.FinalizationManager;
55+
import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
5156
import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics;
5257
import org.apache.hadoop.ozone.container.common.SCMTestUtils;
58+
import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.StatusAndMessages;
5359
import org.apache.hadoop.security.AccessControlException;
5460
import org.apache.hadoop.security.UserGroupInformation;
55-
import org.junit.jupiter.api.AfterEach;
61+
import org.junit.jupiter.api.AfterAll;
62+
import org.junit.jupiter.api.BeforeAll;
5663
import org.junit.jupiter.api.BeforeEach;
5764
import org.junit.jupiter.api.Test;
5865
import org.junit.jupiter.api.io.TempDir;
@@ -62,17 +69,16 @@
6269
* servicing commands from the scm client.
6370
*/
6471
public class TestSCMClientProtocolServer {
65-
private SCMClientProtocolServer server;
66-
private StorageContainerManager scm;
67-
private StorageContainerLocationProtocolServerSideTranslatorPB service;
68-
private SCMSafeModeManager mockSafeModeManager;
69-
70-
@BeforeEach
71-
void setUp(@TempDir File testDir) throws Exception {
72+
private static SCMClientProtocolServer server;
73+
private static StorageContainerManager scm;
74+
private static StorageContainerLocationProtocolServerSideTranslatorPB service;
75+
private static SCMSafeModeManager mockSafeModeManager;
76+
77+
@BeforeAll
78+
static void setUp(@TempDir File testDir) throws Exception {
7279
OzoneConfiguration config = SCMTestUtils.getConf(testDir);
7380

7481
mockSafeModeManager = mock(SCMSafeModeManager.class);
75-
when(mockSafeModeManager.getInSafeMode()).thenReturn(false);
7682

7783
SCMConfigurator configurator = new SCMConfigurator();
7884
configurator.setSCMHAManager(SCMHAManagerStub.getInstance(true));
@@ -87,8 +93,13 @@ void setUp(@TempDir File testDir) throws Exception {
8793
scm, mock(ProtocolMessageMetrics.class));
8894
}
8995

90-
@AfterEach
91-
public void tearDown() throws Exception {
96+
@BeforeEach
97+
void setUp() {
98+
when(mockSafeModeManager.getInSafeMode()).thenReturn(false);
99+
}
100+
101+
@AfterAll
102+
public static void tearDown() throws Exception {
92103
if (scm != null) {
93104
scm.stop();
94105
scm.join();
@@ -181,6 +192,47 @@ private StorageContainerManager mockStorageContainerManager() {
181192
return storageContainerManager;
182193
}
183194

195+
@Test
196+
public void testLegacyFinalizeScmUpgradeAlreadyFinalized() throws Exception {
197+
FinalizationManager mockFinalizationManager = mock(FinalizationManager.class);
198+
SCMClientProtocolServer testServer = serverWithMockFinalization(false, mockFinalizationManager);
199+
try {
200+
StatusAndMessages result = testServer.finalizeScmUpgrade("testClientID");
201+
assertEquals(ALREADY_FINALIZED, result.status());
202+
assertTrue(result.msgs().isEmpty());
203+
verify(mockFinalizationManager, never()).finalizeUpgrade();
204+
} finally {
205+
testServer.stop();
206+
}
207+
}
208+
209+
@Test
210+
public void testLegacyFinalizeScmUpgradeFinalizationRequired() throws Exception {
211+
FinalizationManager mockFinalizationManager = mock(FinalizationManager.class);
212+
SCMClientProtocolServer testServer = serverWithMockFinalization(true, mockFinalizationManager);
213+
try {
214+
StatusAndMessages result = testServer.finalizeScmUpgrade("testClientID");
215+
assertEquals(ALREADY_FINALIZED, result.status());
216+
assertTrue(result.msgs().isEmpty());
217+
verify(mockFinalizationManager, never()).finalizeUpgrade();
218+
} finally {
219+
testServer.stop();
220+
}
221+
}
222+
223+
private SCMClientProtocolServer serverWithMockFinalization(
224+
boolean needsFinalization, FinalizationManager finalizationManager) throws IOException {
225+
ScmVersionManager mockVersionManager = mock(ScmVersionManager.class);
226+
when(mockVersionManager.needsFinalization()).thenReturn(needsFinalization);
227+
228+
StorageContainerManager mockScm = mockStorageContainerManager();
229+
when(mockScm.getVersionManager()).thenReturn(mockVersionManager);
230+
when(mockScm.getFinalizationManager()).thenReturn(finalizationManager);
231+
232+
return new SCMClientProtocolServer(
233+
new OzoneConfiguration(), mockScm, mock(ReconfigurationHandler.class));
234+
}
235+
184236
@Test
185237
public void testQueryUpgradeStatus() throws Exception {
186238
HddsProtos.UpgradeStatus status = server.queryUpgradeStatus();

0 commit comments

Comments
 (0)