Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
b747ee5
HDDS-12493. Move container upgrade under repair
adoroszlai Mar 7, 2025
992e899
remove confirmation
adoroszlai Mar 8, 2025
e65ebf3
get rid of shared volumeStoreMap
adoroszlai Mar 8, 2025
b9de4f7
avoid unnecessary cast
adoroszlai Mar 8, 2025
08a915a
remove unused variable and method
adoroszlai Mar 8, 2025
f09fa69
UpgradeChecker methods can be static
adoroszlai Mar 8, 2025
c3462df
move volume and container upgrade result classes to top-level
adoroszlai Mar 8, 2025
dd46318
remove unused method
adoroszlai Mar 8, 2025
f4118b2
move utils from UpgradeChecker to UpgradeUtils
adoroszlai Mar 8, 2025
603b56f
reduce visibility
adoroszlai Mar 8, 2025
b803752
merge UpgradeManager.run into UpgradeContainerSchemaSubcommand
adoroszlai Mar 8, 2025
f144ebf
rename to UpgradeContainerSchema
adoroszlai Mar 8, 2025
6ca9671
move UpgradeTask into UpgradeContainerSchema
adoroszlai Mar 8, 2025
b2eb311
remove IOException not thrown
adoroszlai Mar 8, 2025
bcecb85
remove required=false (default)
adoroszlai Mar 8, 2025
be63d2c
wrap in unmodifiableSet
adoroszlai Mar 8, 2025
9ae895f
rename COLUMN_FAMILIES_NAME to COLUMN_FAMILY_NAMES
adoroszlai Mar 8, 2025
3f12936
fix checkstyle
adoroszlai Mar 8, 2025
4accb8a
use stdout/stderr instead of Logger
adoroszlai Mar 8, 2025
552d61d
fix unit test
adoroszlai Mar 8, 2025
a38e56b
Merge remote-tracking branch 'origin/master' into HDDS-12493
adoroszlai Mar 11, 2025
8e77ce2
do not require DN to be IN_MAINTENANCE
adoroszlai Mar 11, 2025
4281821
use File(File, String) instead of File(String) with concatenation
adoroszlai Mar 11, 2025
2d7ddcb
Merge remote-tracking branch 'origin/master' into HDDS-12493
adoroszlai Mar 11, 2025
0348abe
print errors
adoroszlai Mar 11, 2025
df25de3
Merge remote-tracking branch 'origin/master' into HDDS-12493
adoroszlai Mar 24, 2025
f6f57be
implement dry-run
adoroszlai Mar 24, 2025
b6d08ab
add fatal()
adoroszlai Mar 31, 2025
d34517c
fix and improve unit test
adoroszlai Mar 24, 2025
ac4a71e
fixup for 8e77ce2e87 do not require DN to be IN_MAINTENANCE
adoroszlai Mar 31, 2025
0bd0d60
Merge remote-tracking branch 'origin/master' into HDDS-12493
adoroszlai Mar 31, 2025
3f76585
Merge remote-tracking branch 'origin/master' into HDDS-12493
adoroszlai Apr 9, 2025
6f17545
keep original command for referring users to new one
adoroszlai Apr 9, 2025
4ee3851
Merge remote-tracking branch 'upstream' into HDDS-12493
nandakumar131 Apr 15, 2025
220cc9f
Fixed incorrect master merge.
nandakumar131 Apr 15, 2025
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 @@ -76,6 +76,11 @@ public boolean isVerbose() {
public OzoneConfiguration getOzoneConf() {
return conf;
}

@Override
public void printError(Throwable t) {
t.printStackTrace();
}
}

protected PrintWriter out() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ public int execute(String[] argv) {
return cmd.execute(argv);
}

