-
Notifications
You must be signed in to change notification settings - Fork 594
HDDS-13912. Modularise Snapshot Delta file computer (Full Diff) #9283
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Change-Id: Iba47aeb21663dfa407ab71339cef02c0d74b49f2
Change-Id: Ifd2feca1fddb144e4955db025f0b15a2ab1f3bfe
Change-Id: I34536ff06efb7d5a4942853f0fd83942ab398b5f
…otLocalDataManager Change-Id: I34536ff06efb7d5a4942853f0fd83942ab398b5f
Change-Id: I32bcaf2a1fb290f1790c02872a0230cd65586636
Change-Id: I105a2e8178c0444d52de41b99801f4ceb6d57ffd # Conflicts: # hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/util/Checksum.java # hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/util/ObjectSerializer.java # hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/util/YamlSerializer.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotLocalDataYaml.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/OmSnapshotLocalDataManager.java # hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotLocalDataYaml.java
Change-Id: I985170e38fb8beeb784048e85a08a4c79e1aec97
Change-Id: I33e6e6e825bf23c323ad7ed593d800a11720fa4f
Change-Id: If30b2c766db82adde72145c8ecd3e590ef54cc2d
Change-Id: Id3f2c49050bc3476b9e0f5f51dacb6d9acc4c2f7
Change-Id: I432960725b4c6c55aa906b5780cc3027e41e10db
Change-Id: I3c5514e5bbd251a2b5297d8f074cfde5c71fa543
Change-Id: Ib5a9e6c91bdccba17820263c47eaf2c8400e930d
Change-Id: Ica36e0615c7bc6aa9b6a7f6fafafd0f830d4bafb
Change-Id: I26b66f266bb7677e4b1078f5fcd9f2ce3a651a70 # Conflicts: # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/OmSnapshotLocalDataManager.java
Change-Id: I1d93dbc048a42cc55ff1f8ffa420e52f967527b8
Change-Id: I34202928a7a367dd0a1e57219317ff34de352b78
Change-Id: Iad6f26cb71ec921c51ee2d138745df1a2663533f
Change-Id: Ic5f7e249cfb9cb3973cbcd4abd36b22a6ff8f5aa
…calDataProvider Change-Id: I3a004b4b435075a4348960aeed642e8da71e7e72
Change-Id: I06990bc9ab8fc7e1eb7bec255646a650bd8c35fe
Change-Id: I4c6c61c83aa9fadab8ecef854b99dcc0a89a2208
Change-Id: I0e476322372a302572f1fe79cbf2e874bfeac2ed
Change-Id: I31004e0c95dad64411c6fe848501a82f2f773cba
Change-Id: Id317c8b56e8b25c122b68eaf96599b9690d08f79
Change-Id: I3849387d064e093634e69cdaf870d27c1934cda5 # Conflicts: # hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/util/ObjectSerializer.java # hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/util/YamlSerializer.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotLocalData.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotLocalDataYaml.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/OmSnapshotLocalDataManager.java
Change-Id: Ie5e5f3dab4324103e8855dd15619d7755f0422e6
Change-Id: I55bd5c3ef7fc32910a9111328638de2edffcd541
Change-Id: I880997d3eebdf378f14c203c61c2d63b2d17552e
Change-Id: I13ba8e2fd012a3c964d657e83496c93a4f55a3be
Change-Id: Iaad718f0c7bc23c67650144c0c7ac26f0060a437
Change-Id: Id2be646eeb0aa1d264211bf2950803bcb2839ce9
Change-Id: I83fe0a362530c9aeddee5f959b135a7b282e617f # Conflicts: # hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/StringInMemoryTestTable.java # hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
Change-Id: Ie3d199a6401b01af35e63781e2b6656d6aa1d5e9
Change-Id: I1d7aded575ac6daaa5f78b3be9f1821d94cb24c6
Change-Id: Iba0dd30952d17d11eae900213437aa4c28564448
Change-Id: Idba640c859ed4906842f9fafebf04825409053ef
Change-Id: I47fca4c2ca1738b533992851fa54291cb109cc39
Change-Id: Id07b78b650ce58fcc71bbac478d085b139123b02
Change-Id: Iacf5dd1fd2013d6203ea7003645cb79433186519
Change-Id: I22a212c84a3dbcd66a8e61a940d4df239b73133f
Change-Id: Idc5174ef66392fe16693aa8799aa51db7277a0e0 # Conflicts: # hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java # hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/SstFileInfo.java # hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java # hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDiffUtils.java
Change-Id: Ib313080b2ffa2f6e7545ae817f5e456cabc5dba7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR modularizes the snapshot delta file computation logic by introducing a clean abstraction layer. The changes extract the getINode utility method to a common location and create a new package structure with an interface-based design for computing delta files between snapshots.
- Introduces
DeltaFileComputerinterface as a contract for delta file computation - Creates
FileLinkDeltaFileComputerabstract base class that handles hard link creation and common operations - Implements
FullDiffComputeras a concrete implementation using inode-based comparison with fallback to full file list comparison - Moves
getINodeutility fromOmSnapshotUtilstoIOUtilsfor broader reuse across modules
Reviewed Changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/DeltaFileComputer.java | Defines the public interface for delta file computation between snapshots |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/FileLinkDeltaFileComputer.java | Abstract base class implementing common hard link creation logic and snapshot management |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/FullDiffComputer.java | Package-private concrete implementation performing full diff computation with inode optimization |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/package-info.java | Package documentation for the new delta computation package |
| hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/IOUtils.java | Adds relocated getINode utility method for retrieving file inodes |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/OmSnapshotUtils.java | Removes getINode method (moved to IOUtils) |
| hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/SstFileInfo.java | Updates getFilePath to use getter method instead of direct field access |
| hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdb/util/RdbUtil.java | Updates to use relocated getINode from IOUtils |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java | Updates to use relocated getINode from IOUtils |
| hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOmSnapshotUtils.java | Updates import to use relocated getINode |
| hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java | Updates import to use relocated getINode |
| hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMRatisSnapshots.java | Updates import to use relocated getINode |
| hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/TestFullDiffComputer.java | Comprehensive unit tests for FullDiffComputer covering various delta computation scenarios |
| hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/diff/delta/TestFileLinkDeltaFileComputer.java | Unit tests for FileLinkDeltaFileComputer covering link creation, directory management, and error handling |
Comments suppressed due to low confidence (1)
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/OmSnapshotUtils.java:77
- Access of element annotated with VisibleForTesting found in production code.
Object inode = getINode(file);
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| * @return an {@code Optional} containing a collection of pairs, where each pair consists of a | ||
| * {@code Path} representing the delta file and an associated {@code SstFileInfo}, or | ||
| * an empty {@code Optional} if no changes are found |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The return type documentation is incorrect. The method returns a Collection directly, not an Optional containing a collection. The JavaDoc should state:
@return a collection of pairs, where each pair consists of a Path representing the delta file and an associated SstFileInfo
Remove the mention of "an empty Optional if no changes are found" as the method throws IOException when delta files cannot be computed.
| * @return an {@code Optional} containing a collection of pairs, where each pair consists of a | |
| * {@code Path} representing the delta file and an associated {@code SstFileInfo}, or | |
| * an empty {@code Optional} if no changes are found | |
| * @return a collection of pairs, where each pair consists of a {@code Path} representing the delta file | |
| * and an associated {@code SstFileInfo} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
| private final OMMetadataManager activeMetadataManager; | ||
| private final Consumer<SubStatus> activityReporter; | ||
| private Path deltaDir; | ||
| private AtomicInteger linkFileCounter = new AtomicInteger(0); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The linkFileCounter field is not declared as final, which could lead to unexpected behavior if the reference is accidentally reassigned. Consider making it final:
private final AtomicInteger linkFileCounter = new AtomicInteger(0);| private AtomicInteger linkFileCounter = new AtomicInteger(0); | |
| private final AtomicInteger linkFileCounter = new AtomicInteger(0); |
| do { | ||
| link = deltaDir.resolve(linkFileCounter.incrementAndGet() + extension); | ||
| try { | ||
| Files.createLink(link, source); | ||
| createdLink = true; | ||
| } catch (FileAlreadyExistsException ignored) { | ||
| LOG.info("File for source {} already exists: at {}. Will attempt to create link with a different path", source, | ||
| link); | ||
| } | ||
| } while (!createdLink); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The infinite loop with do-while (!createdLink) lacks a safety mechanism to prevent infinite loops in case of persistent failures. Consider adding a maximum retry limit to prevent resource exhaustion:
int maxRetries = 1000;
int attempts = 0;
do {
if (++attempts > maxRetries) {
throw new IOException("Failed to create link after " + maxRetries + " attempts for path: " + source);
}
link = deltaDir.resolve(linkFileCounter.incrementAndGet() + extension);
try {
Files.createLink(link, source);
createdLink = true;
} catch (FileAlreadyExistsException ignored) {
LOG.info("File for source {} already exists: at {}. Will attempt to create link with a different path", source, link);
}
} while (!createdLink);There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this shouldn't happen ideally. Not required
| try { | ||
| Files.createLink(link, source); | ||
| createdLink = true; | ||
| } catch (FileAlreadyExistsException ignored) { |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Extra space before catch keyword. Should be:
} catch (FileAlreadyExistsException ignored) {| } catch (FileAlreadyExistsException ignored) { | |
| } catch (FileAlreadyExistsException ignored) { |
| fromSnapshot.getBucketName()); | ||
| return computeDeltaFiles(fromSnapshot, toSnapshot, tablesToLookup, | ||
| tablePrefixInfo).map(Map::values).orElseThrow(() -> new IOException(String.format( | ||
| "Failed to compute delta files for snapshots %s and %s tablesToLookup : %s", fromSnapshot, toSnapshot, |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message contains inconsistent formatting with a missing space before "tablesToLookup". Should be:
"Failed to compute delta files for snapshots %s and %s. tablesToLookup: %s"or
"Failed to compute delta files for snapshots %s and %s, tablesToLookup: %s"| "Failed to compute delta files for snapshots %s and %s tablesToLookup : %s", fromSnapshot, toSnapshot, | |
| "Failed to compute delta files for snapshots %s and %s. tablesToLookup: %s", fromSnapshot, toSnapshot, |
| Path fromSnapshotPath = fromSnapshot.getMetadataManager().getStore().getDbLocation().getAbsoluteFile().toPath(); | ||
| Path toSnapshotPath = toSnapshot.getMetadataManager().getStore().getDbLocation().getAbsoluteFile().toPath(); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Access of element annotated with VisibleForTesting found in production code.
| Path fromSnapshotPath = fromSnapshot.getMetadataManager().getStore().getDbLocation().getAbsoluteFile().toPath(); | |
| Path toSnapshotPath = toSnapshot.getMetadataManager().getStore().getDbLocation().getAbsoluteFile().toPath(); | |
| Path fromSnapshotPath = fromSnapshot.getMetadataManager().getStore().getDbPath(); | |
| Path toSnapshotPath = toSnapshot.getMetadataManager().getStore().getDbPath(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed the annotation not relevant anymore
| .getStore()).getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | ||
| } | ||
|
|
||
| static Set<SstFileInfo> getSSTFileSetForSnapshot(OmSnapshot snapshot, Set<String> tablesToLookUp, | ||
| TablePrefixInfo tablePrefixInfo) { | ||
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | ||
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Access of element annotated with VisibleForTesting found in production code.
| .getStore()).getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | |
| } | |
| static Set<SstFileInfo> getSSTFileSetForSnapshot(OmSnapshot snapshot, Set<String> tablesToLookUp, | |
| TablePrefixInfo tablePrefixInfo) { | |
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | |
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | |
| .getStore()).getDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | |
| } | |
| static Set<SstFileInfo> getSSTFileSetForSnapshot(OmSnapshot snapshot, Set<String> tablesToLookUp, | |
| TablePrefixInfo tablePrefixInfo) { | |
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | |
| .getDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed the annotation not relevant anymore
|
|
||
| static Map<Object, SstFileInfo> getSSTFileMapForSnapshot(OmSnapshot snapshot, | ||
| Set<String> tablesToLookUp, TablePrefixInfo tablePrefixInfo) throws IOException { | ||
| return filterRelevantSstFiles(RdbUtil.getSSTFilesWithInodesForComparison(((RDBStore)snapshot.getMetadataManager() |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Access of element annotated with VisibleForTesting found in production code.
| return filterRelevantSstFiles(RdbUtil.getSSTFilesWithInodesForComparison(((RDBStore)snapshot.getMetadataManager() | |
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed the annotation not relevant anymore
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | ||
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Access of element annotated with VisibleForTesting found in production code.
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | |
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | |
| // Use the production-safe method and convert its values to a Set | |
| Map<Object, SstFileInfo> sstFileMap = RdbUtil.getSSTFilesWithInodesForComparison( | |
| ((RDBStore)snapshot.getMetadataManager().getStore()).getDb().getManagedRocksDb(), tablesToLookUp); | |
| return filterRelevantSstFiles(sstFileMap, tablesToLookUp, tablePrefixInfo); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed the annotation not relevant anymore
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | ||
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); |
Copilot
AI
Nov 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Access of element annotated with VisibleForTesting found in production code.
| return filterRelevantSstFiles(RdbUtil.getSSTFilesForComparison(((RDBStore)snapshot.getMetadataManager().getStore()) | |
| .getDb().getManagedRocksDb(), tablesToLookUp), tablesToLookUp, tablePrefixInfo); | |
| // Use the public method getSSTFilesWithInodesForComparison instead of the @VisibleForTesting method. | |
| return filterRelevantSstFiles( | |
| RdbUtil.getSSTFilesWithInodesForComparison( | |
| ((RDBStore)snapshot.getMetadataManager().getStore()).getDb().getManagedRocksDb(), | |
| tablesToLookUp), | |
| tablesToLookUp, tablePrefixInfo); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed the annotation not relevant anymore
| * creating hard links for delta representation, and reporting activity | ||
| * during the computation process. | ||
| */ | ||
| public abstract class FileLinkDeltaFileComputer implements DeltaFileComputer { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
apart from test code, where does it get used?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This would be used in the PR #9312
| Optional<Map<Path, Pair<Path, SstFileInfo>>> computeDeltaFiles(SnapshotInfo fromSnapshotInfo, | ||
| SnapshotInfo toSnapshotInfo, Set<String> tablesToLookup, TablePrefixInfo tablePrefixInfo) throws IOException { | ||
| try (UncheckedAutoCloseableSupplier<OmSnapshot> fromSnapHandle = getSnapshot(fromSnapshotInfo); | ||
| UncheckedAutoCloseableSupplier<OmSnapshot> toSnapHandle = getSnapshot(toSnapshotInfo)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
snapshot cache acquires read lock, so the order of lock shouldn't matter.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah
Change-Id: If84ba7867beb780747fee43ea4535309e737e0ab
Change-Id: Ib3f53fbd48444a6ac5da037bb163b9d83b69fca1
Change-Id: I4174c1f303baef2542d69dc5a18c512e8ae2251b
jojochuang
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM this PR adds a set of utility classes to encapsulate delta files for snapshot diff operations.
| private final OmSnapshotManager omSnapshotManager; | ||
| private final OMMetadataManager activeMetadataManager; | ||
| private final Consumer<SubStatus> activityReporter; | ||
| private Path deltaDir; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
deltaDir is a path to a temporary directory whose life cycle is managed by an instance of this class.
|
|
||
| /** | ||
| * FullDiffComputer is a specialized implementation of FileLinkDeltaFileComputer | ||
| * that computes the delta files between two snapshots. It identifies the differences |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i think the phrase "delta file" needs a more clear definition.
That is,
- files that appear in the "to" snapshot but not in "from"
- files that appear in "from" but not in "to"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will update this javadoc in the next PR since the CI already passed.
What changes were proposed in this pull request?
Modularise SnapshotDiff computation for figuring out delta files between 2 snapshots.
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-13912
How was this patch tested?
Added unit tests