rakeshadr commented on a change in pull request #1404: URL: https://github.com/apache/hadoop-ozone/pull/1404#discussion_r496818679
########## File path: hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileRequest.java ########## @@ -129,6 +134,131 @@ public static OMPathInfo verifyFilesInPath( return new OMPathInfo(missing, OMDirectoryResult.NONE, inheritAcls); } + /** + * Verify any dir/key exist in the given path in the specified + * volume/bucket by iterating through directory table. + * + * @param omMetadataManager OM Metadata manager + * @param volumeName volume name + * @param bucketName bucket name + * @param keyName key name + * @param keyPath path + * @return OMPathInfoV1 path info object + * @throws IOException on DB failure + */ + public static OMPathInfoV1 verifyDirectoryKeysInPath( + @Nonnull OMMetadataManager omMetadataManager, + @Nonnull String volumeName, + @Nonnull String bucketName, @Nonnull String keyName, + @Nonnull Path keyPath) throws IOException { + + String leafNodeName = OzoneFSUtils.getFileName(keyName); + List<String> missing = new ArrayList<>(); + List<OzoneAcl> inheritAcls = new ArrayList<>(); + OMDirectoryResult result = OMDirectoryResult.NONE; + + Iterator<Path> elements = keyPath.iterator(); + // TODO: volume id and bucket id generation logic. + String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); + OmBucketInfo omBucketInfo = + omMetadataManager.getBucketTable().get(bucketKey); + inheritAcls = omBucketInfo.getAcls(); + long lastKnownParentId = omBucketInfo.getObjectID(); + OmDirectoryInfo parentDirInfo = null; + String dbDirName = ""; // absolute path for trace logs + // for better logging + StringBuilder fullKeyPath = new StringBuilder(bucketKey); + while (elements.hasNext()) { + String fileName = elements.next().toString(); + fullKeyPath.append(OzoneConsts.OM_KEY_PREFIX); + fullKeyPath.append(fileName); + if (missing.size() > 0) { + // Add all the sub-dirs to the missing list except the leaf element. + // For example, /vol1/buck1/a/b/c/d/e/f/file1.txt. + // Assume /vol1/buck1/a/b/c exists, then add d, e, f into missing list. + if(elements.hasNext()){ + // skips leaf node. + missing.add(fileName); + } + continue; + } + + // For example, /vol1/buck1/a/b/c/d/e/f/file1.txt + // 1. Do lookup on directoryTable. If not exists goto next step. + // 2. Do look on keyTable. If not exists goto next step. + // 3. Add 'sub-dir' to missing parents list + String dbNodeName = omMetadataManager.getOzonePathKey( + lastKnownParentId, fileName); + OmDirectoryInfo omDirInfo = omMetadataManager.getDirectoryTable(). + get(dbNodeName); + if (omDirInfo != null) { + dbDirName += omDirInfo.getName() + OzoneConsts.OZONE_URI_DELIMITER; + if (elements.hasNext()) { + result = OMDirectoryResult.DIRECTORY_EXISTS_IN_GIVENPATH; + lastKnownParentId = omDirInfo.getObjectID(); + inheritAcls = omDirInfo.getAcls(); + continue; + } else { + // Checked all the sub-dirs till the leaf node. + // Found a directory in the given path. + result = OMDirectoryResult.DIRECTORY_EXISTS; + } + } else { + // Get parentID from the lastKnownParent. For any files, directly under + // the bucket, the parent is the bucketID. Say, "/vol1/buck1/file1" + // TODO: Need to add UT for this case along with OMFileCreateRequest. + if (omMetadataManager.getKeyTable().isExist(dbNodeName)) { + if (elements.hasNext()) { + // Found a file in the given key name. + result = OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH; + } else { + // Checked all the sub-dirs till the leaf file. + // Found a file with the given key name. + result = OMDirectoryResult.FILE_EXISTS; + } + break; // Skip directory traversal as it hits key. + } + + // Add to missing list, there is no such file/directory with given name. + if (elements.hasNext()) { + missing.add(fileName); + } + + String dbDirKeyName = omMetadataManager.getOzoneDirKey(volumeName, + bucketName, dbDirName); + LOG.trace("Acls inherited from parent " + dbDirKeyName + " are : " + + inheritAcls); + } + } + + if (result == OMDirectoryResult.DIRECTORY_EXISTS_IN_GIVENPATH) { Review comment: As this is a utility function, I would like to return `fullKeyPath` this as well. Caller can take a decision to use it or not. I will remove DIRECTORY_EXISTS_IN_GIVENPATH check here. But I would like to return result with DIRECTORY_EXISTS_IN_GIVENPATH just to make it readable. Hope thats fine! ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: ozone-issues-unsubscr...@hadoop.apache.org For additional commands, e-mail: ozone-issues-h...@hadoop.apache.org