This is an automated email from the ASF dual-hosted git repository.
zhongjiajie pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 9e60632201 fix: Local resource error in some entrypoint (#14826)
9e60632201 is described below
commit 9e60632201a031dffe7b21cefcc3bc550edbe608
Author: Jay Chung <[email protected]>
AuthorDate: Mon Aug 28 21:16:16 2023 +0800
fix: Local resource error in some entrypoint (#14826)
Fix createResource, queryResourceListPaging, onlineCreateResource
resource error in local resource
---
.../api/service/impl/ResourcesServiceImpl.java | 41 +++++++++++++++++-----
1 file changed, 33 insertions(+), 8 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
index b18bd685b6..021fcdcc1c 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
@@ -24,6 +24,7 @@ import static
org.apache.dolphinscheduler.common.constants.Constants.FORMAT_SS;
import static
org.apache.dolphinscheduler.common.constants.Constants.FORMAT_S_S;
import static org.apache.dolphinscheduler.common.constants.Constants.JAR;
import static org.apache.dolphinscheduler.common.constants.Constants.PERIOD;
+import static org.apache.dolphinscheduler.common.enums.ResUploadType.HDFS;
import
org.apache.dolphinscheduler.api.dto.resources.DeleteDataTransferResponse;
import org.apache.dolphinscheduler.api.dto.resources.ResourceComponent;
@@ -241,7 +242,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
// check resource name exists
String userResRootPath = ResourceType.UDF.equals(type) ?
storageOperate.getUdfDir(tenantCode)
: storageOperate.getResDir(tenantCode);
- String currDirNFileName = !currentDir.contains(userResRootPath) ?
userResRootPath + name : currentDir + name;
+ String currDirNFileName = getOnlineCreatePath(currentDir,
userResRootPath) + name;
try {
if (checkResourceExists(currDirNFileName)) {
@@ -561,7 +562,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
String baseDir = isAdmin(loginUser) ?
storageOperate.getDir(ResourceType.ALL, tenantCode)
: storageOperate.getDir(type, tenantCode);
if (!isUserTenantValid(isAdmin(loginUser), tenantCode, resTenantCode)
- || (StringUtils.isNotBlank(fullName) &&
!StringUtils.startsWith(fullName, baseDir))) {
+ || isMatchBaseDir(fullName, baseDir)) {
log.error("current user does not have permission");
putMsg(result, Status.NO_CURRENT_OPERATING_PERMISSION);
return result;
@@ -1206,13 +1207,8 @@ public class ResourcesServiceImpl extends
BaseServiceImpl implements ResourcesSe
String name = fileName.trim() + "." + nameSuffix;
- String fullName = "";
String userResRootPath = storageOperate.getResDir(tenantCode);
- if (!currentDir.contains(userResRootPath)) {
- fullName = userResRootPath + name;
- } else {
- fullName = currentDir + name;
- }
+ String fullName = getOnlineCreatePath(currentDir, userResRootPath) +
name;
result = verifyResourceName(fullName, type, loginUser);
if (!result.getCode().equals(Status.SUCCESS.getCode())) {
@@ -1822,6 +1818,35 @@ public class ResourcesServiceImpl extends
BaseServiceImpl implements ResourcesSe
return true;
}
+ private boolean isLocal(String baseDir) {
+ return storageOperate.returnStorageType() == HDFS &&
baseDir.startsWith("file:///");
+ }
+
+ /**
+ * Check whether the full name is in the correct base directory. Local
storage full path with value `file:/path/to/file`
+ * instead of of `file:///path/to/file`
+ */
+ private boolean isMatchBaseDir(String fullName,
+ String baseDir) {
+ if (isLocal(baseDir)) {
+ String midBaseDir = baseDir.replace("file:///", "file:/");
+ return (StringUtils.isNotBlank(fullName) &&
!StringUtils.startsWith(fullName, midBaseDir));
+ }
+ return (StringUtils.isNotBlank(fullName) &&
!StringUtils.startsWith(fullName, baseDir));
+ }
+
+ /**
+ * Get online create path. Local storage full path with value
`file:/path/to/file` instead of `file:///path/to/file`
+ */
+ private String getOnlineCreatePath(String currentDir,
+ String userResRootPath) {
+ if (isLocal(userResRootPath)) {
+ String midUserResRootPath = userResRootPath.replace("file:///",
"file:/");
+ return currentDir.contains(midUserResRootPath) ? currentDir :
userResRootPath;
+ }
+ return currentDir.contains(userResRootPath) ? currentDir :
userResRootPath;
+ }
+
private String getTenantCode(User user) {
Tenant tenant = tenantMapper.queryById(user.getTenantId());
if (tenant == null) {