This is an automated email from the ASF dual-hosted git repository.
prashantpogde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 9c6cd4b93e Changed snapshotId to UUID (#4848)
9c6cd4b93e is described below
commit 9c6cd4b93e0427fc12bbedae8156c746cbe6cea1
Author: Hemant Kumar <[email protected]>
AuthorDate: Fri Jun 9 22:03:19 2023 -0700
Changed snapshotId to UUID (#4848)
---
.../java/org/apache/hadoop/hdds/HddsUtils.java | 23 ++
.../apache/ozone/rocksdiff/DifferSnapshotInfo.java | 15 +-
.../rocksdiff/TestRocksDBCheckpointDiffer.java | 12 +-
.../apache/hadoop/ozone/client/OzoneSnapshot.java | 23 +-
.../hadoop/ozone/om/helpers/SnapshotInfo.java | 138 +++----
.../ozone/om/helpers/TestOmSnapshotInfo.java | 25 +-
.../fs/ozone/TestSnapshotDeletingService.java | 14 +-
.../hadoop/ozone/freon/TestOMSnapshotDAG.java | 2 +-
.../ozone/om/TestOzoneManagerHASnapshot.java | 4 +-
.../src/main/proto/OmClientProtocol.proto | 8 +-
.../hadoop/ozone/om/OmMetadataManagerImpl.java | 54 ++-
.../apache/hadoop/ozone/om/OmSnapshotManager.java | 12 +-
.../apache/hadoop/ozone/om/SnapshotChainInfo.java | 45 +--
.../hadoop/ozone/om/SnapshotChainManager.java | 423 +++++++++------------
.../hadoop/ozone/om/SstFilteringService.java | 7 +-
.../request/snapshot/OMSnapshotCreateRequest.java | 34 +-
.../snapshot/OMSnapshotMoveDeletedKeysRequest.java | 17 +-
.../response/snapshot/OMSnapshotPurgeResponse.java | 55 ++-
.../ozone/om/service/SnapshotDeletingService.java | 14 +-
.../ozone/om/snapshot/SnapshotDiffManager.java | 6 +-
.../hadoop/ozone/om/TestOmSnapshotManager.java | 10 +-
.../apache/hadoop/ozone/om/TestSnapshotChain.java | 248 ++++++------
.../apache/hadoop/ozone/om/TestSnapshotInfo.java | 16 +-
.../hadoop/ozone/om/TestSstFilteringService.java | 2 +-
.../ozone/om/request/OMRequestTestUtils.java | 7 +-
.../TestOMSnapshotPurgeRequestAndResponse.java | 41 +-
.../snapshot/TestOMSnapshotCreateResponse.java | 2 +-
.../snapshot/TestOMSnapshotDeleteResponse.java | 2 +-
28 files changed, 598 insertions(+), 661 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
index e55b7340d4..b22b16ce4d 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
@@ -39,6 +39,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.TreeMap;
+import java.util.UUID;
import org.apache.hadoop.conf.ConfigRedactor;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
@@ -51,6 +52,7 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandRequestProtoOrBuilder;
import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.ha.SCMHAUtils;
import org.apache.hadoop.hdds.scm.ha.SCMNodeInfo;
@@ -849,6 +851,27 @@ public final class HddsUtils {
}
}
+ /**
+ * Transform a protobuf UUID to Java UUID.
+ */
+ public static UUID fromProtobuf(HddsProtos.UUID uuid) {
+ Objects.requireNonNull(uuid,
+ "HddsProtos.UUID can't be null to transform to java UUID.");
+ return new UUID(uuid.getMostSigBits(), uuid.getLeastSigBits());
+ }
+
+ /**
+ * Transform a Java UUID to protobuf UUID.
+ */
+ public static HddsProtos.UUID toProtobuf(UUID uuid) {
+ Objects.requireNonNull(uuid,
+ "UUID can't be null to transform to protobuf UUID.");
+ return HddsProtos.UUID.newBuilder()
+ .setMostSigBits(uuid.getMostSignificantBits())
+ .setLeastSigBits(uuid.getLeastSignificantBits())
+ .build();
+ }
+
/** Concatenate stack trace {@code elements} (one per line) starting at
* {@code startIndex}. */
public static @Nonnull String formatStackTrace(
diff --git
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
index fb82bd280f..a9f2f23bc8 100644
---
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
+++
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/DifferSnapshotInfo.java
@@ -18,21 +18,22 @@
package org.apache.ozone.rocksdiff;
import java.util.Map;
+import java.util.UUID;
/**
* Snapshot information node class for the differ.
*/
public class DifferSnapshotInfo {
private final String dbPath;
- private final String snapshotID;
+ private final UUID snapshotId;
private final long snapshotGeneration;
private final Map<String, String> tablePrefixes;
- public DifferSnapshotInfo(String db, String id, long gen,
+ public DifferSnapshotInfo(String db, UUID id, long gen,
Map<String, String> prefixes) {
dbPath = db;
- snapshotID = id;
+ snapshotId = id;
snapshotGeneration = gen;
tablePrefixes = prefixes;
}
@@ -41,8 +42,8 @@ public class DifferSnapshotInfo {
return dbPath;
}
- public String getSnapshotID() {
- return snapshotID;
+ public UUID getSnapshotId() {
+ return snapshotId;
}
public long getSnapshotGeneration() {
@@ -56,8 +57,8 @@ public class DifferSnapshotInfo {
@Override
public String toString() {
return String.format("DifferSnapshotInfo{dbPath='%s', snapshotID='%s', " +
- "snapshotGeneration=%d, tablePrefixes size=%s}",
- dbPath, snapshotID, snapshotGeneration, tablePrefixes.size());
+ "snapshotGeneration=%d, tablePrefixes size=%s}",
+ dbPath, snapshotId, snapshotGeneration, tablePrefixes.size());
}
}
diff --git
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
index a531aed071..69ceaa231c 100644
---
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
+++
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
@@ -175,13 +175,13 @@ public class TestRocksDBCheckpointDiffer {
private static Stream<Arguments> casesGetSSTDiffListWithoutDB() {
DifferSnapshotInfo snapshotInfo1 = new DifferSnapshotInfo(
- "/path/to/dbcp1", "ssUUID1", 3008L, null);
+ "/path/to/dbcp1", UUID.randomUUID(), 3008L, null);
DifferSnapshotInfo snapshotInfo2 = new DifferSnapshotInfo(
- "/path/to/dbcp2", "ssUUID2", 14980L, null);
+ "/path/to/dbcp2", UUID.randomUUID(), 14980L, null);
DifferSnapshotInfo snapshotInfo3 = new DifferSnapshotInfo(
- "/path/to/dbcp3", "ssUUID3", 17975L, null);
+ "/path/to/dbcp3", UUID.randomUUID(), 17975L, null);
DifferSnapshotInfo snapshotInfo4 = new DifferSnapshotInfo(
- "/path/to/dbcp4", "ssUUID4", 18000L, null);
+ "/path/to/dbcp4", UUID.randomUUID(), 18000L, null);
Set<String> snapshotSstFiles1 = new HashSet<>(asList(
"000059", "000053"));
@@ -432,14 +432,14 @@ public class TestRocksDBCheckpointDiffer {
final long dbLatestSequenceNumber = rocksDB.getLatestSequenceNumber();
createCheckPoint(activeDbDirName, cpPath, rocksDB);
- final String snapshotId = "snap_id_" + snapshotGeneration;
+ final UUID snapshotId = UUID.randomUUID();
final DifferSnapshotInfo currentSnapshot =
new DifferSnapshotInfo(cpPath, snapshotId, snapshotGeneration, null);
this.snapshots.add(currentSnapshot);
// Same as what OmSnapshotManager#createOmSnapshotCheckpoint would do
differ.appendSnapshotInfoToCompactionLog(dbLatestSequenceNumber,
- snapshotId,
+ snapshotId.toString(),
System.currentTimeMillis());
differ.setCurrentCompactionLog(dbLatestSequenceNumber);
diff --git
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneSnapshot.java
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneSnapshot.java
index 6ddb5854e9..91cf655090 100644
---
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneSnapshot.java
+++
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneSnapshot.java
@@ -19,6 +19,8 @@ package org.apache.hadoop.ozone.client;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo.SnapshotStatus;
+import java.util.UUID;
+
/**
* A class that encapsulates OzoneSnapshot.
*/
@@ -29,7 +31,7 @@ public class OzoneSnapshot {
private final String name;
private final long creationTime;
private final SnapshotStatus snapshotStatus;
- private final String snapshotID; // UUID
+ private final UUID snapshotId; // UUID
private final String snapshotPath; // snapshot mask
private final String checkpointDir;
@@ -40,22 +42,25 @@ public class OzoneSnapshot {
* @param name Name of the snapshot.
* @param creationTime Creation time of the snapshot.
* @param snapshotStatus Status of the snapshot.
- * @param snapshotID ID of the snapshot.
+ * @param snapshotId ID of the snapshot.
* @param snapshotPath Path of the snapshot.
* @param checkpointDir Snapshot checkpoint directory.
*/
@SuppressWarnings("parameternumber")
- public OzoneSnapshot(String volumeName, String bucketName,
- String name, long creationTime,
+ public OzoneSnapshot(String volumeName,
+ String bucketName,
+ String name,
+ long creationTime,
SnapshotStatus snapshotStatus,
- String snapshotID, String snapshotPath,
+ UUID snapshotId,
+ String snapshotPath,
String checkpointDir) {
this.volumeName = volumeName;
this.bucketName = bucketName;
this.name = name;
this.creationTime = creationTime;
this.snapshotStatus = snapshotStatus;
- this.snapshotID = snapshotID;
+ this.snapshotId = snapshotId;
this.snapshotPath = snapshotPath;
this.checkpointDir = checkpointDir;
}
@@ -110,8 +115,8 @@ public class OzoneSnapshot {
*
* @return snapshotID
*/
- public String getSnapshotID() {
- return snapshotID;
+ public UUID getSnapshotId() {
+ return snapshotId;
}
/**
@@ -138,7 +143,7 @@ public class OzoneSnapshot {
snapshotInfo.getName(),
snapshotInfo.getCreationTime(),
snapshotInfo.getSnapshotStatus(),
- snapshotInfo.getSnapshotID(),
+ snapshotInfo.getSnapshotId(),
snapshotInfo.getSnapshotPath(),
snapshotInfo.getCheckpointDir());
}
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
index 33d650a774..1be0ace8aa 100644
---
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotInfo.java
@@ -40,6 +40,8 @@ import java.util.UUID;
import java.util.Map;
import java.util.LinkedHashMap;
+import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf;
+import static org.apache.hadoop.hdds.HddsUtils.toProtobuf;
import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
/**
@@ -106,28 +108,27 @@ public final class SnapshotInfo implements Auditable {
private static final String SEPARATOR = "-";
private static final long INVALID_TIMESTAMP = -1;
- private static final String INITIAL_SNAPSHOT_ID =
- UUID.randomUUID().toString();
-
- private final String snapshotID; // UUID
+ private static final UUID INITIAL_SNAPSHOT_ID = UUID.randomUUID();
+
+ private final UUID snapshotId;
private String name;
private String volumeName;
private String bucketName;
private SnapshotStatus snapshotStatus;
private final long creationTime;
private long deletionTime;
- private String pathPreviousSnapshotID;
- private String globalPreviousSnapshotID;
+ private UUID pathPreviousSnapshotId;
+ private UUID globalPreviousSnapshotId;
private String snapshotPath; // snapshot mask
private String checkpointDir;
/**
- * RocksDB transaction sequence number at the time of checkpoint creation.
+ * RocksDB's transaction sequence number at the time of checkpoint creation.
*/
private long dbTxSequenceNumber;
/**
* Private constructor, constructed via builder.
- * @param snapshotID - Snapshot UUID.
+ * @param snapshotId - Snapshot UUID.
* @param name - snapshot name.
* @param volumeName - volume name.
* @param bucketName - bucket name.
@@ -135,33 +136,33 @@ public final class SnapshotInfo implements Auditable {
* SNAPSHOT_RECLAIMED
* @param creationTime - Snapshot creation time.
* @param deletionTime - Snapshot deletion time.
- * @param pathPreviousSnapshotID - Snapshot path previous snapshot id.
- * @param globalPreviousSnapshotID - Snapshot global previous snapshot id.
+ * @param pathPreviousSnapshotId - Snapshot path previous snapshot id.
+ * @param globalPreviousSnapshotId - Snapshot global previous snapshot id.
* @param snapshotPath - Snapshot path, bucket .snapshot path.
* @param checkpointDir - Snapshot checkpoint directory.
*/
@SuppressWarnings("checkstyle:ParameterNumber")
- private SnapshotInfo(String snapshotID,
+ private SnapshotInfo(UUID snapshotId,
String name,
String volumeName,
String bucketName,
SnapshotStatus snapshotStatus,
long creationTime,
long deletionTime,
- String pathPreviousSnapshotID,
- String globalPreviousSnapshotID,
+ UUID pathPreviousSnapshotId,
+ UUID globalPreviousSnapshotId,
String snapshotPath,
String checkpointDir,
long dbTxSequenceNumber) {
- this.snapshotID = snapshotID;
+ this.snapshotId = snapshotId;
this.name = name;
this.volumeName = volumeName;
this.bucketName = bucketName;
this.snapshotStatus = snapshotStatus;
this.creationTime = creationTime;
this.deletionTime = deletionTime;
- this.pathPreviousSnapshotID = pathPreviousSnapshotID;
- this.globalPreviousSnapshotID = globalPreviousSnapshotID;
+ this.pathPreviousSnapshotId = pathPreviousSnapshotId;
+ this.globalPreviousSnapshotId = globalPreviousSnapshotId;
this.snapshotPath = snapshotPath;
this.checkpointDir = checkpointDir;
this.dbTxSequenceNumber = dbTxSequenceNumber;
@@ -187,12 +188,12 @@ public final class SnapshotInfo implements Auditable {
this.deletionTime = delTime;
}
- public void setPathPreviousSnapshotID(String pathPreviousSnapshotID) {
- this.pathPreviousSnapshotID = pathPreviousSnapshotID;
+ public void setPathPreviousSnapshotId(UUID pathPreviousSnapshotId) {
+ this.pathPreviousSnapshotId = pathPreviousSnapshotId;
}
- public void setGlobalPreviousSnapshotID(String globalPreviousSnapshotID) {
- this.globalPreviousSnapshotID = globalPreviousSnapshotID;
+ public void setGlobalPreviousSnapshotId(UUID globalPreviousSnapshotId) {
+ this.globalPreviousSnapshotId = globalPreviousSnapshotId;
}
public void setSnapshotPath(String snapshotPath) {
@@ -203,8 +204,8 @@ public final class SnapshotInfo implements Auditable {
this.checkpointDir = checkpointDir;
}
- public String getSnapshotID() {
- return snapshotID;
+ public UUID getSnapshotId() {
+ return snapshotId;
}
public String getName() {
@@ -231,12 +232,12 @@ public final class SnapshotInfo implements Auditable {
return deletionTime;
}
- public String getPathPreviousSnapshotID() {
- return pathPreviousSnapshotID;
+ public UUID getPathPreviousSnapshotId() {
+ return pathPreviousSnapshotId;
}
- public String getGlobalPreviousSnapshotID() {
- return globalPreviousSnapshotID;
+ public UUID getGlobalPreviousSnapshotId() {
+ return globalPreviousSnapshotId;
}
public String getSnapshotPath() {
@@ -254,15 +255,15 @@ public final class SnapshotInfo implements Auditable {
public SnapshotInfo.Builder toBuilder() {
return new SnapshotInfo.Builder()
- .setSnapshotID(snapshotID)
+ .setSnapshotId(snapshotId)
.setName(name)
.setVolumeName(volumeName)
.setBucketName(bucketName)
.setSnapshotStatus(snapshotStatus)
.setCreationTime(creationTime)
.setDeletionTime(deletionTime)
- .setPathPreviousSnapshotID(pathPreviousSnapshotID)
- .setGlobalPreviousSnapshotID(globalPreviousSnapshotID)
+ .setPathPreviousSnapshotId(pathPreviousSnapshotId)
+ .setGlobalPreviousSnapshotId(globalPreviousSnapshotId)
.setSnapshotPath(snapshotPath)
.setCheckpointDir(checkpointDir);
}
@@ -271,15 +272,15 @@ public final class SnapshotInfo implements Auditable {
* Builder of SnapshotInfo.
*/
public static class Builder {
- private String snapshotID;
+ private UUID snapshotId;
private String name;
private String volumeName;
private String bucketName;
private SnapshotStatus snapshotStatus;
private long creationTime;
private long deletionTime;
- private String pathPreviousSnapshotID;
- private String globalPreviousSnapshotID;
+ private UUID pathPreviousSnapshotId;
+ private UUID globalPreviousSnapshotId;
private String snapshotPath;
private String checkpointDir;
private long dbTxSequenceNumber;
@@ -289,8 +290,8 @@ public final class SnapshotInfo implements Auditable {
this.snapshotStatus = SnapshotStatus.DEFAULT;
}
- public Builder setSnapshotID(String snapshotID) {
- this.snapshotID = snapshotID;
+ public Builder setSnapshotId(UUID snapshotId) {
+ this.snapshotId = snapshotId;
return this;
}
@@ -324,14 +325,13 @@ public final class SnapshotInfo implements Auditable {
return this;
}
- public Builder setPathPreviousSnapshotID(String pathPreviousSnapshotID) {
- this.pathPreviousSnapshotID = pathPreviousSnapshotID;
+ public Builder setPathPreviousSnapshotId(UUID pathPreviousSnapshotId) {
+ this.pathPreviousSnapshotId = pathPreviousSnapshotId;
return this;
}
- public Builder setGlobalPreviousSnapshotID(
- String globalPreviousSnapshotID) {
- this.globalPreviousSnapshotID = globalPreviousSnapshotID;
+ public Builder setGlobalPreviousSnapshotId(UUID globalPreviousSnapshotId) {
+ this.globalPreviousSnapshotId = globalPreviousSnapshotId;
return this;
}
@@ -353,15 +353,15 @@ public final class SnapshotInfo implements Auditable {
public SnapshotInfo build() {
Preconditions.checkNotNull(name);
return new SnapshotInfo(
- snapshotID,
+ snapshotId,
name,
volumeName,
bucketName,
snapshotStatus,
creationTime,
deletionTime,
- pathPreviousSnapshotID,
- globalPreviousSnapshotID,
+ pathPreviousSnapshotId,
+ globalPreviousSnapshotId,
snapshotPath,
checkpointDir,
dbTxSequenceNumber
@@ -375,7 +375,7 @@ public final class SnapshotInfo implements Auditable {
public OzoneManagerProtocolProtos.SnapshotInfo getProtobuf() {
OzoneManagerProtocolProtos.SnapshotInfo.Builder sib =
OzoneManagerProtocolProtos.SnapshotInfo.newBuilder()
- .setSnapshotID(snapshotID)
+ .setSnapshotID(toProtobuf(snapshotId))
.setName(name)
.setVolumeName(volumeName)
.setBucketName(bucketName)
@@ -383,12 +383,12 @@ public final class SnapshotInfo implements Auditable {
.setCreationTime(creationTime)
.setDeletionTime(deletionTime);
- if (pathPreviousSnapshotID != null) {
- sib.setPathPreviousSnapshotID(pathPreviousSnapshotID);
+ if (pathPreviousSnapshotId != null) {
+ sib.setPathPreviousSnapshotID(toProtobuf(pathPreviousSnapshotId));
}
- if (globalPreviousSnapshotID != null) {
- sib.setGlobalPreviousSnapshotID(globalPreviousSnapshotID);
+ if (globalPreviousSnapshotId != null) {
+ sib.setGlobalPreviousSnapshotID(toProtobuf(globalPreviousSnapshotId));
}
sib.setSnapshotPath(snapshotPath)
@@ -404,8 +404,9 @@ public final class SnapshotInfo implements Auditable {
*/
public static SnapshotInfo getFromProtobuf(
OzoneManagerProtocolProtos.SnapshotInfo snapshotInfoProto) {
+
SnapshotInfo.Builder osib = SnapshotInfo.newBuilder()
- .setSnapshotID(snapshotInfoProto.getSnapshotID())
+ .setSnapshotId(fromProtobuf(snapshotInfoProto.getSnapshotID()))
.setName(snapshotInfoProto.getName())
.setVolumeName(snapshotInfoProto.getVolumeName())
.setBucketName(snapshotInfoProto.getBucketName())
@@ -415,13 +416,13 @@ public final class SnapshotInfo implements Auditable {
.setDeletionTime(snapshotInfoProto.getDeletionTime());
if (snapshotInfoProto.hasPathPreviousSnapshotID()) {
- osib.setPathPreviousSnapshotID(snapshotInfoProto.
- getPathPreviousSnapshotID());
+ osib.setPathPreviousSnapshotId(
+ fromProtobuf(snapshotInfoProto.getPathPreviousSnapshotID()));
}
if (snapshotInfoProto.hasGlobalPreviousSnapshotID()) {
- osib.setGlobalPreviousSnapshotID(snapshotInfoProto.
- getGlobalPreviousSnapshotID());
+ osib.setGlobalPreviousSnapshotId(
+ fromProtobuf(snapshotInfoProto.getGlobalPreviousSnapshotID()));
}
osib.setSnapshotPath(snapshotInfoProto.getSnapshotPath())
@@ -443,14 +444,16 @@ public final class SnapshotInfo implements Auditable {
/**
* Get the name of the checkpoint directory.
*/
- public static String getCheckpointDirName(String snapshotId) {
+ public static String getCheckpointDirName(UUID snapshotId) {
+ Objects.requireNonNull(snapshotId,
+ "SnapshotId is needed to create checkpoint directory");
return SEPARATOR + snapshotId;
}
/**
* Get the name of the checkpoint directory, (non-static).
*/
public String getCheckpointDirName() {
- return getCheckpointDirName(getSnapshotID());
+ return getCheckpointDirName(getSnapshotId());
}
public long getDbTxSequenceNumber() {
@@ -492,22 +495,25 @@ public final class SnapshotInfo implements Auditable {
public static SnapshotInfo newInstance(String volumeName,
String bucketName,
String snapshotName,
- String snapshotId,
+ UUID snapshotId,
long creationTime) {
SnapshotInfo.Builder builder = new SnapshotInfo.Builder();
if (StringUtils.isBlank(snapshotName)) {
snapshotName = generateName(creationTime);
}
- builder.setSnapshotID(snapshotId)
+ builder.setSnapshotId(snapshotId)
.setName(snapshotName)
.setCreationTime(creationTime)
.setDeletionTime(INVALID_TIMESTAMP)
- .setPathPreviousSnapshotID(INITIAL_SNAPSHOT_ID)
- .setGlobalPreviousSnapshotID(INITIAL_SNAPSHOT_ID)
+ .setPathPreviousSnapshotId(INITIAL_SNAPSHOT_ID)
+ .setGlobalPreviousSnapshotId(INITIAL_SNAPSHOT_ID)
.setSnapshotPath(volumeName + OM_KEY_PREFIX + bucketName)
.setVolumeName(volumeName)
- .setBucketName(bucketName)
- .setCheckpointDir(getCheckpointDirName(snapshotId));
+ .setBucketName(bucketName);
+
+ if (snapshotId != null) {
+ builder.setCheckpointDir(getCheckpointDirName(snapshotId));
+ }
return builder.build();
}
@@ -522,22 +528,22 @@ public final class SnapshotInfo implements Auditable {
SnapshotInfo that = (SnapshotInfo) o;
return creationTime == that.creationTime &&
deletionTime == that.deletionTime &&
- snapshotID.equals(that.snapshotID) &&
+ snapshotId.equals(that.snapshotId) &&
name.equals(that.name) && volumeName.equals(that.volumeName) &&
bucketName.equals(that.bucketName) &&
snapshotStatus == that.snapshotStatus &&
- Objects.equals(pathPreviousSnapshotID, that.pathPreviousSnapshotID) &&
+ Objects.equals(pathPreviousSnapshotId, that.pathPreviousSnapshotId) &&
Objects.equals(
- globalPreviousSnapshotID, that.globalPreviousSnapshotID) &&
+ globalPreviousSnapshotId, that.globalPreviousSnapshotId) &&
snapshotPath.equals(that.snapshotPath) &&
checkpointDir.equals(that.checkpointDir);
}
@Override
public int hashCode() {
- return Objects.hash(snapshotID, name, volumeName, bucketName,
+ return Objects.hash(snapshotId, name, volumeName, bucketName,
snapshotStatus,
- creationTime, deletionTime, pathPreviousSnapshotID,
- globalPreviousSnapshotID, snapshotPath, checkpointDir);
+ creationTime, deletionTime, pathPreviousSnapshotId,
+ globalPreviousSnapshotId, snapshotPath, checkpointDir);
}
}
diff --git
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
index 4fd9e2335c..c081c11a66 100644
---
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
+++
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmSnapshotInfo.java
@@ -29,13 +29,15 @@ import org.junit.Assert;
import java.util.UUID;
+import static org.apache.hadoop.hdds.HddsUtils.toProtobuf;
+
/**
* Tests SnapshotInfo metadata data structure holding state info for
* object storage snapshots.
*/
public class TestOmSnapshotInfo {
- private static final String SNAPSHOT_ID = UUID.randomUUID().toString();
+ private static final UUID SNAPSHOT_ID = UUID.randomUUID();
private static final String NAME = "snapshot1";
private static final String VOLUME_NAME = "vol1";
private static final String BUCKET_NAME = "bucket1";
@@ -43,9 +45,8 @@ public class TestOmSnapshotInfo {
SnapshotStatus.SNAPSHOT_ACTIVE;
private static final long CREATION_TIME = Time.now();
private static final long DELETION_TIME = -1;
- private static final String PATH_PREVIOUS_SNAPSHOT_ID =
- UUID.randomUUID().toString();
- private static final String GLOBAL_PREVIOUS_SNAPSHOT_ID =
+ private static final UUID PATH_PREVIOUS_SNAPSHOT_ID = UUID.randomUUID();
+ private static final UUID GLOBAL_PREVIOUS_SNAPSHOT_ID =
PATH_PREVIOUS_SNAPSHOT_ID;
private static final String SNAPSHOT_PATH = "test/path";
private static final String CHECKPOINT_DIR = "checkpoint.testdir";
@@ -53,15 +54,15 @@ public class TestOmSnapshotInfo {
private SnapshotInfo createSnapshotInfo() {
return new SnapshotInfo.Builder()
- .setSnapshotID(SNAPSHOT_ID)
+ .setSnapshotId(SNAPSHOT_ID)
.setName(NAME)
.setVolumeName(VOLUME_NAME)
.setBucketName(BUCKET_NAME)
.setSnapshotStatus(SNAPSHOT_STATUS)
.setCreationTime(CREATION_TIME)
.setDeletionTime(DELETION_TIME)
- .setPathPreviousSnapshotID(PATH_PREVIOUS_SNAPSHOT_ID)
- .setGlobalPreviousSnapshotID(GLOBAL_PREVIOUS_SNAPSHOT_ID)
+ .setPathPreviousSnapshotId(PATH_PREVIOUS_SNAPSHOT_ID)
+ .setGlobalPreviousSnapshotId(GLOBAL_PREVIOUS_SNAPSHOT_ID)
.setSnapshotPath(SNAPSHOT_PATH)
.setCheckpointDir(CHECKPOINT_DIR)
.setDbTxSequenceNumber(DB_TX_SEQUENCE_NUMBER)
@@ -70,15 +71,15 @@ public class TestOmSnapshotInfo {
private OzoneManagerProtocolProtos.SnapshotInfo createSnapshotInfoProto() {
return OzoneManagerProtocolProtos.SnapshotInfo.newBuilder()
- .setSnapshotID(SNAPSHOT_ID)
+ .setSnapshotID(toProtobuf(SNAPSHOT_ID))
.setName(NAME)
.setVolumeName(VOLUME_NAME)
.setBucketName(BUCKET_NAME)
.setSnapshotStatus(SnapshotStatusProto.SNAPSHOT_ACTIVE)
.setCreationTime(CREATION_TIME)
.setDeletionTime(DELETION_TIME)
- .setPathPreviousSnapshotID(PATH_PREVIOUS_SNAPSHOT_ID)
- .setGlobalPreviousSnapshotID(GLOBAL_PREVIOUS_SNAPSHOT_ID)
+ .setPathPreviousSnapshotID(toProtobuf(PATH_PREVIOUS_SNAPSHOT_ID))
+ .setGlobalPreviousSnapshotID(toProtobuf(GLOBAL_PREVIOUS_SNAPSHOT_ID))
.setSnapshotPath(SNAPSHOT_PATH)
.setCheckpointDir(CHECKPOINT_DIR)
.setDbTxSequenceNumber(DB_TX_SEQUENCE_NUMBER)
@@ -124,8 +125,8 @@ public class TestOmSnapshotInfo {
SnapshotInfo snapshotInfoActual = SnapshotInfo
.getFromProtobuf(snapshotInfoEntry);
- Assert.assertEquals(snapshotInfoExpected.getSnapshotID(),
- snapshotInfoActual.getSnapshotID());
+ Assert.assertEquals(snapshotInfoExpected.getSnapshotId(),
+ snapshotInfoActual.getSnapshotId());
Assert.assertEquals(snapshotInfoExpected.getName(),
snapshotInfoActual.getName());
Assert.assertEquals(snapshotInfoExpected.getVolumeName(),
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestSnapshotDeletingService.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestSnapshotDeletingService.java
index 1f2a1b657e..7f884ba64d 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestSnapshotDeletingService.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestSnapshotDeletingService.java
@@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -427,9 +428,10 @@ public class TestSnapshotDeletingService {
throws Exception {
OmMetadataManagerImpl metadataManager = (OmMetadataManagerImpl)
om.getMetadataManager();
- String pathPreviousSnapshotID =
deletedSnapshot.getPathPreviousSnapshotID();
- String globalPreviousSnapshotID = deletedSnapshot
- .getGlobalPreviousSnapshotID();
+ UUID pathPreviousSnapshotId = deletedSnapshot.getPathPreviousSnapshotId();
+ UUID globalPreviousSnapshotId =
+ deletedSnapshot.getGlobalPreviousSnapshotId();
+
GenericTestUtils.waitFor(() -> {
try {
SnapshotInfo snapshotInfo = metadataManager.getSnapshotInfoTable()
@@ -445,9 +447,9 @@ public class TestSnapshotDeletingService {
SnapshotInfo nextSnapshotInfo = metadataManager
.getSnapshotInfoTable().get(nextSnapshot);
GenericTestUtils.waitFor(() -> Objects.equals(
- nextSnapshotInfo.getPathPreviousSnapshotID(), pathPreviousSnapshotID)
- && Objects.equals(nextSnapshotInfo.getGlobalPreviousSnapshotID(),
- globalPreviousSnapshotID), 100, 10000);
+ nextSnapshotInfo.getPathPreviousSnapshotId(), pathPreviousSnapshotId)
+ && Objects.equals(nextSnapshotInfo.getGlobalPreviousSnapshotId(),
+ globalPreviousSnapshotId), 100, 10000);
}
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
index d8222ce8c0..7ed6eace55 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java
@@ -150,7 +150,7 @@ public class TestOMSnapshotDAG {
// Use RocksDB transaction sequence number in SnapshotInfo, which is
// persisted at the time of snapshot creation, as the snapshot generation
- return new DifferSnapshotInfo(checkpointPath, snapshotInfo.getSnapshotID(),
+ return new DifferSnapshotInfo(checkpointPath, snapshotInfo.getSnapshotId(),
snapshotInfo.getDbTxSequenceNumber(),
getTablePrefixes(omMetadataManager, volumeName, bucketName));
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHASnapshot.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHASnapshot.java
index 960633c32a..b294707e2f 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHASnapshot.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHASnapshot.java
@@ -161,7 +161,7 @@ public class TestOzoneManagerHASnapshot {
store.createSnapshot(volumeName, bucketName, snapshotName);
List<OzoneManager> ozoneManagers = cluster.getOzoneManagersList();
- List<String> snapshotIds = new ArrayList<>();
+ List<UUID> snapshotIds = new ArrayList<>();
for (OzoneManager ozoneManager : ozoneManagers) {
await().atMost(Duration.ofSeconds(120))
@@ -178,7 +178,7 @@ public class TestOzoneManagerHASnapshot {
}
if (snapshotInfo != null) {
- snapshotIds.add(snapshotInfo.getSnapshotID());
+ snapshotIds.add(snapshotInfo.getSnapshotId());
}
return snapshotInfo != null;
});
diff --git
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index f77cbbb007..9e7fa19a33 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -786,15 +786,15 @@ enum SnapshotStatusProto {
* SnapshotInfo table entry for Bucket/Volume snapshot metadata
*/
message SnapshotInfo {
- optional string snapshotID = 1;
+ optional hadoop.hdds.UUID snapshotID = 1;
optional string name = 2;
optional string volumeName = 3;
optional string bucketName = 4;
optional SnapshotStatusProto snapshotStatus = 5;
optional uint64 creationTime = 6;
optional uint64 deletionTime = 7;
- optional string pathPreviousSnapshotID = 8;
- optional string globalPreviousSnapshotID = 9;
+ optional hadoop.hdds.UUID pathPreviousSnapshotID = 8;
+ optional hadoop.hdds.UUID globalPreviousSnapshotID = 9;
optional string snapshotPath = 10;
optional string checkpointDir = 11;
optional int64 dbTxSequenceNumber = 12;
@@ -1701,7 +1701,7 @@ message CreateSnapshotRequest {
optional string volumeName = 1;
optional string bucketName = 2;
optional string snapshotName = 3;
- optional string snapshotId = 4;
+ optional hadoop.hdds.UUID snapshotId = 4;
optional uint64 creationTime = 5;
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index 1f122f6eeb..f6519bb098 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -27,9 +27,12 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.UUID;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -1117,8 +1120,8 @@ public class OmMetadataManagerImpl implements
OMMetadataManager,
result.add(omBucketInfo);
currentCount++;
} else if (
- StringUtils.isNotEmpty(
- snapshotChainManager.getLatestPathSnapshot(volumeName +
+ Objects.nonNull(
+ snapshotChainManager.getLatestPathSnapshotId(volumeName +
OM_KEY_PREFIX + omBucketInfo.getBucketName()))) {
// Snapshot filter on.
// Add to result list only when the bucket has at least one
snapshot
@@ -1618,37 +1621,46 @@ public class OmMetadataManagerImpl implements
OMMetadataManager,
OmSnapshotManager snapshotManager)
throws IOException {
+
String snapshotPath = volumeName + OM_KEY_PREFIX + bucketName;
- String latestPathSnapshot = snapshotChainManager
- .getLatestPathSnapshot(snapshotPath);
+ Optional<UUID> latestPathSnapshot = Optional.ofNullable(
+ snapshotChainManager.getLatestPathSnapshotId(snapshotPath));
+
+ Optional<SnapshotInfo> snapshotInfo = Optional.empty();
+
+ while (latestPathSnapshot.isPresent()) {
+ Optional<String> snapTableKey = latestPathSnapshot
+ .map(uuid -> snapshotChainManager.getTableKey(uuid));
- SnapshotInfo snapInfo = null;
- while (latestPathSnapshot != null) {
- String snapTableKey = snapshotChainManager
- .getTableKey(latestPathSnapshot);
- snapInfo = getSnapshotInfoTable().get(snapTableKey);
+ snapshotInfo = snapTableKey.isPresent() ?
+ Optional.ofNullable(getSnapshotInfoTable().get(snapTableKey.get())) :
+ Optional.empty();
- if (snapInfo != null && snapInfo.getSnapshotStatus() ==
+ if (snapshotInfo.isPresent() && snapshotInfo.get().getSnapshotStatus() ==
SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE) {
break;
}
// Update latestPathSnapshot if current snapshot is deleted.
- if (snapshotChainManager.hasPreviousPathSnapshot(
- snapshotPath, latestPathSnapshot)) {
- latestPathSnapshot = snapshotChainManager
- .previousPathSnapshot(snapshotPath, latestPathSnapshot);
+ if (snapshotChainManager.hasPreviousPathSnapshot(snapshotPath,
+ latestPathSnapshot.get())) {
+ latestPathSnapshot = Optional.ofNullable(snapshotChainManager
+ .previousPathSnapshot(snapshotPath, latestPathSnapshot.get()));
} else {
- latestPathSnapshot = null;
+ latestPathSnapshot = Optional.empty();
}
}
- OmSnapshot omSnapshot = null;
- if (snapInfo != null) {
- omSnapshot = (OmSnapshot) snapshotManager.checkForSnapshot(volumeName,
- bucketName, getSnapshotPrefix(snapInfo.getName()), true);
- }
- return omSnapshot;
+ Optional<OmSnapshot> omSnapshot = snapshotInfo.isPresent() ?
+ Optional.ofNullable(
+ (OmSnapshot) snapshotManager.checkForSnapshot(volumeName,
+ bucketName,
+ getSnapshotPrefix(snapshotInfo.get().getName()),
+ true)
+ ) :
+ Optional.empty();
+
+ return omSnapshot.orElse(null);
}
@Override
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
index 537e9c712f..cdd39ead34 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
@@ -416,10 +416,12 @@ public final class OmSnapshotManager implements
AutoCloseable {
if (dbCpDiffer != null) {
final long dbLatestSequenceNumber = snapshotInfo.getDbTxSequenceNumber();
+ Objects.requireNonNull(snapshotInfo.getSnapshotId(),
+ "SnapshotId is null for snapshot: " + snapshotInfo.getName());
// Write snapshot generation (latest sequence number) to compaction log.
// This will be used for DAG reconstruction as snapshotGeneration.
dbCpDiffer.appendSnapshotInfoToCompactionLog(dbLatestSequenceNumber,
- snapshotInfo.getSnapshotID(),
+ snapshotInfo.getSnapshotId().toString(),
snapshotInfo.getCreationTime());
// Set compaction log filename to the latest DB sequence number
@@ -586,18 +588,18 @@ public final class OmSnapshotManager implements
AutoCloseable {
// one by one.
}
- // Get OmSnapshot if the keyname has ".snapshot" key indicator
+ // Get OmSnapshot if the keyName has ".snapshot" key indicator
public IOmMetadataReader checkForSnapshot(String volumeName,
String bucketName,
- String keyname,
+ String keyName,
boolean skipActiveCheck)
throws IOException {
- if (keyname == null || !ozoneManager.isFilesystemSnapshotEnabled()) {
+ if (keyName == null || !ozoneManager.isFilesystemSnapshotEnabled()) {
return ozoneManager.getOmMetadataReader();
}
// see if key is for a snapshot
- String[] keyParts = keyname.split("/");
+ String[] keyParts = keyName.split("/");
if (isSnapshotKey(keyParts)) {
String snapshotName = keyParts[1];
if (snapshotName == null || snapshotName.isEmpty()) {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainInfo.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainInfo.java
index 7d4d5165db..239ed9be64 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainInfo.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainInfo.java
@@ -17,43 +17,44 @@
package org.apache.hadoop.ozone.om;
import java.util.Objects;
+import java.util.UUID;
/**
* SnapshotChain supporting SnapshotInfo class.
- *
+ * <p>
* Defines and provides the interface to the SnapshotChainInfo
* entry that comprises a SnapshotChain.
* Getters / setters for current, prev, next element in snapshot chain.
*/
public class SnapshotChainInfo {
- private String snapshotID;
- private String previousSnapshotID;
- private String nextSnapshotID;
+ private final UUID snapshotId;
+ private UUID previousSnapshotId;
+ private UUID nextSnapshotId;
- public SnapshotChainInfo(String snapshotID, String prev, String next) {
- this.snapshotID = snapshotID;
- previousSnapshotID = prev;
- nextSnapshotID = next;
+ public SnapshotChainInfo(UUID snapshotID, UUID prev, UUID next) {
+ this.snapshotId = snapshotID;
+ this.previousSnapshotId = prev;
+ this.nextSnapshotId = next;
}
- public void setNextSnapshotID(String snapsID) {
- nextSnapshotID = snapsID;
+ public void setNextSnapshotId(UUID snapsID) {
+ nextSnapshotId = snapsID;
}
- public void setPreviousSnapshotID(String snapsID) {
- previousSnapshotID = snapsID;
+ public void setPreviousSnapshotId(UUID snapsID) {
+ previousSnapshotId = snapsID;
}
- public String getSnapshotID() {
- return snapshotID;
+ public UUID getSnapshotId() {
+ return snapshotId;
}
- public String getNextSnapshotID() {
- return nextSnapshotID;
+ public UUID getNextSnapshotId() {
+ return nextSnapshotId;
}
- public String getPreviousSnapshotID() {
- return previousSnapshotID;
+ public UUID getPreviousSnapshotId() {
+ return previousSnapshotId;
}
@Override
@@ -65,13 +66,13 @@ public class SnapshotChainInfo {
return false;
}
SnapshotChainInfo that = (SnapshotChainInfo) o;
- return Objects.equals(snapshotID, that.snapshotID) &&
- Objects.equals(previousSnapshotID, that.previousSnapshotID) &&
- Objects.equals(nextSnapshotID, that.nextSnapshotID);
+ return Objects.equals(snapshotId, that.snapshotId) &&
+ Objects.equals(previousSnapshotId, that.previousSnapshotId) &&
+ Objects.equals(nextSnapshotId, that.nextSnapshotId);
}
@Override
public int hashCode() {
- return Objects.hash(snapshotID, previousSnapshotID, nextSnapshotID);
+ return Objects.hash(snapshotId, previousSnapshotId, nextSnapshotId);
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
index dad450328f..0e343631f6 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SnapshotChainManager.java
@@ -20,16 +20,18 @@ import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.TableIterator;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
-import java.util.HashMap;
+import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.NoSuchElementException;
-import java.util.LinkedHashMap;
import java.util.TreeMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
/**
* This class is used for creating and accessing Snapshot Chains.
@@ -47,222 +49,198 @@ public class SnapshotChainManager {
private static final Logger LOG =
LoggerFactory.getLogger(SnapshotChainManager.class);
- private final LinkedHashMap<String, SnapshotChainInfo> snapshotChainGlobal;
- private final Map<String, LinkedHashMap<String, SnapshotChainInfo>>
- snapshotChainPath;
- private String latestGlobalSnapshotID;
- private final Map<String, String> latestPathSnapshotID;
- private final Map<String, String> snapshotIdToTableKey;
+ private final Map<UUID, SnapshotChainInfo> globalSnapshotChain;
+ private final ConcurrentMap<String, LinkedHashMap<UUID, SnapshotChainInfo>>
+ snapshotChainByPath;
+ private final ConcurrentMap<String, UUID> latestSnapshotIdByPath;
+ private final ConcurrentMap<UUID, String> snapshotIdToTableKey;
+ private UUID latestGlobalSnapshotId;
public SnapshotChainManager(OMMetadataManager metadataManager)
throws IOException {
- snapshotChainGlobal = new LinkedHashMap<>();
- snapshotChainPath = new HashMap<>();
- latestPathSnapshotID = new HashMap<>();
- snapshotIdToTableKey = new HashMap<>();
- latestGlobalSnapshotID = null;
+ globalSnapshotChain = Collections.synchronizedMap(new LinkedHashMap<>());
+ snapshotChainByPath = new ConcurrentHashMap<>();
+ latestSnapshotIdByPath = new ConcurrentHashMap<>();
+ snapshotIdToTableKey = new ConcurrentHashMap<>();
+ latestGlobalSnapshotId = null;
loadFromSnapshotInfoTable(metadataManager);
}
/**
* Add snapshot to global snapshot chain.
*/
- private void addSnapshotGlobal(String snapshotID,
- String prevGlobalID) throws IOException {
- // set previous snapshotID to null if it is "" for
- // internal in-mem structure
- if (prevGlobalID != null && prevGlobalID.isEmpty()) {
- prevGlobalID = null;
- }
- // on add snapshot; set previous snapshot entry nextSnapshotID =
- // snapshotID
- if (prevGlobalID != null &&
- snapshotChainGlobal.containsKey(prevGlobalID)) {
- snapshotChainGlobal
- .get(prevGlobalID)
- .setNextSnapshotID(snapshotID);
+ private void addSnapshotGlobal(UUID snapshotID,
+ UUID prevGlobalID) throws IOException {
+ // On add snapshot, set previous snapshot entry nextSnapshotID = snapshotID
+ if (prevGlobalID != null && globalSnapshotChain.containsKey(prevGlobalID))
{
+ globalSnapshotChain.get(prevGlobalID).setNextSnapshotId(snapshotID);
}
+
if (prevGlobalID != null &&
- !snapshotChainGlobal.containsKey(prevGlobalID)) {
+ !globalSnapshotChain.containsKey(prevGlobalID)) {
throw new IOException(String.format("Snapshot chain corruption. " +
- "Previous snapshotId: %s is set for snapshotId: %s but no " +
- "associated snapshot found in snapshot chain.", prevGlobalID,
+ "Previous snapshotId: %s is set for snapshotId: %s but no " +
+ "associated snapshot found in snapshot chain.", prevGlobalID,
snapshotID));
}
- snapshotChainGlobal.put(snapshotID,
+ globalSnapshotChain.put(snapshotID,
new SnapshotChainInfo(snapshotID, prevGlobalID, null));
// set state variable latestGlobal snapshot entry to this snapshotID
- latestGlobalSnapshotID = snapshotID;
+ latestGlobalSnapshotId = snapshotID;
}
/**
* Add snapshot to bucket snapshot chain(path based).
*/
private void addSnapshotPath(String snapshotPath,
- String snapshotID,
- String prevPathID) throws IOException {
- // set previous snapshotID to null if it is "" for
- // internal in-mem structure
- if (prevPathID != null && prevPathID.isEmpty()) {
- prevPathID = null;
- }
-
- // on add snapshot; set previous snapshot entry nextSnapshotID =
- // snapshotID
+ UUID snapshotID,
+ UUID prevPathID) throws IOException {
+ // On add snapshot, set previous snapshot entry nextSnapshotId = snapshotId
if (prevPathID != null &&
- ((!snapshotChainPath
- .containsKey(snapshotPath)) ||
- (!snapshotChainPath
- .get(snapshotPath)
- .containsKey(prevPathID)))) {
+ ((!snapshotChainByPath.containsKey(snapshotPath)) ||
+ (!snapshotChainByPath.get(snapshotPath).containsKey(prevPathID))))
{
throw new IOException(String.format("Snapshot chain corruption. " +
"Previous snapshotId: %s is set for snapshotId: %s but no " +
"associated snapshot found in snapshot chain.", prevPathID,
snapshotID));
}
- if (prevPathID != null &&
- snapshotChainPath.containsKey(snapshotPath)) {
- snapshotChainPath
+ if (prevPathID != null && snapshotChainByPath.containsKey(snapshotPath)) {
+ snapshotChainByPath
.get(snapshotPath)
.get(prevPathID)
- .setNextSnapshotID(snapshotID);
+ .setNextSnapshotId(snapshotID);
}
- if (!snapshotChainPath.containsKey(snapshotPath)) {
- snapshotChainPath.put(snapshotPath, new LinkedHashMap<>());
+ if (!snapshotChainByPath.containsKey(snapshotPath)) {
+ snapshotChainByPath.put(snapshotPath, new LinkedHashMap<>());
}
- snapshotChainPath
- .get(snapshotPath)
- .put(snapshotID,
- new SnapshotChainInfo(snapshotID, prevPathID, null));
+ snapshotChainByPath.get(snapshotPath)
+ .put(snapshotID, new SnapshotChainInfo(snapshotID, prevPathID, null));
// set state variable latestPath snapshot entry to this snapshotID
- latestPathSnapshotID.put(snapshotPath, snapshotID);
+ latestSnapshotIdByPath.put(snapshotPath, snapshotID);
}
- private boolean deleteSnapshotGlobal(String snapshotID) throws IOException {
- boolean status = true;
- if (snapshotChainGlobal.containsKey(snapshotID)) {
+ private boolean deleteSnapshotGlobal(UUID snapshotID) throws IOException {
+ if (globalSnapshotChain.containsKey(snapshotID)) {
// reset prev and next snapshot entries in chain ordered list
// for node removal
- String next = snapshotChainGlobal.get(snapshotID).getNextSnapshotID();
- String prev =
snapshotChainGlobal.get(snapshotID).getPreviousSnapshotID();
+ UUID next = globalSnapshotChain.get(snapshotID).getNextSnapshotId();
+ UUID prev = globalSnapshotChain.get(snapshotID).getPreviousSnapshotId();
- if (prev != null && !snapshotChainGlobal.containsKey(prev)) {
+ if (prev != null && !globalSnapshotChain.containsKey(prev)) {
throw new IOException(String.format("Snapshot chain corruption. " +
"SnapshotId: %s to be deleted has previous snapshotId: %s " +
"but associated snapshot is not found in snapshot chain.",
snapshotID, prev));
}
- if (next != null && !snapshotChainGlobal.containsKey(next)) {
+ if (next != null && !globalSnapshotChain.containsKey(next)) {
throw new IOException(String.format("Snapshot chain corruption. " +
"SnapshotId: {%s} to be deleted has next snapshotId: %s " +
"but associated snapshot is not found in snapshot chain.",
snapshotID, next));
}
- snapshotChainGlobal.remove(snapshotID);
+ globalSnapshotChain.remove(snapshotID);
if (next != null) {
- snapshotChainGlobal.get(next).setPreviousSnapshotID(prev);
+ globalSnapshotChain.get(next).setPreviousSnapshotId(prev);
}
if (prev != null) {
- snapshotChainGlobal.get(prev).setNextSnapshotID(next);
+ globalSnapshotChain.get(prev).setNextSnapshotId(next);
}
// remove from latest list if necessary
- if (latestGlobalSnapshotID.equals(snapshotID)) {
- latestGlobalSnapshotID = prev;
+ if (latestGlobalSnapshotId.equals(snapshotID)) {
+ latestGlobalSnapshotId = prev;
}
+ return true;
} else {
// snapshotID not found in snapshot chain, log warning and return
LOG.warn("Snapshot chain corruption. SnapshotID: {} is not found in " +
"snapshot chain.", snapshotID);
- status = false;
+ return false;
}
-
- return status;
}
private boolean deleteSnapshotPath(String snapshotPath,
- String snapshotID) throws IOException {
- if (snapshotChainPath.containsKey(snapshotPath) &&
- snapshotChainPath.get(snapshotPath).containsKey(snapshotID)) {
+ UUID snapshotId) throws IOException {
+ if (snapshotChainByPath.containsKey(snapshotPath) &&
+ snapshotChainByPath.get(snapshotPath).containsKey(snapshotId)) {
// reset prev and next snapshot entries in chain ordered list
// for node removal
- String nextSnapshotID = snapshotChainPath
+ UUID nextSnapshotId = snapshotChainByPath
.get(snapshotPath)
- .get(snapshotID)
- .getNextSnapshotID();
- String previousSnapshotID = snapshotChainPath
+ .get(snapshotId)
+ .getNextSnapshotId();
+ UUID previousSnapshotId = snapshotChainByPath
.get(snapshotPath)
- .get(snapshotID)
- .getPreviousSnapshotID();
+ .get(snapshotId)
+ .getPreviousSnapshotId();
- if (previousSnapshotID != null &&
- !snapshotChainPath.get(snapshotPath)
- .containsKey(previousSnapshotID)) {
+ if (previousSnapshotId != null &&
+ !snapshotChainByPath.get(snapshotPath)
+ .containsKey(previousSnapshotId)) {
throw new IOException(String.format("Snapshot chain corruption. " +
"SnapshotId: %s at snapshotPath: %s to be deleted has " +
"previous snapshotId: %s but associated snapshot is not " +
- "found in snapshot chain.", snapshotID, snapshotPath,
- previousSnapshotID));
+ "found in snapshot chain.", snapshotId, snapshotPath,
+ previousSnapshotId));
}
- if (nextSnapshotID != null && !snapshotChainPath.get(snapshotPath)
- .containsKey(nextSnapshotID)) {
+ if (nextSnapshotId != null && !snapshotChainByPath.get(snapshotPath)
+ .containsKey(nextSnapshotId)) {
throw new IOException(String.format("Snapshot chain corruption. " +
"SnapshotId: %s at snapshotPath: %s to be deleted has next " +
"snapshotId: %s but associated snapshot is not found in " +
- "snapshot chain.", snapshotID, snapshotPath,
- nextSnapshotID));
+ "snapshot chain.", snapshotId, snapshotPath,
+ nextSnapshotId));
}
- snapshotChainPath.get(snapshotPath).remove(snapshotID);
- if (nextSnapshotID != null) {
- snapshotChainPath.get(snapshotPath)
- .get(nextSnapshotID)
- .setPreviousSnapshotID(previousSnapshotID);
+ snapshotChainByPath.get(snapshotPath).remove(snapshotId);
+ if (nextSnapshotId != null) {
+ snapshotChainByPath.get(snapshotPath)
+ .get(nextSnapshotId)
+ .setPreviousSnapshotId(previousSnapshotId);
}
- if (previousSnapshotID != null) {
- snapshotChainPath.get(snapshotPath)
- .get(previousSnapshotID)
- .setNextSnapshotID(nextSnapshotID);
+ if (previousSnapshotId != null) {
+ snapshotChainByPath.get(snapshotPath)
+ .get(previousSnapshotId)
+ .setNextSnapshotId(nextSnapshotId);
}
// remove path if no entries
- if (snapshotChainPath.get(snapshotPath).isEmpty()) {
- snapshotChainPath.remove(snapshotPath);
+ if (snapshotChainByPath.get(snapshotPath).isEmpty()) {
+ snapshotChainByPath.remove(snapshotPath);
}
// remove from latest list if necessary
- if (latestPathSnapshotID.get(snapshotPath).equals(snapshotID)) {
- latestPathSnapshotID.remove(snapshotPath);
- if (previousSnapshotID != null) {
- latestPathSnapshotID.put(snapshotPath, previousSnapshotID);
+ if (latestSnapshotIdByPath.get(snapshotPath).equals(snapshotId)) {
+ latestSnapshotIdByPath.remove(snapshotPath);
+ if (previousSnapshotId != null) {
+ latestSnapshotIdByPath.put(snapshotPath, previousSnapshotId);
}
}
return true;
} else {
- // snapshotID not found in snapshot chain, log warning and return
+ // snapshotId not found in snapshot chain, log warning and return
LOG.warn("Snapshot chain corruption. SnapshotId: {} is not in chain " +
- "found for snapshot path {}.", snapshotID, snapshotPath);
+ "found for snapshot path {}.", snapshotId, snapshotPath);
return false;
}
}
/**
* Loads the snapshot chain from SnapshotInfo table.
- * @param metadataManager OMMetadataManager
*/
private void loadFromSnapshotInfoTable(OMMetadataManager metadataManager)
throws IOException {
// read from snapshotInfo table to populate
// snapshot chains - both global and local path
try (TableIterator<String, ? extends Table.KeyValue<String, SnapshotInfo>>
- keyIter = metadataManager.getSnapshotInfoTable().iterator()) {
+ keyIter = metadataManager.getSnapshotInfoTable().iterator()) {
Map<Long, SnapshotInfo> snaps = new TreeMap<>();
Table.KeyValue<String, SnapshotInfo> kv;
- snapshotChainGlobal.clear();
- snapshotChainPath.clear();
- latestPathSnapshotID.clear();
+ globalSnapshotChain.clear();
+ snapshotChainByPath.clear();
+ latestSnapshotIdByPath.clear();
snapshotIdToTableKey.clear();
while (keyIter.hasNext()) {
@@ -277,235 +255,182 @@ public class SnapshotChainManager {
/**
* Add snapshot to snapshot chain.
- * @param snapshotInfo SnapshotInfo of snapshot to add to chain.
*/
public void addSnapshot(SnapshotInfo snapshotInfo) throws IOException {
- addSnapshotGlobal(snapshotInfo.getSnapshotID(),
- snapshotInfo.getGlobalPreviousSnapshotID());
+ addSnapshotGlobal(snapshotInfo.getSnapshotId(),
+ snapshotInfo.getGlobalPreviousSnapshotId());
addSnapshotPath(snapshotInfo.getSnapshotPath(),
- snapshotInfo.getSnapshotID(),
snapshotInfo.getPathPreviousSnapshotID());
+ snapshotInfo.getSnapshotId(),
snapshotInfo.getPathPreviousSnapshotId());
// store snapshot ID to snapshot DB table key in the map
- snapshotIdToTableKey.put(snapshotInfo.getSnapshotID(),
+ snapshotIdToTableKey.put(snapshotInfo.getSnapshotId(),
snapshotInfo.getTableKey());
}
/**
* Delete snapshot from snapshot chain.
- * @param snapshotInfo SnapshotInfo of snapshot to remove from chain.
- * @return boolean
*/
public boolean deleteSnapshot(SnapshotInfo snapshotInfo) throws IOException {
- boolean status = deleteSnapshotGlobal(snapshotInfo.getSnapshotID()) &&
+ boolean status = deleteSnapshotGlobal(snapshotInfo.getSnapshotId()) &&
deleteSnapshotPath(snapshotInfo.getSnapshotPath(),
- snapshotInfo.getSnapshotID());
+ snapshotInfo.getSnapshotId());
if (status) {
- snapshotIdToTableKey.remove(snapshotInfo.getSnapshotID());
+ snapshotIdToTableKey.remove(snapshotInfo.getSnapshotId());
}
return status;
}
/**
* Get latest global snapshot in snapshot chain.
- * @return String, snapshot UUID of latest snapshot in global chain;
- * null if empty chain.
*/
- public String getLatestGlobalSnapshot() {
- return latestGlobalSnapshotID;
+ public UUID getLatestGlobalSnapshotId() {
+ return latestGlobalSnapshotId;
}
/**
* Get latest path snapshot in snapshot chain.
- * @param snapshotPath String, snapshot directory path.
- * @return String, snapshot UUID of latest snapshot in path chain;
- * null if empty chain.
*/
- public String getLatestPathSnapshot(String snapshotPath) {
- return latestPathSnapshotID.get(snapshotPath);
+ public UUID getLatestPathSnapshotId(String snapshotPath) {
+ return latestSnapshotIdByPath.get(snapshotPath);
}
/**
- * Returns true if snapshot from given snapshotID has a
- * next snapshot entry in the global snapshot chain.
- * @param snapshotID String, snapshot UUID
- * @return boolean
+ * Returns true if snapshot from given snapshotId has a next snapshot entry
+ * in the global snapshot chain.
*/
- public boolean hasNextGlobalSnapshot(String snapshotID) {
- if (!snapshotChainGlobal.containsKey(snapshotID)) {
- LOG.error("No snapshot for provided snapshotId: {}", snapshotID);
+ public boolean hasNextGlobalSnapshot(UUID snapshotId) {
+ if (!globalSnapshotChain.containsKey(snapshotId)) {
+ LOG.error("No snapshot for provided snapshotId: {}", snapshotId);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain.", snapshotID));
+ "found in snapshot chain.", snapshotId));
}
- return snapshotChainGlobal.get(snapshotID).getNextSnapshotID() != null;
+ return globalSnapshotChain.get(snapshotId).getNextSnapshotId() != null;
}
/**
* Get next global snapshot in snapshot chain from given snapshot.
- * @param snapshotID String, snapshot UUID
- * @return String, snapshot UUID of next snapshot in chain from
- * snapshotID
*/
- public String nextGlobalSnapshot(String snapshotID) {
- if (!hasNextGlobalSnapshot(snapshotID)) {
- LOG.error("No following snapshot found in snapshot chain for provided " +
- "snapshotId: {}.", snapshotID);
+ public UUID nextGlobalSnapshot(UUID snapshotId) {
+ if (!hasNextGlobalSnapshot(snapshotId)) {
+ LOG.error("No snapshot for provided snapshotId: {}", snapshotId);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain.", snapshotID));
+ "found in snapshot chain.", snapshotId));
}
- return snapshotChainGlobal.get(snapshotID).getNextSnapshotID();
+ return globalSnapshotChain.get(snapshotId).getNextSnapshotId();
}
/**
- * Returns true if snapshot from given snapshotID has a
- * previous snapshot entry in the global snapshot chain.
- * @param snapshotID String, snapshot UUID
- * @return boolean
+ * Returns true if snapshot from given snapshotId has a previous snapshot
+ * entry in the global snapshot chain.
*/
- public boolean hasPreviousGlobalSnapshot(String snapshotID) {
- if (!snapshotChainGlobal.containsKey(snapshotID)) {
+ public boolean hasPreviousGlobalSnapshot(UUID snapshotId) {
+ if (!globalSnapshotChain.containsKey(snapshotId)) {
LOG.error("No snapshot found in snapshot chain for provided " +
- "snapshotId: {}.", snapshotID);
+ "snapshotId: {}.", snapshotId);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain.", snapshotID));
+ "found in snapshot chain.", snapshotId));
}
- return snapshotChainGlobal.get(snapshotID).getPreviousSnapshotID() != null;
+ return globalSnapshotChain.get(snapshotId).getPreviousSnapshotId() != null;
}
/**
* Get previous global snapshot in snapshot chain from given snapshot.
- * @param snapshotID String, snapshot UUID
- * @return String, snapshot UUID of previous snapshot in chain from
- * snapshotID
*/
- public String previousGlobalSnapshot(String snapshotID) {
- if (!hasPreviousGlobalSnapshot(snapshotID)) {
+ public UUID previousGlobalSnapshot(UUID snapshotId) {
+ if (!hasPreviousGlobalSnapshot(snapshotId)) {
LOG.error("No preceding snapshot found in snapshot chain for provided " +
- "snapshotId: {}.", snapshotID);
+ "snapshotId: {}.", snapshotId);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain.", snapshotID));
+ "found in snapshot chain.", snapshotId));
}
- return snapshotChainGlobal.get(snapshotID).getPreviousSnapshotID();
+ return globalSnapshotChain.get(snapshotId).getPreviousSnapshotId();
}
/**
- * Returns true if snapshot path from given snapshotID has a
- * next snapshot entry in the path snapshot chain.
- * @param snapshotPath String, snapshot directory path.
- * @param snapshotID String, snapshot UUID
- * @return boolean
+ * Returns true if snapshot path from given snapshotId has a next snapshot
+ * entry in the path snapshot chain.
*/
- public boolean hasNextPathSnapshot(String snapshotPath, String snapshotID) {
- if (!snapshotChainPath.containsKey(snapshotPath) ||
- !snapshotChainPath.get(snapshotPath).containsKey(snapshotID)) {
+ public boolean hasNextPathSnapshot(String snapshotPath, UUID snapshotId) {
+ if (!snapshotChainByPath.containsKey(snapshotPath) ||
+ !snapshotChainByPath.get(snapshotPath).containsKey(snapshotId)) {
LOG.error("No snapshot found for provided snapshotId: {} and " +
- "snapshotPath: {}", snapshotID, snapshotPath);
+ "snapshotPath: {}", snapshotId, snapshotPath);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain for snapshotPath: %s.", snapshotID,
+ "found in snapshot chain for snapshotPath: %s.", snapshotId,
snapshotPath));
}
- return snapshotChainPath
+ return snapshotChainByPath
.get(snapshotPath)
- .get(snapshotID)
- .getNextSnapshotID() != null;
+ .get(snapshotId)
+ .getNextSnapshotId() != null;
}
/**
- * Returns true if snapshot path from given snapshotID has a
- * previous snapshot entry in the path snapshot chain.
- * @param snapshotPath String, snapshot directory path.
- * @param snapshotID String, snapshot UUID
- * @return boolean
+ * Get next path snapshot in snapshot chain from given snapshot.
*/
- public boolean hasPreviousPathSnapshot(String snapshotPath,
- String snapshotID) {
- if (!snapshotChainPath.containsKey(snapshotPath) ||
- !snapshotChainPath.get(snapshotPath).containsKey(snapshotID)) {
- LOG.error("No snapshot found for provided snapshotId: {} and " +
- "snapshotPath: {}", snapshotID, snapshotPath);
- throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain for snapshotPath: %s.", snapshotID,
- snapshotPath));
+ public UUID nextPathSnapshot(String snapshotPath, UUID snapshotId) {
+ if (!hasNextPathSnapshot(snapshotPath, snapshotId)) {
+ LOG.error("No following snapshot for provided snapshotId {} and " +
+ "snapshotPath {}.", snapshotId, snapshotPath);
+ throw new NoSuchElementException(String.format("No following snapshot " +
+ "found in snapshot chain for snapshotId: %s and snapshotPath: " +
+ "%s.", snapshotId, snapshotPath));
}
- return snapshotChainPath.get(snapshotPath)
- .get(snapshotID)
- .getPreviousSnapshotID() != null;
+ return snapshotChainByPath.get(snapshotPath)
+ .get(snapshotId)
+ .getNextSnapshotId();
}
/**
- * Get next path snapshot in snapshot chain from given snapshot.
- * @param snapshotPath String, snapshot directory path.
- * @param snapshotID String, snapshot UUID
- * @return String, snapshot UUID of next snapshot in chain from
- * snapshotID
+ * Returns true if snapshot path from given snapshotId has a
+ * previous snapshot entry in the path snapshot chain.
*/
- public String nextPathSnapshot(String snapshotPath, String snapshotID) {
- if (!snapshotChainPath.containsKey(snapshotPath) ||
- !snapshotChainPath.get(snapshotPath).containsKey(snapshotID)) {
+ public boolean hasPreviousPathSnapshot(String snapshotPath,
+ UUID snapshotId) {
+ if (!snapshotChainByPath.containsKey(snapshotPath) ||
+ !snapshotChainByPath.get(snapshotPath).containsKey(snapshotId)) {
LOG.error("No snapshot found for provided snapshotId: {} and " +
- "snapshotPath: {}", snapshotID, snapshotPath);
+ "snapshotPath: {}", snapshotId, snapshotPath);
throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain for snapshotPath: %s.", snapshotID,
+ "found in snapshot chain for snapshotPath: %s.", snapshotId,
snapshotPath));
}
- if (snapshotChainPath.get(snapshotPath).get(snapshotID)
- .getNextSnapshotID() == null) {
- LOG.error("No following snapshot for provided snapshotId {} and " +
- "snapshotPath {}.", snapshotID, snapshotPath);
- throw new NoSuchElementException(String.format("No following snapshot " +
- "found in snapshot chain for snapshotId: %s and snapshotPath: " +
- "%s.", snapshotID, snapshotPath));
- }
- return snapshotChainPath.get(snapshotPath)
- .get(snapshotID)
- .getNextSnapshotID();
+ return snapshotChainByPath.get(snapshotPath)
+ .get(snapshotId)
+ .getPreviousSnapshotId() != null;
}
/**
* Get previous path snapshot in snapshot chain from given snapshot.
- * @param snapshotPath String, snapshot directory path.
- * @param snapshotID String, snapshot UUID
- * @return String, snapshot UUID of previous snapshot in chain from
- * snapshotID
*/
- public String previousPathSnapshot(String snapshotPath, String snapshotID) {
- if (!snapshotChainPath.containsKey(snapshotPath) ||
- !snapshotChainPath.get(snapshotPath).containsKey(snapshotID)) {
- LOG.error("No snapshot found for provided snapshotId: {} and " +
- "snapshotPath: {}", snapshotID, snapshotPath);
- throw new NoSuchElementException(String.format("SnapshotId: %s is not " +
- "found in snapshot chain for snapshotPath: %s.", snapshotID,
- snapshotPath));
- }
- if (snapshotChainPath
- .get(snapshotPath)
- .get(snapshotID)
- .getPreviousSnapshotID() == null) {
+ public UUID previousPathSnapshot(String snapshotPath,
+ UUID snapshotId) {
+ if (!hasPreviousPathSnapshot(snapshotPath, snapshotId)) {
LOG.error("No preceding snapshot for provided snapshotId: {} and " +
- "snapshotPath: {}", snapshotID, snapshotPath);
+ "snapshotPath: {}", snapshotId, snapshotPath);
throw new NoSuchElementException(String.format("No preceding snapshot " +
- "found in snapshot chain for snapshotId: %s and snapshotPath: " +
- "%s.", snapshotID, snapshotPath));
+ "found in snapshot chain for snapshotId: %s and snapshotPath: " +
+ "%s.", snapshotId, snapshotPath));
}
- return snapshotChainPath
+ return snapshotChainByPath
.get(snapshotPath)
- .get(snapshotID)
- .getPreviousSnapshotID();
+ .get(snapshotId)
+ .getPreviousSnapshotId();
}
- public String getTableKey(String snapshotId) {
+ public String getTableKey(UUID snapshotId) {
return snapshotIdToTableKey.get(snapshotId);
}
@VisibleForTesting
- public void loadSnapshotInfo(OMMetadataManager metadataManager)
- throws IOException {
+ void loadSnapshotInfo(OMMetadataManager metadataManager) throws IOException {
loadFromSnapshotInfoTable(metadataManager);
}
@VisibleForTesting
- public LinkedHashMap<String, SnapshotChainInfo> getSnapshotChainPath(
+ public LinkedHashMap<UUID, SnapshotChainInfo> getSnapshotChainPath(
String path) {
- return snapshotChainPath.get(path);
+ return snapshotChainByPath.get(path);
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
index 32b317f0b7..e1190fce00 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
@@ -47,6 +47,7 @@ import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
@@ -126,6 +127,7 @@ public class SstFilteringService extends BackgroundService
Table.KeyValue<String, SnapshotInfo> keyValue = iterator.next();
String snapShotTableKey = keyValue.getKey();
SnapshotInfo snapshotInfo = keyValue.getValue();
+ UUID snapshotId = snapshotInfo.getSnapshotId();
File omMetadataDir =
OMStorage.getOmDbDir(ozoneManager.getConfiguration());
@@ -137,7 +139,8 @@ public class SstFilteringService extends BackgroundService
// it has already undergone filtering.
if (Files.exists(filePath)) {
List<String> processedSnapshotIds = Files.readAllLines(filePath);
- if (processedSnapshotIds.contains(snapshotInfo.getSnapshotID())) {
+ if (snapshotId != null &&
+ processedSnapshotIds.contains(snapshotId.toString())) {
continue;
}
}
@@ -164,7 +167,7 @@ public class SstFilteringService extends BackgroundService
}
// mark the snapshot as filtered by writing to the file
- String content = snapshotInfo.getSnapshotID() + "\n";
+ String content = snapshotInfo.getSnapshotId() + "\n";
Files.write(filePath, content.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
snapshotLimit--;
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java
index 1bb1ce2d04..5903edb520 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.om.request.snapshot;
-import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hdds.utils.db.RDBStore;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
@@ -54,6 +53,8 @@ import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
+import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf;
+import static org.apache.hadoop.hdds.HddsUtils.toProtobuf;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK;
@@ -70,7 +71,6 @@ public class OMSnapshotCreateRequest extends OMClientRequest {
private final String volumeName;
private final String bucketName;
private final String snapshotName;
- private final String snapshotId;
private final SnapshotInfo snapshotInfo;
public OMSnapshotCreateRequest(OMRequest omRequest) {
@@ -79,7 +79,8 @@ public class OMSnapshotCreateRequest extends OMClientRequest {
.getCreateSnapshotRequest();
volumeName = createSnapshotRequest.getVolumeName();
bucketName = createSnapshotRequest.getBucketName();
- snapshotId = createSnapshotRequest.getSnapshotId();
+ UUID snapshotId = createSnapshotRequest.hasSnapshotId() ?
+ fromProtobuf(createSnapshotRequest.getSnapshotId()) : null;
String possibleName = createSnapshotRequest.getSnapshotName();
snapshotInfo = SnapshotInfo.newInstance(volumeName,
@@ -111,7 +112,7 @@ public class OMSnapshotCreateRequest extends
OMClientRequest {
return omRequest.toBuilder().setCreateSnapshotRequest(
omRequest.getCreateSnapshotRequest().toBuilder()
- .setSnapshotId(UUID.randomUUID().toString())
+ .setSnapshotId(toProtobuf(UUID.randomUUID()))
.setCreationTime(Time.now())
.build()).build();
}
@@ -163,22 +164,13 @@ public class OMSnapshotCreateRequest extends
OMClientRequest {
snapshotInfo.setDbTxSequenceNumber(dbLatestSequenceNumber);
// Set previous path and global snapshot
- String latestPathSnapshot =
- snapshotChainManager.getLatestPathSnapshot(snapshotPath);
- String latestGlobalSnapshot =
- snapshotChainManager.getLatestGlobalSnapshot();
+ UUID latestPathSnapshot =
+ snapshotChainManager.getLatestPathSnapshotId(snapshotPath);
+ UUID latestGlobalSnapshot =
+ snapshotChainManager.getLatestGlobalSnapshotId();
- if (StringUtils.isEmpty(latestPathSnapshot)) {
- snapshotInfo.setPathPreviousSnapshotID(null);
- } else {
- snapshotInfo.setPathPreviousSnapshotID(latestPathSnapshot);
- }
-
- if (StringUtils.isEmpty(latestGlobalSnapshot)) {
- snapshotInfo.setGlobalPreviousSnapshotID(null);
- } else {
- snapshotInfo.setGlobalPreviousSnapshotID(latestGlobalSnapshot);
- }
+ snapshotInfo.setPathPreviousSnapshotId(latestPathSnapshot);
+ snapshotInfo.setGlobalPreviousSnapshotId(latestGlobalSnapshot);
snapshotChainManager.addSnapshot(snapshotInfo);
@@ -202,8 +194,8 @@ public class OMSnapshotCreateRequest extends
OMClientRequest {
// SnapshotChainManager#loadFromSnapshotInfoTable because it could not
// find the previous snapshot which doesn't exist because it was never
// added to the SnapshotInfo table.
- if (Objects.equals(snapshotInfo.getSnapshotID(),
- snapshotChainManager.getLatestGlobalSnapshot())) {
+ if (Objects.equals(snapshotInfo.getSnapshotId(),
+ snapshotChainManager.getLatestGlobalSnapshotId())) {
removeSnapshotInfoFromSnapshotChainManager(snapshotChainManager,
snapshotInfo);
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveDeletedKeysRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveDeletedKeysRequest.java
index dc6a24370d..8d7b533f11 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveDeletedKeysRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotMoveDeletedKeysRequest.java
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
+import java.util.UUID;
import static org.apache.hadoop.ozone.om.OmSnapshotManager.getSnapshotPrefix;
import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT;
@@ -125,15 +126,16 @@ public class OMSnapshotMoveDeletedKeysRequest extends
OMClientRequest {
/**
* Get the next non deleted snapshot in the snapshot chain.
*/
- private SnapshotInfo getNextActiveSnapshot(SnapshotInfo snapInfo,
- SnapshotChainManager chainManager, OmSnapshotManager omSnapshotManager)
- throws IOException {
+ private SnapshotInfo getNextActiveSnapshot(
+ SnapshotInfo snapInfo,
+ SnapshotChainManager chainManager,
+ OmSnapshotManager omSnapshotManager
+ ) throws IOException {
while (chainManager.hasNextPathSnapshot(snapInfo.getSnapshotPath(),
- snapInfo.getSnapshotID())) {
+ snapInfo.getSnapshotId())) {
- String nextPathSnapshot =
- chainManager.nextPathSnapshot(
- snapInfo.getSnapshotPath(), snapInfo.getSnapshotID());
+ UUID nextPathSnapshot = chainManager.nextPathSnapshot(
+ snapInfo.getSnapshotPath(), snapInfo.getSnapshotId());
String tableKey = chainManager.getTableKey(nextPathSnapshot);
SnapshotInfo nextSnapshotInfo =
@@ -143,7 +145,6 @@ public class OMSnapshotMoveDeletedKeysRequest extends
OMClientRequest {
SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE)) {
return nextSnapshotInfo;
}
-
snapInfo = nextSnapshotInfo;
}
return null;
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
index 941813afcb..6aafdd9403 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
@@ -37,6 +37,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.UUID;
import static
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_INFO_TABLE;
@@ -47,7 +48,7 @@ import static
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_INFO_TAB
public class OMSnapshotPurgeResponse extends OMClientResponse {
private static final Logger LOG =
LoggerFactory.getLogger(OMSnapshotPurgeResponse.class);
- private List<String> snapshotDbKeys;
+ private final List<String> snapshotDbKeys;
public OMSnapshotPurgeResponse(@Nonnull OMResponse omResponse,
@Nonnull List<String> snapshotDbKeys) {
@@ -82,46 +83,44 @@ public class OMSnapshotPurgeResponse extends
OMClientResponse {
/**
* Cleans up the snapshot chain and updates next snapshot's
* previousPath and previousGlobal IDs.
- * @param metadataManager
- * @param snapInfo
- * @param batchOperation
*/
private void cleanupSnapshotChain(OmMetadataManagerImpl metadataManager,
- SnapshotInfo snapInfo, BatchOperation batchOperation) throws IOException
{
+ SnapshotInfo snapInfo,
+ BatchOperation batchOperation)
+ throws IOException {
SnapshotChainManager snapshotChainManager = metadataManager
.getSnapshotChainManager();
SnapshotInfo nextPathSnapInfo = null;
- SnapshotInfo nextGlobalSnapInfo = null;
+ SnapshotInfo nextGlobalSnapInfo;
// If the snapshot is deleted in the previous run, then the in-memory
// SnapshotChainManager might throw NoSuchElementException as the snapshot
// is removed in-memory but OMDoubleBuffer has not flushed yet.
- boolean hasNextPathSnapshot = false;
- boolean hasNextGlobalSnapshot = false;
+ boolean hasNextPathSnapshot;
+ boolean hasNextGlobalSnapshot;
try {
hasNextPathSnapshot = snapshotChainManager.hasNextPathSnapshot(
- snapInfo.getSnapshotPath(), snapInfo.getSnapshotID());
+ snapInfo.getSnapshotPath(), snapInfo.getSnapshotId());
hasNextGlobalSnapshot = snapshotChainManager.hasNextGlobalSnapshot(
- snapInfo.getSnapshotID());
+ snapInfo.getSnapshotId());
} catch (NoSuchElementException ex) {
LOG.warn("The Snapshot {} could have been deleted in the previous run.",
- snapInfo.getSnapshotID(), ex);
+ snapInfo.getSnapshotId(), ex);
return;
}
// Updates next path snapshot's previous snapshot ID
if (hasNextPathSnapshot) {
- String nextPathSnapshotId =
- snapshotChainManager.nextPathSnapshot(
- snapInfo.getSnapshotPath(), snapInfo.getSnapshotID());
+ UUID nextPathSnapshotId = snapshotChainManager.nextPathSnapshot(
+ snapInfo.getSnapshotPath(), snapInfo.getSnapshotId());
String snapshotTableKey = snapshotChainManager
.getTableKey(nextPathSnapshotId);
- nextPathSnapInfo = metadataManager
- .getSnapshotInfoTable().get(snapshotTableKey);
+ nextPathSnapInfo = metadataManager.getSnapshotInfoTable()
+ .get(snapshotTableKey);
if (nextPathSnapInfo != null) {
- nextPathSnapInfo.setPathPreviousSnapshotID(
- snapInfo.getPathPreviousSnapshotID());
+ nextPathSnapInfo.setPathPreviousSnapshotId(
+ snapInfo.getPathPreviousSnapshotId());
metadataManager.getSnapshotInfoTable().putWithBatch(batchOperation,
nextPathSnapInfo.getTableKey(), nextPathSnapInfo);
}
@@ -129,8 +128,8 @@ public class OMSnapshotPurgeResponse extends
OMClientResponse {
// Updates next global snapshot's previous snapshot ID
if (hasNextGlobalSnapshot) {
- String nextGlobalSnapshotId =
- snapshotChainManager.nextGlobalSnapshot(snapInfo.getSnapshotID());
+ UUID nextGlobalSnapshotId =
+ snapshotChainManager.nextGlobalSnapshot(snapInfo.getSnapshotId());
String snapshotTableKey = snapshotChainManager
.getTableKey(nextGlobalSnapshotId);
@@ -140,15 +139,15 @@ public class OMSnapshotPurgeResponse extends
OMClientResponse {
// nextPathSnapInfo.setPathPreviousSnapshotID(), adding this check
// will prevent it.
if (nextGlobalSnapInfo != null && nextPathSnapInfo != null &&
- nextGlobalSnapInfo.getSnapshotID().equals(
- nextPathSnapInfo.getSnapshotID())) {
- nextPathSnapInfo.setGlobalPreviousSnapshotID(
- snapInfo.getPathPreviousSnapshotID());
+ nextGlobalSnapInfo.getSnapshotId().equals(
+ nextPathSnapInfo.getSnapshotId())) {
+ nextPathSnapInfo.setGlobalPreviousSnapshotId(
+ snapInfo.getPathPreviousSnapshotId());
metadataManager.getSnapshotInfoTable().putWithBatch(batchOperation,
nextPathSnapInfo.getTableKey(), nextPathSnapInfo);
} else if (nextGlobalSnapInfo != null) {
- nextGlobalSnapInfo.setGlobalPreviousSnapshotID(
- snapInfo.getPathPreviousSnapshotID());
+ nextGlobalSnapInfo.setGlobalPreviousSnapshotId(
+ snapInfo.getPathPreviousSnapshotId());
metadataManager.getSnapshotInfoTable().putWithBatch(batchOperation,
nextGlobalSnapInfo.getTableKey(), nextGlobalSnapInfo);
}
@@ -160,11 +159,9 @@ public class OMSnapshotPurgeResponse extends
OMClientResponse {
/**
* Deletes the checkpoint directory for a snapshot.
- * @param omMetadataManager
- * @param snapshotInfo
*/
private void deleteCheckpointDirectory(OMMetadataManager omMetadataManager,
- SnapshotInfo snapshotInfo) {
+ SnapshotInfo snapshotInfo) {
RDBStore store = (RDBStore) omMetadataManager.getStore();
String checkpointPrefix = store.getDbLocation().getName();
Path snapshotDirPath = Paths.get(store.getSnapshotsParentDir(),
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
index fb81d083dc..58fa8e6074 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
@@ -61,6 +61,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
@@ -285,7 +286,7 @@ public class SnapshotDeletingService extends
AbstractKeyDeletingService {
} catch (IOException ex) {
LOG.error("Error while running Snapshot Deleting Service for " +
"snapshot " + snapInfo.getTableKey() + " with snapshotId " +
- snapInfo.getSnapshotID() + ". Processed " + deletionCount +
+ snapInfo.getSnapshotId() + ". Processed " + deletionCount +
" keys and " + (keyLimitPerSnapshot - remainNum) +
" directories and files", ex);
}
@@ -541,14 +542,14 @@ public class SnapshotDeletingService extends
AbstractKeyDeletingService {
throws IOException {
SnapshotInfo currSnapInfo = snapInfo;
while (chainManager.hasPreviousPathSnapshot(
- currSnapInfo.getSnapshotPath(), currSnapInfo.getSnapshotID())) {
+ currSnapInfo.getSnapshotPath(), currSnapInfo.getSnapshotId())) {
- String prevPathSnapshot = chainManager.previousPathSnapshot(
- currSnapInfo.getSnapshotPath(), currSnapInfo.getSnapshotID());
+ UUID prevPathSnapshot = chainManager.previousPathSnapshot(
+ currSnapInfo.getSnapshotPath(), currSnapInfo.getSnapshotId());
String tableKey = chainManager.getTableKey(prevPathSnapshot);
SnapshotInfo prevSnapInfo =
omSnapshotManager.getSnapshotInfo(tableKey);
- if (prevSnapInfo.getSnapshotStatus().equals(
- SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE)) {
+ if (prevSnapInfo.getSnapshotStatus() ==
+ SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE) {
return prevSnapInfo;
}
currSnapInfo = prevSnapInfo;
@@ -646,4 +647,3 @@ public class SnapshotDeletingService extends
AbstractKeyDeletingService {
successRunCount.getAndSet(num);
}
}
-
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
index 9861ac0ac4..d01d8fb60e 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
@@ -350,7 +350,7 @@ public class SnapshotDiffManager implements AutoCloseable {
final OMMetadataManager snapshotOMMM = omSnapshot.getMetadataManager();
final String checkpointPath =
snapshotOMMM.getStore().getDbLocation().getPath();
- final String snapshotId = snapshotInfo.getSnapshotID();
+ final UUID snapshotId = snapshotInfo.getSnapshotId();
final long dbTxSequenceNumber = snapshotInfo.getDbTxSequenceNumber();
return new DifferSnapshotInfo(
@@ -382,8 +382,8 @@ public class SnapshotDiffManager implements AutoCloseable {
SnapshotInfo tsInfo = getSnapshotInfo(ozoneManager,
volumeName, bucketName, toSnapshotName);
- String snapDiffJobKey = fsInfo.getSnapshotID() + DELIMITER +
- tsInfo.getSnapshotID();
+ String snapDiffJobKey = fsInfo.getSnapshotId() + DELIMITER +
+ tsInfo.getSnapshotId();
SnapshotDiffJob snapDiffJob = getSnapDiffReportStatus(snapDiffJobKey,
volumeName, bucketName, fromSnapshotName, toSnapshotName,
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java
index ad8ce91c71..6e0b98657a 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java
@@ -219,14 +219,12 @@ public class TestOmSnapshotManager {
}
}
- private SnapshotInfo createSnapshotInfo(
- String volumeName, String bucketName) {
- String snapshotName = UUID.randomUUID().toString();
- String snapshotId = UUID.randomUUID().toString();
+ private SnapshotInfo createSnapshotInfo(String volumeName,
+ String bucketName) {
return SnapshotInfo.newInstance(volumeName,
bucketName,
- snapshotName,
- snapshotId,
+ UUID.randomUUID().toString(),
+ UUID.randomUUID(),
Time.now());
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotChain.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotChain.java
index 7d790ec042..4a63eb6887 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotChain.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotChain.java
@@ -21,12 +21,11 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
import org.apache.hadoop.util.Time;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -35,6 +34,10 @@ import java.util.NoSuchElementException;
import java.util.UUID;
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_DIRS;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests SnapshotChain that stores in chronological order
@@ -45,158 +48,144 @@ import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_DIRS;
*/
public class TestSnapshotChain {
private OMMetadataManager omMetadataManager;
- private Map<String, SnapshotInfo> sinfos;
+ private Map<UUID, SnapshotInfo> snapshotIdToSnapshotInfoMap;
private SnapshotChainManager chainManager;
- @Rule
- public TemporaryFolder folder = new TemporaryFolder();
+ @TempDir
+ private File folder;
- @Before
+ @BeforeEach
public void setup() throws Exception {
OzoneConfiguration conf = new OzoneConfiguration();
- conf.set(OZONE_OM_DB_DIRS,
- folder.getRoot().getAbsolutePath());
+ conf.set(OZONE_OM_DB_DIRS, folder.toString());
omMetadataManager = new OmMetadataManagerImpl(conf);
- sinfos = new HashMap<>();
+ snapshotIdToSnapshotInfoMap = new HashMap<>();
chainManager = new SnapshotChainManager(omMetadataManager);
}
- private SnapshotInfo createSnapshotInfo(String volName,
- String bucketName,
- String snapshotName,
- String snapshotID,
- String pathPrevID,
- String globalPrevID) {
+ private SnapshotInfo createSnapshotInfo(UUID snapshotID,
+ UUID pathPrevID,
+ UUID globalPrevID) {
return new SnapshotInfo.Builder()
- .setSnapshotID(snapshotID)
- .setName(snapshotName)
- .setVolumeName(volName)
- .setBucketName(bucketName)
+ .setSnapshotId(snapshotID)
+ .setName("test")
+ .setVolumeName("vol1")
+ .setBucketName("bucket1")
.setSnapshotStatus(SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE)
.setCreationTime(Time.now())
.setDeletionTime(-1L)
- .setPathPreviousSnapshotID(pathPrevID)
- .setGlobalPreviousSnapshotID(globalPrevID)
- .setSnapshotPath(String.join("/", volName, bucketName))
+ .setPathPreviousSnapshotId(pathPrevID)
+ .setGlobalPreviousSnapshotId(globalPrevID)
+ .setSnapshotPath(String.join("/", "vol1", "bucket1"))
.setCheckpointDir("checkpoint.testdir")
.build();
}
- private void deleteSnapshot(String snapshotID) throws IOException {
+ private void deleteSnapshot(UUID snapshotID) throws IOException {
SnapshotInfo sinfo = null;
final String snapshotPath = "vol1/bucket1";
// reset the next snapshotInfo.globalPreviousSnapshotID
// to the previous in the entry to be deleted.
if (chainManager.hasNextGlobalSnapshot(snapshotID)) {
- sinfo = sinfos
- .get(chainManager.nextGlobalSnapshot(snapshotID));
+ sinfo = snapshotIdToSnapshotInfoMap.get(
+ chainManager.nextGlobalSnapshot(snapshotID));
if (chainManager.hasPreviousGlobalSnapshot(snapshotID)) {
- sinfo.setGlobalPreviousSnapshotID(chainManager
- .previousGlobalSnapshot(snapshotID));
+ sinfo.setGlobalPreviousSnapshotId(
+ chainManager.previousGlobalSnapshot(snapshotID));
} else {
- sinfo.setGlobalPreviousSnapshotID(null);
+ sinfo.setGlobalPreviousSnapshotId(null);
}
- sinfos.put(sinfo.getSnapshotID(), sinfo);
+ snapshotIdToSnapshotInfoMap.put(sinfo.getSnapshotId(), sinfo);
}
// reset the next snapshotInfo.pathPreviousSnapshotID
// to the previous in the entry to be deleted.
- if (chainManager.hasNextPathSnapshot(snapshotPath,
- snapshotID)) {
- sinfo = sinfos.get(chainManager
- .nextPathSnapshot(snapshotPath,
- snapshotID));
- if (chainManager.hasPreviousPathSnapshot(snapshotPath,
- snapshotID)) {
- sinfo.setPathPreviousSnapshotID(chainManager
- .previousPathSnapshot(snapshotPath,
- snapshotID));
+ if (chainManager.hasNextPathSnapshot(snapshotPath, snapshotID)) {
+ sinfo = snapshotIdToSnapshotInfoMap.get(
+ chainManager.nextPathSnapshot(snapshotPath, snapshotID));
+
+ if (chainManager.hasPreviousPathSnapshot(snapshotPath, snapshotID)) {
+ sinfo.setPathPreviousSnapshotId(
+ chainManager.previousPathSnapshot(snapshotPath, snapshotID));
} else {
- sinfo.setPathPreviousSnapshotID(null);
+ sinfo.setPathPreviousSnapshotId(null);
}
- sinfos.put(sinfo.getSnapshotID(), sinfo);
+ snapshotIdToSnapshotInfoMap.put(sinfo.getSnapshotId(), sinfo);
}
+
+ UUID latestGlobalSnapshot = chainManager.getLatestGlobalSnapshotId();
// append snapshot to the sinfos (the end).
- if (chainManager.getLatestGlobalSnapshot() != null) {
- sinfo = sinfos.get(snapshotID);
- sinfo.setGlobalPreviousSnapshotID(chainManager
- .getLatestGlobalSnapshot());
- sinfo.setPathPreviousSnapshotID(chainManager
- .getLatestPathSnapshot(String
- .join("/", "vol1", "bucket1")));
- sinfos.put(snapshotID, sinfo);
+ if (latestGlobalSnapshot != null) {
+ sinfo = snapshotIdToSnapshotInfoMap.get(snapshotID);
+ sinfo.setGlobalPreviousSnapshotId(latestGlobalSnapshot);
+ UUID latestPathSnapshot = chainManager.getLatestPathSnapshotId(
+ String.join("/", "vol1", "bucket1"));
+ if (latestPathSnapshot != null) {
+ sinfo.setPathPreviousSnapshotId(latestPathSnapshot);
+ }
+ snapshotIdToSnapshotInfoMap.put(snapshotID, sinfo);
}
- chainManager.deleteSnapshot(sinfos.get(snapshotID));
+ chainManager.deleteSnapshot(snapshotIdToSnapshotInfoMap.get(snapshotID));
}
@Test
public void testAddSnapshot() throws Exception {
final String snapshotPath = "vol1/bucket1";
// add three snapshots
- String snapshotID1 = UUID.randomUUID().toString();
- String snapshotID2 = UUID.randomUUID().toString();
- String snapshotID3 = UUID.randomUUID().toString();
+ UUID snapshotID1 = UUID.randomUUID();
+ UUID snapshotID2 = UUID.randomUUID();
+ UUID snapshotID3 = UUID.randomUUID();
- ArrayList<String> snapshotIDs = new ArrayList<>();
+ ArrayList<UUID> snapshotIDs = new ArrayList<>();
snapshotIDs.add(snapshotID1);
snapshotIDs.add(snapshotID2);
snapshotIDs.add(snapshotID3);
- String prevSnapshotID = null;
+ UUID prevSnapshotID = null;
// add 3 snapshots
- for (String snapshotID : snapshotIDs) {
- chainManager.addSnapshot(createSnapshotInfo("vol1",
- "bucket1",
- "test",
+ for (UUID snapshotID : snapshotIDs) {
+ chainManager.addSnapshot(createSnapshotInfo(
snapshotID,
prevSnapshotID,
prevSnapshotID));
prevSnapshotID = snapshotID;
}
- Assert.assertEquals(snapshotID3,
- chainManager
- .getLatestGlobalSnapshot());
- Assert.assertEquals(snapshotID3,
- chainManager
- .getLatestPathSnapshot(String
- .join("/", "vol1", "bucket1")));
+ assertEquals(snapshotID3, chainManager.getLatestGlobalSnapshotId());
+ assertEquals(snapshotID3, chainManager.getLatestPathSnapshotId(
+ String.join("/", "vol1", "bucket1")));
int i = 0;
- String curID = snapshotIDs.get(i);
+ UUID curID = snapshotIDs.get(i);
while (chainManager.hasNextGlobalSnapshot(curID)) {
i++;
- Assert.assertEquals(snapshotIDs.get(i),
- chainManager.nextGlobalSnapshot(curID));
+ assertEquals(snapshotIDs.get(i), chainManager.nextGlobalSnapshot(curID));
curID = snapshotIDs.get(i);
}
curID = snapshotIDs.get(i);
while (chainManager.hasPreviousGlobalSnapshot(curID)) {
i--;
- Assert.assertEquals(snapshotIDs.get(i),
- chainManager.previousGlobalSnapshot(curID));
+ assertEquals(snapshotIDs.get(i),
+ chainManager.previousGlobalSnapshot(curID));
curID = snapshotIDs.get(i);
}
i = 0;
curID = snapshotIDs.get(i);
- while (chainManager.hasNextPathSnapshot(snapshotPath,
- curID)) {
+ while (chainManager.hasNextPathSnapshot(snapshotPath, curID)) {
i++;
- Assert.assertEquals(snapshotIDs.get(i),
- chainManager.nextPathSnapshot(snapshotPath,
- curID));
+ assertEquals(snapshotIDs.get(i),
+ chainManager.nextPathSnapshot(snapshotPath, curID));
curID = snapshotIDs.get(i);
}
curID = snapshotIDs.get(i);
while (chainManager.hasPreviousPathSnapshot(snapshotPath,
- curID)) {
+ curID)) {
i--;
- Assert.assertEquals(snapshotIDs.get(i),
- chainManager.previousPathSnapshot(snapshotPath,
- curID));
+ assertEquals(snapshotIDs.get(i),
+ chainManager.previousPathSnapshot(snapshotPath, curID));
curID = snapshotIDs.get(i);
}
}
@@ -204,29 +193,26 @@ public class TestSnapshotChain {
@Test
public void testDeleteSnapshot() throws Exception {
// add three snapshots
- String snapshotID1 = UUID.randomUUID().toString();
- String snapshotID2 = UUID.randomUUID().toString();
- String snapshotID3 = UUID.randomUUID().toString();
+ UUID snapshotID1 = UUID.randomUUID();
+ UUID snapshotID2 = UUID.randomUUID();
+ UUID snapshotID3 = UUID.randomUUID();
- ArrayList<String> snapshotIDs = new ArrayList<>();
+ ArrayList<UUID> snapshotIDs = new ArrayList<>();
snapshotIDs.add(snapshotID1);
snapshotIDs.add(snapshotID2);
snapshotIDs.add(snapshotID3);
- String prevSnapshotID = null;
+ UUID prevSnapshotID = null;
// add 3 snapshots
- for (String snapshotID : snapshotIDs) {
- sinfos.put(snapshotID,
- createSnapshotInfo("vol1",
- "bucket1",
- "test",
+ for (UUID snapshotID : snapshotIDs) {
+ snapshotIdToSnapshotInfoMap.put(snapshotID,
+ createSnapshotInfo(
snapshotID,
prevSnapshotID,
prevSnapshotID));
- chainManager
- .addSnapshot(sinfos.get(snapshotID));
+ chainManager.addSnapshot(snapshotIdToSnapshotInfoMap.get(snapshotID));
prevSnapshotID = snapshotID;
}
@@ -235,31 +221,22 @@ public class TestSnapshotChain {
deleteSnapshot(snapshotID2);
// start with first snapshot in snapshot chain
- Assert.assertEquals(false, chainManager
- .hasPreviousGlobalSnapshot(snapshotID1));
- Assert.assertEquals(true, chainManager
- .hasNextGlobalSnapshot(snapshotID1));
- Assert.assertEquals(snapshotID3, chainManager
- .nextGlobalSnapshot(snapshotID1));
- Assert.assertEquals(false, chainManager
- .hasNextGlobalSnapshot(snapshotID3));
+ assertFalse(chainManager.hasPreviousGlobalSnapshot(snapshotID1));
+ assertTrue(chainManager.hasNextGlobalSnapshot(snapshotID1));
+ assertFalse(chainManager.hasNextGlobalSnapshot(snapshotID3));
+ assertEquals(snapshotID3,
+ chainManager.nextGlobalSnapshot(snapshotID1));
// add snapshotID2 and delete snapshotID1
// should have snapshotID3 and snapshotID2
deleteSnapshot(snapshotID1);
- chainManager
- .addSnapshot(sinfos.get(snapshotID2));
-
- Assert.assertEquals(false,
- chainManager.hasPreviousGlobalSnapshot(snapshotID3));
- Assert.assertEquals(true,
- chainManager.hasNextGlobalSnapshot(snapshotID3));
- Assert.assertEquals(snapshotID2,
- chainManager.nextGlobalSnapshot(snapshotID3));
- Assert.assertEquals(false,
- chainManager.hasNextGlobalSnapshot(snapshotID2));
- Assert.assertEquals(snapshotID3, chainManager
- .previousGlobalSnapshot(snapshotID2));
+ chainManager.addSnapshot(snapshotIdToSnapshotInfoMap.get(snapshotID2));
+
+ assertFalse(chainManager.hasPreviousGlobalSnapshot(snapshotID3));
+ assertTrue(chainManager.hasNextGlobalSnapshot(snapshotID3));
+ assertEquals(snapshotID2, chainManager.nextGlobalSnapshot(snapshotID3));
+ assertFalse(chainManager.hasNextGlobalSnapshot(snapshotID2));
+ assertEquals(snapshotID3,
chainManager.previousGlobalSnapshot(snapshotID2));
}
@Test
@@ -268,39 +245,32 @@ public class TestSnapshotChain {
omMetadataManager.getSnapshotInfoTable();
// add two snapshots to the snapshotInfo
- String snapshotID1 = UUID.randomUUID().toString();
- String snapshotID2 = UUID.randomUUID().toString();
+ UUID snapshotID1 = UUID.randomUUID();
+ UUID snapshotID2 = UUID.randomUUID();
- ArrayList<String> snapshotIDs = new ArrayList<>();
+ ArrayList<UUID> snapshotIDs = new ArrayList<>();
snapshotIDs.add(snapshotID1);
snapshotIDs.add(snapshotID2);
- String prevSnapshotID = "";
+ UUID prevSnapshotID = null;
// add 3 snapshots
- for (String snapshotID : snapshotIDs) {
- snapshotInfo.put(snapshotID,
- createSnapshotInfo("vol1",
- "bucket1",
- "test",
- snapshotID,
- prevSnapshotID,
- prevSnapshotID));
-
+ for (UUID snapshotID : snapshotIDs) {
+ snapshotInfo.put(snapshotID.toString(),
+ createSnapshotInfo(snapshotID, prevSnapshotID, prevSnapshotID));
prevSnapshotID = snapshotID;
}
chainManager.loadSnapshotInfo(omMetadataManager);
// check if snapshots loaded correctly from snapshotInfoTable
- Assert.assertEquals(snapshotID2, chainManager.getLatestGlobalSnapshot());
- Assert.assertEquals(snapshotID2, chainManager
- .nextGlobalSnapshot(snapshotID1));
- Assert.assertEquals(snapshotID1, chainManager.previousPathSnapshot(String
- .join("/", "vol1", "bucket1"), snapshotID2));
- Assert.assertThrows(NoSuchElementException.class,
- () -> chainManager.nextGlobalSnapshot(snapshotID2));
- Assert.assertThrows(NoSuchElementException.class,
- () -> chainManager.previousPathSnapshot(String
- .join("/", "vol1", "bucket1"), snapshotID1));
+ assertEquals(snapshotID2, chainManager.getLatestGlobalSnapshotId());
+ assertEquals(snapshotID2, chainManager.nextGlobalSnapshot(snapshotID1));
+ assertEquals(snapshotID1, chainManager.previousPathSnapshot(String
+ .join("/", "vol1", "bucket1"), snapshotID2));
+ assertThrows(NoSuchElementException.class,
+ () -> chainManager.nextGlobalSnapshot(snapshotID2));
+ assertThrows(NoSuchElementException.class,
+ () -> chainManager.previousPathSnapshot(String
+ .join("/", "vol1", "bucket1"), snapshotID1));
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
index bafe1d33eb..d3651b06d2 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSnapshotInfo.java
@@ -19,9 +19,9 @@
package org.apache.hadoop.ozone.om;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo.SnapshotStatus;
-import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.util.Time;
import org.junit.Assert;
import org.junit.Before;
@@ -40,10 +40,8 @@ public class TestSnapshotInfo {
private OMMetadataManager omMetadataManager;
private static final String EXPECTED_SNAPSHOT_KEY = "snapshot1";
- private static final String EXPECTED_SNAPSHOT_ID =
- UUID.randomUUID().toString();
- private static final String EXPECTED_PREVIOUS_SNAPSHOT_ID =
- UUID.randomUUID().toString();
+ private static final UUID EXPECTED_SNAPSHOT_ID = UUID.randomUUID();
+ private static final UUID EXPECTED_PREVIOUS_SNAPSHOT_ID = UUID.randomUUID();
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@@ -58,15 +56,15 @@ public class TestSnapshotInfo {
private SnapshotInfo createSnapshotInfo() {
return new SnapshotInfo.Builder()
- .setSnapshotID(EXPECTED_SNAPSHOT_ID)
+ .setSnapshotId(EXPECTED_SNAPSHOT_ID)
.setName("snapshot1")
.setVolumeName("vol1")
.setBucketName("bucket1")
.setSnapshotStatus(SnapshotStatus.SNAPSHOT_ACTIVE)
.setCreationTime(Time.now())
.setDeletionTime(-1L)
- .setPathPreviousSnapshotID(EXPECTED_PREVIOUS_SNAPSHOT_ID)
- .setGlobalPreviousSnapshotID(EXPECTED_PREVIOUS_SNAPSHOT_ID)
+ .setPathPreviousSnapshotId(EXPECTED_PREVIOUS_SNAPSHOT_ID)
+ .setGlobalPreviousSnapshotId(EXPECTED_PREVIOUS_SNAPSHOT_ID)
.setSnapshotPath("test/path")
.setCheckpointDir("checkpoint.testdir")
.build();
@@ -85,7 +83,7 @@ public class TestSnapshotInfo {
omMetadataManager.getSnapshotInfoTable();
snapshotInfo.put(EXPECTED_SNAPSHOT_KEY, createSnapshotInfo());
Assert.assertEquals(EXPECTED_SNAPSHOT_ID,
- snapshotInfo.get(EXPECTED_SNAPSHOT_KEY).getSnapshotID());
+ snapshotInfo.get(EXPECTED_SNAPSHOT_KEY).getSnapshotId());
}
@Test
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
index 9b6061447f..54eb3a74f2 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestSstFilteringService.java
@@ -223,7 +223,7 @@ public class TestSstFilteringService {
List<String> processedSnapshotIds = Files
.readAllLines(Paths.get(dbSnapshots, OzoneConsts.FILTERED_SNAPSHOTS));
Assert.assertTrue(
- processedSnapshotIds.contains(snapshotInfo.getSnapshotID()));
+
processedSnapshotIds.contains(snapshotInfo.getSnapshotId().toString()));
long count;
// Prevent the new snapshot from being filtered
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
index 1dac4ac364..1be049ef78 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.UUID;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdds.HddsUtils;
import org.apache.hadoop.hdds.client.BlockID;
import org.apache.hadoop.hdds.client.ReplicationConfig;
import org.apache.hadoop.hdds.client.ReplicationConfigValidator;
@@ -365,7 +366,7 @@ public final class OMRequestTestUtils {
String volumeName, String bucketName, String snapshotName,
OMMetadataManager omMetadataManager) throws IOException {
SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName,
- bucketName, snapshotName, UUID.randomUUID().toString(), Time.now());
+ bucketName, snapshotName, UUID.randomUUID(), Time.now());
addSnapshotToTable(false, 0L, snapshotInfo, omMetadataManager);
}
@@ -376,7 +377,7 @@ public final class OMRequestTestUtils {
String volumeName, String bucketName, String snapshotName,
OMMetadataManager omMetadataManager) throws IOException {
SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName,
bucketName,
- snapshotName, UUID.randomUUID().toString(), Time.now());
+ snapshotName, UUID.randomUUID(), Time.now());
addSnapshotToTable(true, 0L, snapshotInfo, omMetadataManager);
}
@@ -1126,7 +1127,7 @@ public final class OMRequestTestUtils {
OzoneManagerProtocolProtos.CreateSnapshotRequest.newBuilder()
.setVolumeName(volumeName)
.setBucketName(bucketName)
- .setSnapshotId(UUID.randomUUID().toString())
+ .setSnapshotId(HddsUtils.toProtobuf(UUID.randomUUID()))
.setSnapshotName(snapshotName)
.build();
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
index 1a04916ea4..82d5ca3f97 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
@@ -82,12 +82,9 @@ public class TestOMSnapshotPurgeRequestAndResponse {
private String bucketName;
private String keyName;
-
// Just setting ozoneManagerDoubleBuffer which does nothing.
- private static OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper
=
- ((response, transactionIndex) -> {
- return null;
- });
+ private static final OzoneManagerDoubleBufferHelper
+ DOUBLE_BUFFER_HELPER = ((response, transactionIndex) -> null);
@BeforeEach
public void setup() throws Exception {
@@ -178,7 +175,7 @@ public class TestOMSnapshotPurgeRequestAndResponse {
// validateAndUpdateCache OMSnapshotCreateResponse.
OMSnapshotCreateResponse omClientResponse = (OMSnapshotCreateResponse)
omSnapshotCreateRequest.validateAndUpdateCache(ozoneManager, 1,
- ozoneManagerDoubleBufferHelper);
+ DOUBLE_BUFFER_HELPER);
// Add to batch and commit to DB.
omClientResponse.addToDBBatch(omMetadataManager, batchOperation);
omMetadataManager.getStore().commitBatchOperation(batchOperation);
@@ -217,7 +214,7 @@ public class TestOMSnapshotPurgeRequestAndResponse {
// validateAndUpdateCache for OMSnapshotPurgeRequest.
OMSnapshotPurgeResponse omSnapshotPurgeResponse = (OMSnapshotPurgeResponse)
omSnapshotPurgeRequest.validateAndUpdateCache(ozoneManager, 200L,
- ozoneManagerDoubleBufferHelper);
+ DOUBLE_BUFFER_HELPER);
// Commit to DB.
batchOperation = omMetadataManager.getStore().initBatchOperation();
@@ -259,28 +256,30 @@ public class TestOMSnapshotPurgeRequestAndResponse {
// Get previous and next snapshotInfos to verify if the SnapInfo
// is changed.
- String prevPathSnapId = null;
- String prevGlobalSnapId = null;
- String nextPathSnapId = null;
- String nextGlobalSnapId = null;
+ // Get previous and next snapshotInfos to verify if the SnapInfo
+ // is changed.
+ UUID prevPathSnapId = null;
+ UUID prevGlobalSnapId = null;
+ UUID nextPathSnapId = null;
+ UUID nextGlobalSnapId = null;
if (chainManager.hasPreviousPathSnapshot(snapInfo.getSnapshotPath(),
- snapInfo.getSnapshotID())) {
+ snapInfo.getSnapshotId())) {
prevPathSnapId = chainManager.previousPathSnapshot(
- snapInfo.getSnapshotPath(), snapInfo.getSnapshotID());
+ snapInfo.getSnapshotPath(), snapInfo.getSnapshotId());
}
- if (chainManager.hasPreviousGlobalSnapshot(snapInfo.getSnapshotID())) {
+ if (chainManager.hasPreviousGlobalSnapshot(snapInfo.getSnapshotId())) {
prevGlobalSnapId = chainManager.previousGlobalSnapshot(
- snapInfo.getSnapshotID());
+ snapInfo.getSnapshotId());
}
if (chainManager.hasNextPathSnapshot(snapInfo.getSnapshotPath(),
- snapInfo.getSnapshotID())) {
+ snapInfo.getSnapshotId())) {
nextPathSnapId = chainManager.nextPathSnapshot(
- snapInfo.getSnapshotPath(), snapInfo.getSnapshotID());
+ snapInfo.getSnapshotPath(), snapInfo.getSnapshotId());
}
- if (chainManager.hasNextGlobalSnapshot(snapInfo.getSnapshotID())) {
+ if (chainManager.hasNextGlobalSnapshot(snapInfo.getSnapshotId())) {
nextGlobalSnapId = chainManager.nextGlobalSnapshot(
- snapInfo.getSnapshotID());
+ snapInfo.getSnapshotId());
}
long rowsInTableBeforePurge = omMetadataManager
@@ -296,7 +295,7 @@ public class TestOMSnapshotPurgeRequestAndResponse {
SnapshotInfo nextPathSnapshotInfoAfterPurge = metadataManager
.getSnapshotInfoTable().get(chainManager.getTableKey(nextPathSnapId));
Assertions.assertEquals(nextPathSnapshotInfoAfterPurge
- .getGlobalPreviousSnapshotID(), prevPathSnapId);
+ .getGlobalPreviousSnapshotId(), prevPathSnapId);
}
if (nextGlobalSnapId != null) {
@@ -304,7 +303,7 @@ public class TestOMSnapshotPurgeRequestAndResponse {
.getSnapshotInfoTable().get(chainManager
.getTableKey(nextGlobalSnapId));
Assertions.assertEquals(nextGlobalSnapshotInfoAfterPurge
- .getGlobalPreviousSnapshotID(), prevGlobalSnapId);
+ .getGlobalPreviousSnapshotId(), prevGlobalSnapId);
}
Assertions.assertNotEquals(rowsInTableBeforePurge, omMetadataManager
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotCreateResponse.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotCreateResponse.java
index d50a1539e1..b4071b6a92 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotCreateResponse.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotCreateResponse.java
@@ -89,7 +89,7 @@ public class TestOMSnapshotCreateResponse {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
String snapshotName = UUID.randomUUID().toString();
- String snapshotId = UUID.randomUUID().toString();
+ UUID snapshotId = UUID.randomUUID();
SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName,
bucketName,
snapshotName,
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotDeleteResponse.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotDeleteResponse.java
index a568bf6db6..dfbbf6b223 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotDeleteResponse.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotDeleteResponse.java
@@ -82,7 +82,7 @@ public class TestOMSnapshotDeleteResponse {
String volumeName = UUID.randomUUID().toString();
String bucketName = UUID.randomUUID().toString();
String snapshotName = UUID.randomUUID().toString();
- String snapshotId = UUID.randomUUID().toString();
+ UUID snapshotId = UUID.randomUUID();
SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName,
bucketName,
snapshotName,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]