Skip to content
Draft
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 @@ -35,6 +35,7 @@
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.conf.StorageUnit;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.ozone.ClientVersion;
import org.apache.hadoop.ozone.DataTestUtil;
import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
Expand All @@ -46,6 +47,10 @@
import org.apache.hadoop.ozone.om.helpers.ServiceInfo;
import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
import org.apache.hadoop.ozone.upgrade.RatisBasedVersionManager;
import org.apache.ozone.test.GenericTestUtils.LogCapturer;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -192,6 +197,18 @@ void testOmFinalizationStatusTransitions() throws Exception {
assertEquals(HddsProtos.FinalizationStatus.UNFINALIZED,
omClient.queryUpgradeStatus().getOmFinalizationStatus());

OMRequest request = OMRequest.newBuilder()
.setCmdType(Type.CompleteFinalizeUpgrade)
.setVersion(ClientVersion.CURRENT.serialize())
.setClientId(UUID.randomUUID().toString())
.build();
OMResponse response = OmTestUtil.getFailoverProxyProvider(client.getObjectStore()).getProxy().proxy
.submitRequest(null, request);
assertThat(response.getSuccess()).isFalse();
assertEquals(Status.INVALID_REQUEST, response.getStatus());
assertEquals(INITIAL_VERSION, om.getVersionManager().getApparentVersion());
assertNull(om.getMetadataManager().getMetaTable().get(FINALIZATION_IN_PROGRESS_KEY));

// With the in-progress marker present but the OM not yet finalized, OM reports IN_PROGRESS.
om.getMetadataManager().getMetaTable().put(FINALIZATION_IN_PROGRESS_KEY, "ignored");
assertEquals(HddsProtos.FinalizationStatus.IN_PROGRESS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.apache.hadoop.ozone.audit.OMAction;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
import org.apache.hadoop.ozone.om.request.OMClientRequest;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
Expand All @@ -53,6 +54,12 @@ public OMCompleteFinalizeUpgradeRequest(OMRequest omRequest) {
super(omRequest);
}

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
final OMRequest omRequest = super.preExecute(ozoneManager);
throw new OMException(omRequest.getCmdType() + " is an internal request", OMException.ResultCodes.INVALID_REQUEST);
Comment on lines +59 to +60
}

@Override
public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) {
LOG.trace("Request: {}", getOmRequest());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,27 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;

import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.OzoneManagerVersion;
import org.apache.hadoop.ozone.om.execution.OMExecutionFlow;
import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
import org.apache.hadoop.ozone.om.ratis.TestOzoneManagerStateMachine;
import org.apache.hadoop.ozone.om.request.key.OMKeyRequestTests;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
Expand All @@ -49,6 +57,27 @@
*/
public class TestOMCompleteFinalizeUpgradeRequest extends OMKeyRequestTests {

@Test
public void testExternalCompletionIsRejectedBeforeRatis() throws Exception {
OzoneManagerRatisServer ratisServer = mock(OzoneManagerRatisServer.class);
when(ozoneManager.getOmRatisServer()).thenReturn(ratisServer);
when(ozoneManager.getOmRpcServerAddr()).thenReturn(new InetSocketAddress("localhost", 9862));
when(ratisServer.submitRequest(any(OzoneManagerProtocolProtos.OMRequest.class), eq(true)))
.thenReturn(OMResponse.newBuilder().setCmdType(OzoneManagerProtocolProtos.Type.CompleteFinalizeUpgrade)
.setStatus(Status.OK).setSuccess(true).build());
OzoneManagerProtocolProtos.OMRequest request = OzoneManagerProtocolProtos.OMRequest.newBuilder()
.setCmdType(OzoneManagerProtocolProtos.Type.CompleteFinalizeUpgrade)
.setClientId(ClientId.randomId().toString())
.build();

OMResponse response = new OMExecutionFlow(ozoneManager).submit(request, true);

assertFalse(response.getSuccess());
assertEquals(Status.INVALID_REQUEST, response.getStatus());
verifyNoInteractions(ratisServer);
verify(ozoneManager, never()).finalizeUpgrade();
Comment on lines +75 to +78
}

@Test
public void testFinalizationInProgressKeyRemoved() throws IOException {
OMVersionManager omVersionManager = mock(OMVersionManager.class);
Expand All @@ -66,6 +95,7 @@ public void testFinalizationInProgressKeyRemoved() throws IOException {
assertEquals(1, omMetrics.getFinalizationInProgress(),
"metric should be 1 before finalizing");
submitRequest();
verify(ozoneManager).finalizeUpgrade();

progressKey = omMetadataManager.getMetaTable().get(OzoneConsts.FINALIZATION_IN_PROGRESS_KEY);
assertNull(progressKey);
Expand Down Expand Up @@ -94,7 +124,6 @@ public void testFinalizeFailureMapsToInternalError() throws IOException {
.build();
OMCompleteFinalizeUpgradeRequest request = new OMCompleteFinalizeUpgradeRequest(omRequest);
ExecutionContext context = ExecutionContext.of(1, TermIndex.INITIAL_VALUE);
request.preExecute(ozoneManager);

OMClientResponse response = request.validateAndUpdateCache(ozoneManager, context);
OMResponse omResponse = response.getOMResponse();
Expand All @@ -111,11 +140,9 @@ private void submitRequest() throws IOException {
OMCompleteFinalizeUpgradeRequest request = new OMCompleteFinalizeUpgradeRequest(omRequest);
ExecutionContext context = ExecutionContext.of(1, TermIndex.INITIAL_VALUE);

OzoneManagerProtocolProtos.OMRequest modifiedOmRequest = request.preExecute(ozoneManager);

// Will not be equal, as UserInfo will be set.
assertNotEquals(omRequest, modifiedOmRequest);
request.validateAndUpdateCache(ozoneManager, context);
// Internal requests are applied from Ratis without preExecute().
OMClientResponse response = request.validateAndUpdateCache(ozoneManager, context);
assertTrue(response.getOMResponse().getSuccess());
}

}