HDDS-13906. Reduce Bootstrap Write lock time on OM during bootstrapping execution.#9585
Conversation
There was a problem hiding this comment.
Thanks for the patch @sadanand48 . Have a few doubts with the implementation
|
@rnblough Do you wanna take a look at this patch? |
There was a problem hiding this comment.
Pull request overview
This PR reduces the Bootstrap write lock time during OM bootstrapping by refactoring the checkpoint streaming process. The key change is separating the file collection phase (which creates hardlinks while holding the lock) from the actual tar streaming phase (which now happens outside the lock).
Changes:
- Introduced
OMDBArchiverclass to manage hardlink creation and deferred tar writing - Refactored
OMDBCheckpointServletInodeBasedXferto collect files under lock and write outside lock - Updated tests to work with the new two-phase approach
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 15 comments.
| File | Description |
|---|---|
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBArchiver.java | New class that manages hardlink creation during lock phase and tar writing outside lock |
| hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java | Refactored to use two-phase approach: collectDbDataToTransfer (under lock) and writeToArchive (outside lock) |
| hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMDBArchiver.java | New test class covering OMDBArchiver functionality |
| hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServletInodeBasedXfer.java | Updated integration tests to work with new method signatures and two-phase approach |
Comments suppressed due to low confidence (1)
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java:192
- Potential resource leak: If an IOException occurs in the second try block (lines 173-182) after successfully creating the OMDBArchiver and collecting data, the hardlinks created in the tmpDir may not be cleaned up properly. The cleanup in the finally block only deletes the tmpDir, but if writeToArchive fails, the hardlink files stored in filesToWriteIntoTarball map won't be explicitly deleted since the cleanup happens in writeToArchive's finally block. Consider adding explicit cleanup of the archiver's resources in the outer finally block.
try {
Instant start = Instant.now();
OutputStream outputStream = response.getOutputStream();
omdbArchiver.writeToArchive(getConf(), outputStream);
Instant end = Instant.now();
long duration = Duration.between(start, end).toMillis();
LOG.info("Time taken to write the checkpoint to response output " +
"stream: {} milliseconds", duration);
} catch (IOException e) {
LOG.error("unable to write to archive stream", e);
} finally {
try {
if (tmpdir != null) {
FileUtils.deleteDirectory(tmpdir.toFile());
}
} catch (IOException e) {
LOG.error("unable to delete: " + tmpdir, e.toString());
}
}
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
jojochuang
left a comment
There was a problem hiding this comment.
There was a github glitch and my comments were not sent out.
IMO we can merge as is. We could refactor the code later but right now I want to unblock this one.
| // we finished transferring files from snapshot DB's by now and | ||
| // this is the last step where we transfer the active om.db contents | ||
| Map<String, String> hardLinkFileMap = new HashMap<>(); | ||
| omdbArchiver.setHardLinkFileMap(hardLinkFileMap); |
There was a problem hiding this comment.
this line doesn't make much sense to me.... setting an internal reference to an empty hash map.
In fact we can rewrite to get rid of setHardLinkFileMap() method.
it's fine but it's going to need some cleanup to make the logic more clear.
| * handling deduplication and managing resource locking. | ||
| * Collects the snapshots to be transferred from the specified snapshot directories | ||
| * into the archive output stream. | ||
| * |
There was a problem hiding this comment.
| * | |
| * @param omdbArchiver helper to archive the OM DB. | |
| * @throws IOException if an I/O error occurs during processing. |
| * | ||
| * @param sstFilesToExclude Set of SST file identifiers to exclude from the archive. | ||
| * @param tmpdir Temporary directory for intermediate processing. | ||
| * @param snapshotPaths Set of paths to snapshot directories to be processed. |
There was a problem hiding this comment.
| * @param snapshotPaths Set of paths to snapshot directories to be processed. | |
| @VisibleForTesting | |
| void collectSnapshotData(Set<String> sstFilesToExclude, Collection<Path> snapshotPaths, |
smengcl
left a comment
There was a problem hiding this comment.
Thanks @sadanand48 for the patch.
| } catch (IOException e) { | ||
| LOG.error("unable to write to archive stream", e); | ||
| } finally { |
There was a problem hiding this comment.
IIUC we should return 500 here as well? Other than that we can merge it and address remaining issues later
| } catch (IOException e) { | |
| LOG.error("unable to write to archive stream", e); | |
| } finally { | |
| } catch (IOException e) { | |
| LOG.error("unable to write to archive stream", e); | |
| response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); | |
| } finally { |
|
Merged. Opened https://issues.apache.org/jira/browse/HDDS-14629 to track the follow up tasks. |
What changes were proposed in this pull request?
Because of fixes in HDDS-13905 an entire BG service task would be blocked because of bootstrap operation running on a leader OM. One possible improvement here would be to just to create a hardlink(which we already do to ensure this file doesn't get deleted by rocksdb operations but we also write the file into the Tarball stream synchronously
ozone/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/Archiver.java
Lines 135 to 155 in 96390ac
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-13906
How was this patch tested?
Will add tests