Skip to content

Commit 4ab7a96

Browse files
sodonnelS O'Donnell
andauthored
HDDS-14669. Implement a new async finalize command which does not block on the server (#10152)
Co-authored-by: S O'Donnell <sodonnell@cloudera.com>
1 parent 70cbe94 commit 4ab7a96

21 files changed

Lines changed: 257 additions & 185 deletions

File tree

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,17 @@ List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(String address,
443443
List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
444444
boolean mostUsed, int count) throws IOException;
445445

446+
@Deprecated
446447
StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
447448
throws IOException;
448449

450+
@Deprecated
449451
StatusAndMessages queryUpgradeFinalizationProgress(
450452
String upgradeClientID, boolean force, boolean readonly)
451453
throws IOException;
452454

455+
void finalizeUpgrade() throws IOException;
456+
453457
HddsProtos.UpgradeStatus queryUpgradeStatus() throws IOException;
454458

455459
DecommissionScmResponseProto decommissionScm(

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,9 +477,13 @@ List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
477477
List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
478478
boolean mostUsed, int count, int clientVersion) throws IOException;
479479

480+
@Deprecated
480481
StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
481482
throws IOException;
482483

484+
void finalizeUpgrade() throws IOException;
485+
486+
@Deprecated
483487
StatusAndMessages queryUpgradeFinalizationProgress(
484488
String upgradeClientID, boolean force, boolean readonly)
485489
throws IOException;

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto;
7070
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeRequestProto;
7171
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeScmUpgradeResponseProto;
72+
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.FinalizeUpgradeRequestProto;
7273
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ForceExitSafeModeRequestProto;
7374
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ForceExitSafeModeResponseProto;
7475
import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerCountRequestProto;
@@ -1110,6 +1111,7 @@ public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
11101111
}
11111112

11121113
@Override
1114+
@Deprecated
11131115
public StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
11141116
throws IOException {
11151117
FinalizeScmUpgradeRequestProto req = FinalizeScmUpgradeRequestProto.
@@ -1129,6 +1131,14 @@ public StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
11291131
}
11301132

11311133
@Override
1134+
public void finalizeUpgrade() throws IOException {
1135+
FinalizeUpgradeRequestProto req = FinalizeUpgradeRequestProto.newBuilder()
1136+
.build();
1137+
submitRequest(Type.FinalizeUpgrade, builder -> builder.setFinalizeUpgradeRequest(req));
1138+
}
1139+
1140+
@Override
1141+
@Deprecated
11321142
public StatusAndMessages queryUpgradeFinalizationProgress(
11331143
String upgradeClientID, boolean force, boolean readonly)
11341144
throws IOException {

hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ public StatusAndMessages finalize(String upgradeClientID, T service)
115115
}
116116
}
117117