protected void printError(Throwable error) {
@Override
public void printError(Throwable error) {
//message could be null in case of NPE. This is unexpected so we can
//print out the stack trace.
if (verbose || Strings.isNullOrEmpty(error.getMessage())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,6 @@ public interface GenericParentCommand {

/** Returns a cached configuration, i.e. it is created only once, subsequent calls return the same instance. */
OzoneConfiguration getOzoneConf();

void printError(Throwable t);
}
12 changes: 0 additions & 12 deletions hadoop-hdds/tools/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -134,18 +134,6 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ozone</groupId>
<artifactId>hdds-container-service</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ozone</groupId>
<artifactId>hdds-server-framework</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ozone</groupId>
<artifactId>hdds-test-utils</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
CreateSubcommand.class,
CloseSubcommand.class,
ReportSubcommand.class,
UpgradeSubcommand.class
UpgradeSubcommand.class,
})
@MetaInfServices(AdminSubcommand.class)
public class ContainerCommands implements AdminSubcommand {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,177 +17,31 @@

package org.apache.hadoop.hdds.scm.cli.container;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import java.io.File;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Callable;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.hdds.cli.AbstractSubcommand;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.cli.container.upgrade.UpgradeChecker;
import org.apache.hadoop.hdds.scm.cli.container.upgrade.UpgradeManager;
import org.apache.hadoop.hdds.scm.cli.container.upgrade.UpgradeUtils;
import org.apache.hadoop.hdds.server.OzoneAdmins;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
import org.apache.hadoop.security.UserGroupInformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import picocli.CommandLine;
import picocli.CommandLine.Command;

/**
* This is the handler that process container upgrade command.
* @deprecated by {@code ozone repair datanode upgrade-container-schema}
*/
@Command(
@CommandLine.Command(
name = "upgrade",
description = "Offline upgrade all schema V2 containers to schema V3 " +
"for this datanode.",
description = "Please see `ozone repair datanode upgrade-container-schema`.",
mixinStandardHelpOptions = true,
versionProvider = HddsVersionProvider.class)
@Deprecated
public class UpgradeSubcommand extends AbstractSubcommand implements Callable<Void> {

private static final Logger LOG =
LoggerFactory.getLogger(UpgradeSubcommand.class);

@CommandLine.Option(names = {"--volume"},
required = false,
description = "volume path")
@CommandLine.Option(names = {"--volume"}, description = "ignored")
private String volume;

@CommandLine.Option(names = {"-y", "--yes"},
description = "Continue without interactive user confirmation")
@CommandLine.Option(names = {"-y", "--yes"}, description = "ignored")
private boolean yes;

private static OzoneConfiguration ozoneConfiguration;


@Override
public Void call() throws Exception {
OzoneConfiguration configuration = getConfiguration();
// Verify admin privilege
OzoneAdmins admins = OzoneAdmins.getOzoneAdmins("", configuration);
if (!admins.isAdmin(UserGroupInformation.getCurrentUser())) {
out().println("It requires ozone administrator privilege. Current user" +
" is " + UserGroupInformation.getCurrentUser() + ".");
return null;
}

final UpgradeChecker upgradeChecker = new UpgradeChecker();
Pair<Boolean, String> pair = upgradeChecker.checkDatanodeRunning();
final boolean isRunning = pair.getKey();
if (isRunning) {
out().println(pair.getValue());
return null;
}

DatanodeDetails dnDetail =
UpgradeUtils.getDatanodeDetails(configuration);

Pair<HDDSLayoutFeature, HDDSLayoutFeature> layoutFeature =
upgradeChecker.getLayoutFeature(dnDetail, configuration);
final HDDSLayoutFeature softwareLayoutFeature = layoutFeature.getLeft();
final HDDSLayoutFeature metadataLayoutFeature = layoutFeature.getRight();
final int needLayoutVersion =
HDDSLayoutFeature.DATANODE_SCHEMA_V3.layoutVersion();

if (metadataLayoutFeature.layoutVersion() < needLayoutVersion ||
softwareLayoutFeature.layoutVersion() < needLayoutVersion) {
out().println(String.format(
"Please upgrade your software version, no less than %s," +
" current metadata layout version is %s," +
" software layout version is %s",
HDDSLayoutFeature.DATANODE_SCHEMA_V3.name(),
metadataLayoutFeature.name(), softwareLayoutFeature.name()));
return null;
}

if (!Strings.isNullOrEmpty(volume)) {
File volumeDir = new File(volume);
if (!volumeDir.exists() || !volumeDir.isDirectory()) {
out().println(
String.format("Volume path %s is not a directory or doesn't exist",
volume));
return null;
}
File hddsRootDir = new File(volume + "/" + HddsVolume.HDDS_VOLUME_DIR);
File versionFile = new File(volume + "/" + HddsVolume.HDDS_VOLUME_DIR +
"/" + Storage.STORAGE_FILE_VERSION);
if (!hddsRootDir.exists() || !hddsRootDir.isDirectory() ||
!versionFile.exists() || !versionFile.isFile()) {
out().println(
String.format("Volume path %s is not a valid data volume", volume));
return null;
}
configuration.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, volume);
}

final HddsProtos.NodeOperationalState opState =
dnDetail.getPersistedOpState();

if (!opState.equals(HddsProtos.NodeOperationalState.IN_MAINTENANCE)) {
out().println("This command requires the datanode's " +
"NodeOperationalState to be IN_MAINTENANCE, currently is " +
opState);
return null;
}

List<HddsVolume> allVolume =
upgradeChecker.getAllVolume(dnDetail, configuration);

Iterator<HddsVolume> volumeIterator = allVolume.iterator();
while (volumeIterator.hasNext()) {
HddsVolume hddsVolume = volumeIterator.next();
if (UpgradeChecker.isAlreadyUpgraded(hddsVolume)) {
out().println("Volume " + hddsVolume.getVolumeRootDir() +
" is already upgraded, skip it.");
volumeIterator.remove();
}
}

if (allVolume.isEmpty()) {
out().println("There is no more volume to upgrade. Exit.");
return null;
}

if (!yes) {
Scanner scanner = new Scanner(new InputStreamReader(
System.in, StandardCharsets.UTF_8));
System.out.println(
"All volume db stores will be automatically backup," +
" should we continue the upgrade ? [yes|no] : ");
boolean confirm = scanner.next().trim().equals("yes");
scanner.close();
if (!confirm) {
return null;
}
}

// do upgrade
final UpgradeManager upgradeManager = new UpgradeManager();
upgradeManager.run(configuration, allVolume);
return null;
}

@VisibleForTesting
public static void setOzoneConfiguration(OzoneConfiguration config) {
ozoneConfiguration = config;
}

private OzoneConfiguration getConfiguration() {
if (ozoneConfiguration == null) {
ozoneConfiguration = new OzoneConfiguration();
}
return ozoneConfiguration;
throw new IllegalStateException(
"This command was moved, please use it via `ozone repair datanode upgrade-container-schema` instead.");
}
}

This file was deleted.

Loading