diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index ce65be861dee..ba0e549bb39e 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -3961,6 +3961,15 @@
+
+ ozone.om.snapshot.diff.disable.native.libs
+ false
+ OZONE, OM
+
+ Flag to perform snapshot diff without using native libs(can be slow).
+
+
+
ozone.om.snapshot.diff.max.page.size
1000
diff --git a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdb/util/TestManagedSstFileReader.java b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdb/util/TestManagedSstFileReader.java
index 5db091cafc28..ffed57594a7f 100644
--- a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdb/util/TestManagedSstFileReader.java
+++ b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdb/util/TestManagedSstFileReader.java
@@ -33,8 +33,6 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.rocksdb.RocksDBException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
@@ -58,9 +56,6 @@
*/
class TestManagedSstFileReader {
- private static final Logger LOG =
- LoggerFactory.getLogger(TestManagedSstFileReader.class);
-
// Key prefix containing all characters, to check if all characters can be
// written & read from rocksdb through SSTDumptool
private static final String KEY_PREFIX = IntStream.range(0, 256).boxed()
@@ -158,6 +153,5 @@ public void testGetKeyStreamWithTombstone(int numberOfFiles)
} finally {
executorService.shutdown();
}
-
}
}
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
index 27b1964ea0b2..69e4f68eb60b 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
@@ -668,19 +668,23 @@ private List getNextListOfSnapshots(String prevSnapshot)
* @param token to get the index to return diff report from.
* @param pageSize maximum entries returned to the report.
* @param forceFullDiff request to force full diff, skipping DAG optimization
+ * @param disableNativeDiff request to force diff to perform diffs without
+ * native lib
* @return the difference report between two snapshots
* @throws IOException in case of any exception while generating snapshot diff
*/
+ @SuppressWarnings("parameternumber")
public SnapshotDiffResponse snapshotDiff(String volumeName,
String bucketName,
String fromSnapshot,
String toSnapshot,
String token,
int pageSize,
- boolean forceFullDiff)
+ boolean forceFullDiff,
+ boolean disableNativeDiff)
throws IOException {
return proxy.snapshotDiff(volumeName, bucketName, fromSnapshot, toSnapshot,
- token, pageSize, forceFullDiff);
+ token, pageSize, forceFullDiff, disableNativeDiff);
}
/**
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
index 87c2290ad49c..2c780d93bae1 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
@@ -1071,10 +1071,12 @@ List listSnapshot(
* @return the difference report between two snapshots
* @throws IOException in case of any exception while generating snapshot diff
*/
+ @SuppressWarnings("parameternumber")
SnapshotDiffResponse snapshotDiff(String volumeName, String bucketName,
String fromSnapshot, String toSnapshot,
String token, int pageSize,
- boolean forceFullDiff)
+ boolean forceFullDiff,
+ boolean disableNativeDiff)
throws IOException;
/**
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index 569901b667f8..f6e9b2a3287f 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -987,14 +987,16 @@ public SnapshotDiffResponse snapshotDiff(String volumeName,
String toSnapshot,
String token,
int pageSize,
- boolean forceFullDiff)
+ boolean forceFullDiff,
+ boolean disableNativeDiff)
throws IOException {
Preconditions.checkArgument(StringUtils.isNotBlank(volumeName),
"volume can't be null or empty.");
Preconditions.checkArgument(StringUtils.isNotBlank(bucketName),
"bucket can't be null or empty.");
return ozoneManagerClient.snapshotDiff(volumeName, bucketName,
- fromSnapshot, toSnapshot, token, pageSize, forceFullDiff);
+ fromSnapshot, toSnapshot, token, pageSize, forceFullDiff,
+ disableNativeDiff);
}
@Override
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
index c5c07e285763..2d824de3bbbd 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
@@ -489,6 +489,11 @@ private OMConfigKeys() {
public static final boolean OZONE_OM_SNAPSHOT_FORCE_FULL_DIFF_DEFAULT = false;
+ public static final String OZONE_OM_SNAPSHOT_DIFF_DISABLE_NATIVE_LIBS =
+ "ozone.om.snapshot.diff.disable.native.libs";
+
+ public static final boolean
+ OZONE_OM_SNAPSHOT_DIFF_DISABLE_NATIVE_LIBS_DEFAULT = false;
public static final String OZONE_OM_SNAPSHOT_DIFF_DB_DIR
= "ozone.om.snapshot.diff.db.dir";
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
index 991f36666400..931657e8e7f4 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
@@ -179,7 +179,7 @@ void addAll(long versionToAdd, List locationInfoList) {
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("version:").append(version).append(" ");
- sb.append("isMultipartKey:").append(isMultipartKey);
+ sb.append("isMultipartKey:").append(isMultipartKey).append(" ");
for (List kliList : locationVersionMap.values()) {
for (OmKeyLocationInfo kli: kliList) {
sb.append(kli.getLocalID()).append(" || ");
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotDiffJob.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotDiffJob.java
index 0465c4e1ae93..0d221dc1cd4b 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotDiffJob.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/SnapshotDiffJob.java
@@ -48,6 +48,7 @@ public static Codec getCodec() {
private String fromSnapshot;
private String toSnapshot;
private boolean forceFullDiff;
+ private boolean disableNativeDiff;
private long totalDiffEntries;
// Reason tells why the job was FAILED. It should be set only if job status
@@ -68,6 +69,7 @@ public SnapshotDiffJob(long creationTime,
String fromSnapshot,
String toSnapshot,
boolean forceFullDiff,
+ boolean disableNativeDiff,
long totalDiffEntries) {
this.creationTime = creationTime;
this.jobId = jobId;
@@ -77,6 +79,7 @@ public SnapshotDiffJob(long creationTime,
this.fromSnapshot = fromSnapshot;
this.toSnapshot = toSnapshot;
this.forceFullDiff = forceFullDiff;
+ this.disableNativeDiff = disableNativeDiff;
this.totalDiffEntries = totalDiffEntries;
this.reason = StringUtils.EMPTY;
}
@@ -161,6 +164,14 @@ public void setReason(String reason) {
this.reason = reason;
}
+ public boolean isNativeDiffDisabled() {
+ return disableNativeDiff;
+ }
+
+ public void disableNativeDiff(boolean disableNativeDiffVal) {
+ this.disableNativeDiff = disableNativeDiffVal;
+ }
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder("creationTime : ").append(creationTime)
@@ -171,6 +182,7 @@ public String toString() {
.append(", fromSnapshot: ").append(fromSnapshot)
.append(", toSnapshot: ").append(toSnapshot)
.append(", forceFullDiff: ").append(forceFullDiff)
+ .append(", disableNativeDiff: ").append(disableNativeDiff)
.append(", totalDiffEntries: ").append(totalDiffEntries);
if (StringUtils.isNotEmpty(reason)) {
@@ -196,7 +208,8 @@ public boolean equals(Object other) {
Objects.equals(this.toSnapshot, otherJob.toSnapshot) &&
Objects.equals(this.forceFullDiff, otherJob.forceFullDiff) &&
Objects.equals(this.totalDiffEntries, otherJob.totalDiffEntries) &&
- Objects.equals(this.reason, otherJob.reason);
+ Objects.equals(this.disableNativeDiff, otherJob.disableNativeDiff)
+ && Objects.equals(this.reason, otherJob.reason);
}
return false;
}
@@ -204,7 +217,8 @@ public boolean equals(Object other) {
@Override
public int hashCode() {
return Objects.hash(creationTime, jobId, status, volume, bucket,
- fromSnapshot, toSnapshot, forceFullDiff, totalDiffEntries, reason);
+ fromSnapshot, toSnapshot, forceFullDiff, disableNativeDiff,
+ totalDiffEntries, reason);
}
public SnapshotDiffJobProto toProtoBuf() {
@@ -217,6 +231,7 @@ public SnapshotDiffJobProto toProtoBuf() {
.setFromSnapshot(fromSnapshot)
.setToSnapshot(toSnapshot)
.setForceFullDiff(forceFullDiff)
+ .setDisableNativeDiff(disableNativeDiff)
.setTotalDiffEntries(totalDiffEntries)
.build();
}
@@ -232,6 +247,7 @@ public static SnapshotDiffJob getFromProtoBuf(
diffJobProto.getFromSnapshot(),
diffJobProto.getToSnapshot(),
diffJobProto.getForceFullDiff(),
+ diffJobProto.getDisableNativeDiff(),
diffJobProto.getTotalDiffEntries());
}
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
index da9e45ebc3fb..962eb9eb5757 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
@@ -720,13 +720,15 @@ default List listSnapshot(
* @return the difference report between two snapshots
* @throws IOException in case of any exception while generating snapshot diff
*/
+ @SuppressWarnings("parameternumber")
default SnapshotDiffResponse snapshotDiff(String volumeName,
String bucketName,
String fromSnapshot,
String toSnapshot,
String token,
int pageSize,
- boolean forceFullDiff)
+ boolean forceFullDiff,
+ boolean disableNativeDiff)
throws IOException {
throw new UnsupportedOperationException("OzoneManager does not require " +
"this to be implemented");
diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
index 2c0aef893b14..348e364a421f 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
@@ -1232,7 +1232,8 @@ public SnapshotDiffResponse snapshotDiff(String volumeName,
String toSnapshot,
String token,
int pageSize,
- boolean forceFullDiff)
+ boolean forceFullDiff,
+ boolean disableNativeDiff)
throws IOException {
final OzoneManagerProtocolProtos.SnapshotDiffRequest.Builder
requestBuilder =
@@ -1242,7 +1243,8 @@ public SnapshotDiffResponse snapshotDiff(String volumeName,
.setFromSnapshot(fromSnapshot)
.setToSnapshot(toSnapshot)
.setPageSize(pageSize)
- .setForceFullDiff(forceFullDiff);
+ .setForceFullDiff(forceFullDiff)
+ .setDisableNativeDiff(disableNativeDiff);
if (!StringUtils.isBlank(token)) {
requestBuilder.setToken(token);
diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
index dd58791c48d8..4ae27046c997 100644
--- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
+++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshot.java
@@ -16,10 +16,19 @@
*/
package org.apache.hadoop.ozone.om;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.time.Duration;
import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.fs.FSDataOutputStream;
+import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdds.utils.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
@@ -30,8 +39,11 @@
import org.apache.hadoop.hdds.utils.db.RDBStore;
import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksObjectUtils;
import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport;
+import org.apache.hadoop.hdds.utils.db.Table;
+import org.apache.hadoop.hdds.utils.db.TableIterator;
import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport.DiffReportEntry;
import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.TestDataUtil;
import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneBucket;
@@ -46,6 +58,7 @@
import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus;
+import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
import org.apache.hadoop.ozone.om.service.SnapshotDiffCleanupService;
@@ -79,6 +92,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -106,8 +120,8 @@
import static org.apache.hadoop.ozone.snapshot.CancelSnapshotDiffResponse.CancelMessage.CANCEL_SUCCEEDED;
import static org.apache.hadoop.ozone.snapshot.SnapshotDiffResponse.JobStatus.CANCELLED;
import static org.apache.hadoop.ozone.snapshot.SnapshotDiffResponse.JobStatus.DONE;
-import static org.awaitility.Awaitility.with;
import static org.apache.hadoop.ozone.snapshot.SnapshotDiffResponse.JobStatus.IN_PROGRESS;
+import static org.awaitility.Awaitility.with;
import static org.awaitility.Awaitility.await;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -136,6 +150,7 @@ public class TestOmSnapshot {
private static BucketLayout bucketLayout = BucketLayout.LEGACY;
private static boolean enabledFileSystemPaths;
private static boolean forceFullSnapshotDiff;
+ private static boolean disableNativeDiff;
private static ObjectStore store;
private static OzoneManager ozoneManager;
private static RDBStore rdbStore;
@@ -157,14 +172,15 @@ public class TestOmSnapshot {
@Parameterized.Parameters
public static Collection