118+
@Override
119+
public void finalize(T service) throws IOException {
120+
UpgradeFinalization.Status status = versionManager.getUpgradeState();
121+
if (isFinalized(status)) {
122+
return;
123+
}
124+
if (status == FINALIZATION_REQUIRED) {
125+
finalizationExecutor.execute(service, this);
126+
}
127+
}
128+
118129
@Override
119130
public synchronized StatusAndMessages reportStatus(
120131
String upgradeClientID, boolean takeover) throws UpgradeException {

hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeFinalizer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public interface UpgradeFinalizer<T> {
5757
StatusAndMessages finalize(String upgradeClientID, T service)
5858
throws IOException;
5959

60+
/**
61+
* Finalize the metadata upgrade. If finalization is not needed or is already underway, this call is a noop.
62+
* @param service the service on which we run finalization.
63+
* @throws IOException if the finalization fails at any stage.
64+
*/
65+
void finalize(T service) throws IOException;
66+
6067
/**
6168
* Finalize the component if needed, and wait until completion.
6269
* @param upgradeClientID the initiating client's identifier.

hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ message ScmContainerLocationRequest {
8888
optional ReconcileContainerRequestProto reconcileContainerRequest = 49;
8989
optional GetDeletedBlocksTxnSummaryRequestProto getDeletedBlocksTxnSummaryRequest = 50;
9090
optional QueryUpgradeStatusRequestProto queryUpgradeStatusRequest = 51;
91+
optional FinalizeUpgradeRequestProto finalizeUpgradeRequest = 52;
9192
}
9293

9394
message ScmContainerLocationResponse {
@@ -147,6 +148,7 @@ message ScmContainerLocationResponse {
147148
optional ReconcileContainerResponseProto reconcileContainerResponse = 49;
148149
optional GetDeletedBlocksTxnSummaryResponseProto getDeletedBlocksTxnSummaryResponse = 50;
149150
optional QueryUpgradeStatusResponseProto queryUpgradeStatusResponse = 51;
151+
optional FinalizeUpgradeResponseProto finalizeUpgradeResponse = 52;
150152

151153
enum Status {
152154
OK = 1;
@@ -205,6 +207,7 @@ enum Type {
205207
ReconcileContainer = 45;
206208
GetDeletedBlocksTransactionSummary = 46;
207209
QueryUpgradeStatus = 47;
210+
FinalizeUpgrade = 48;
208211
}
209212

210213
/**
@@ -580,6 +583,12 @@ message QueryUpgradeStatusResponseProto {
580583
required hadoop.hdds.UpgradeStatus status = 1;
581584
}
582585

586+
message FinalizeUpgradeRequestProto {
587+
}
588+
589+
message FinalizeUpgradeResponseProto {
590+
}
591+
583592
message ContainerTokenSecretProto {
584593
required string ownerId = 1;
585594
required ContainerID containerId = 2;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,12 @@ public ScmContainerLocationResponse processRequest(
754754
.setStatus(Status.OK)
755755
.setQueryUpgradeStatusResponse(getQueryUpgradeStatus(request.getQueryUpgradeStatusRequest()))
756756
.build();
757+
case FinalizeUpgrade:
758+
impl.finalizeUpgrade();
759+
return ScmContainerLocationResponse.newBuilder()
760+
.setCmdType(request.getCmdType())
761+
.setStatus(Status.OK)
762+
.build();
757763
default:
758764
throw new IllegalArgumentException(
759765
"Unknown command type: " + request.getCmdType());

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

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import static org.apache.hadoop.hdds.server.ServerUtils.getRemoteUserName;
3030
import static org.apache.hadoop.hdds.server.ServerUtils.updateRPCListenAddress;
3131
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getRemoteUser;
32+
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.ALREADY_FINALIZED;
33+
import static org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.STARTING_FINALIZATION;
3234

3335
import com.google.common.annotations.VisibleForTesting;
3436
import com.google.common.base.Strings;
@@ -1102,31 +1104,38 @@ public ReplicationManagerReport getReplicationManagerReport() {
11021104
}
11031105

11041106
@Override
1107+
@Deprecated
11051108
public StatusAndMessages finalizeScmUpgrade(String upgradeClientID) throws
11061109
IOException {
1107-
final Map<String, String> auditMap = Maps.newHashMap();
1108-
auditMap.put("upgradeClientID", upgradeClientID);
1110+
if (scm.getLayoutVersionManager().getUpgradeState() == ALREADY_FINALIZED) {
1111+
return new StatusAndMessages(ALREADY_FINALIZED, Collections.emptyList());
1112+
}
1113+
finalizeUpgrade();
1114+
return new StatusAndMessages(STARTING_FINALIZATION, Collections.emptyList());
1115+
}
1116+
1117+
@Override
1118+
public void finalizeUpgrade() throws IOException {
1119+
final Map<String, String> auditMap = Collections.emptyMap();
11091120
try {
1110-
// check admin authorization
11111121
getScm().checkAdminAccess(getRemoteUser(), false);
1112-
// TODO HDDS-6762: Return to the client once the FINALIZATION_STARTED
1113-
// checkpoint has been crossed and continue finalizing asynchronously.
1114-
StatusAndMessages result = scm.getFinalizationManager().finalizeUpgrade(upgradeClientID);
1115-
AUDIT.logWriteSuccess(buildAuditMessageForSuccess(
1116-
SCMAction.FINALIZE_SCM_UPGRADE, auditMap));
1117-
return result;
1122+
scm.getFinalizationManager().finalizeUpgrade();
1123+
AUDIT.logWriteSuccess(buildAuditMessageForSuccess(SCMAction.FINALIZE_SCM_UPGRADE, auditMap));
11181124
} catch (Exception ex) {
1119-
AUDIT.logWriteFailure(buildAuditMessageForFailure(
1120-
SCMAction.FINALIZE_SCM_UPGRADE, auditMap, ex));
1125+
AUDIT.logWriteFailure(buildAuditMessageForFailure(SCMAction.FINALIZE_SCM_UPGRADE, auditMap, ex));
11211126
throw ex;
11221127
}
1123-
11241128
}
11251129

11261130
@Override
1131+
@Deprecated
11271132
public StatusAndMessages queryUpgradeFinalizationProgress(
11281133
String upgradeClientID, boolean force, boolean readonly)
11291134
throws IOException {
1135+
1136+
// This method, we change to call the queryUpgradeStatus and create a StatusAndMessages object that reflects
1137+
// the state.
1138+
11301139
Map<String, String> auditMap = Maps.newHashMap();
11311140
auditMap.put("upgradeClientID", upgradeClientID);
11321141
auditMap.put("force", String.valueOf(force));

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public interface FinalizationManager {
3434
UpgradeFinalization.StatusAndMessages finalizeUpgrade(String upgradeClientID)
3535
throws IOException;
3636

37+
void finalizeUpgrade() throws IOException;
38+
3739
UpgradeFinalization.StatusAndMessages queryUpgradeFinalizationProgress(
3840
String upgradeClientID, boolean takeover, boolean readonly
3941
) throws IOException;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ public UpgradeFinalization.StatusAndMessages finalizeUpgrade(
9090
return upgradeFinalizer.finalize(upgradeClientID, context);
9191
}
9292

93+
@Override
94+
public void finalizeUpgrade() throws IOException {
95+
Objects.requireNonNull(context, "Cannot finalize upgrade without first building the upgrade context.");
96+
upgradeFinalizer.finalize(context);
97+
}
98+
9399
@Override
94100
public UpgradeFinalization.StatusAndMessages queryUpgradeFinalizationProgress(
95101
String upgradeClientID, boolean takeover, boolean readonly

0 commit comments

Comments
 (0)