ArafatKhan2198 commented on code in PR #6492:
URL: https://github.com/apache/ozone/pull/6492#discussion_r1588853390
##########
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java:
##########
@@ -246,25 +254,83 @@ public void untarCheckpointFile(File tarFile, Path
destPath)
}
}
+
+ /**
+ * Constructs the full path of a key from its OmKeyInfo using a bottom-up
approach, starting from the leaf node.
+ *
+ * The method begins with the leaf node (the key itself) and recursively
prepends parent directory names, fetched
+ * via NSSummary objects, until reaching the parent bucket (parentId is -1).
It effectively builds the path from
+ * bottom to top, finally prepending the volume and bucket names to complete
the full path.
+ *
+ * @param omKeyInfo The OmKeyInfo object for the key
+ * @return The constructed full path of the key as a String.
+ * @throws IOException
+ */
+ public static String constructFullPath(OmKeyInfo omKeyInfo,
+ ReconNamespaceSummaryManager
reconNamespaceSummaryManager,
+ ReconOMMetadataManager
omMetadataManager)
+ throws IOException {
+ StringBuilder fullPath = new StringBuilder(omKeyInfo.getKeyName());
+ long parentId = omKeyInfo.getParentObjectID();
+ boolean isDirectoryPresent = false;
+ boolean rebuildTriggered = false;
+
+ while (parentId != 0) {
+ NSSummary nsSummary =
reconNamespaceSummaryManager.getNSSummary(parentId);
+ if (nsSummary == null) {
+ break;
+ }
+ if (nsSummary.getParentId() == -1 && !rebuildTriggered) {
+ // Trigger rebuild asynchronously and continue path construction
+ triggerRebuild(reconNamespaceSummaryManager, omMetadataManager);
Review Comment:
Thanks for pointing this out this indeed was a major problem which got
overlooked.
We have made the following changes to prevent it from happening
1. **Add Synchronization for Thread Safety**:
In this change, the **`rebuildTriggered`** variable is checked and
potentially updated within a **`synchronized`** block to prevent multiple
threads from entering the block simultaneously. This ensures that the rebuild
is truly triggered only once, regardless of how many times
**`constructFullPath`** is called concurrently.
2. **Define a Static Variable at the Class Level**:
You can define a static boolean variable within the **`ReconUtils`** class
to manage whether the rebuild has been triggered. This variable will be
accessible from the **`constructFullPath`** method and will ensure that the
rebuild operation is triggered only once.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]