This is an automated email from the ASF dual-hosted git repository. ChenSammi pushed a commit to branch HDDS-8342 in repository https://gitbox.apache.org/repos/asf/ozone.git
commit fa19431a184c5e06a7327c2a8940a220fadb9a8b Author: Sammi Chen <[email protected]> AuthorDate: Tue Jul 14 11:52:32 2026 +0800 Revert "HDDS-15467. Do not fall back to the OM starter user in OMClientRequest (#10469)" This reverts commit 6f0b5a3b3909239fa672883317fec3bf84c202c8. --- .../hadoop/ozone/om/request/OMClientRequest.java | 39 ++++++-- .../om/request/key/OMAllocateBlockRequest.java | 4 +- .../ozone/om/request/key/OMKeyDeleteRequest.java | 2 +- .../ozone/om/request/key/OMKeyRenameRequest.java | 2 +- .../TestOMClientRequestUserInfoFallback.java | 106 --------------------- 5 files changed, 35 insertions(+), 118 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java index 9ffdef1784b..884c5fa310b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java @@ -115,7 +115,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) .setVersion(ozoneManager.getVersionManager().getMetadataLayoutVersion()) .build(); omRequest = getOmRequest().toBuilder() - .setUserInfo(getUserInfo()) + .setUserInfo(getUserIfNotExists(ozoneManager)) .setLayoutVersion(layoutVersion).build(); return omRequest; } @@ -193,18 +193,41 @@ public OzoneManagerProtocolProtos.UserInfo getUserInfo() throws IOException { && grpcContextClientIpAddress != null) { userInfo.setHostName(grpcContextClientHostname); userInfo.setRemoteAddress(grpcContextClientIpAddress); - } else if (omRequest.hasUserInfo() - && omRequest.getUserInfo().hasRemoteAddress()) { - // For non-RPC internal service requests (e.g. the Trash emptier) that - // populate their own UserInfo, preserve the supplied host/address since - // there is no RPC or gRPC client context to derive it from. - userInfo.setHostName(omRequest.getUserInfo().getHostName()); - userInfo.setRemoteAddress(omRequest.getUserInfo().getRemoteAddress()); } return userInfo.build(); } + /** + * For non-rpc internal calls Server.getRemoteUser() + * and Server.getRemoteIp() will be null. + * Passing getCurrentUser() and Ip of the Om node that started it. + * @return User Info. + */ + public OzoneManagerProtocolProtos.UserInfo getUserIfNotExists( + OzoneManager ozoneManager) throws IOException { + OzoneManagerProtocolProtos.UserInfo userInfo = getUserInfo(); + if (!userInfo.hasRemoteAddress() || !userInfo.hasUserName()) { + OzoneManagerProtocolProtos.UserInfo.Builder newuserInfo = + OzoneManagerProtocolProtos.UserInfo.newBuilder(); + UserGroupInformation user; + InetAddress remoteAddress; + try { + user = UserGroupInformation.getCurrentUser(); + remoteAddress = ozoneManager.getOmRpcServerAddr() + .getAddress(); + } catch (Exception e) { + LOG.debug("Couldn't get om Rpc server address", e); + return getUserInfo(); + } + newuserInfo.setUserName(user.getUserName()); + newuserInfo.setHostName(remoteAddress.getHostName()); + newuserInfo.setRemoteAddress(remoteAddress.getHostAddress()); + return newuserInfo.build(); + } + return getUserInfo(); + } + /** * Check Acls of ozone object. * @param ozoneManager diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java index f85cc8b777e..0e11f1d7677 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java @@ -102,7 +102,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { // BlockOutputStreamEntryPool, so we are fine for now. But if one some // one uses direct omclient we might be in trouble. - UserInfo userInfo = getOmRequest().getUserInfo(); + UserInfo userInfo = getUserIfNotExists(ozoneManager); ReplicationConfig repConfig = ReplicationConfig.fromProto(keyArgs.getType(), keyArgs.getFactor(), keyArgs.getEcReplicationConfig()); // To allocate atleast one block passing requested size and scmBlockSize @@ -133,7 +133,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { newAllocatedBlockRequest.setKeyLocation( omKeyLocationInfoList.get(0).getProtobuf(getOmRequest().getVersion())); - return getOmRequest().toBuilder() + return getOmRequest().toBuilder().setUserInfo(userInfo) .setAllocateBlockRequest(newAllocatedBlockRequest).build(); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java index 820c4d17197..26287ca66d2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java @@ -92,7 +92,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { return getOmRequest().toBuilder() .setDeleteKeyRequest(deleteKeyRequest.toBuilder() .setKeyArgs(resolvedArgs)) - .build(); + .setUserInfo(getUserIfNotExists(ozoneManager)).build(); } protected KeyArgs resolveBucketAndCheckAcls(OzoneManager ozoneManager, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java index 2c2e54d3a7b..850f111a913 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java @@ -95,7 +95,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { return getOmRequest().toBuilder() .setRenameKeyRequest(renameKeyRequest.toBuilder().setToKeyName(dstKey) .setKeyArgs(resolvedArgs)) - .build(); + .setUserInfo(getUserIfNotExists(ozoneManager)).build(); } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestUserInfoFallback.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestUserInfoFallback.java deleted file mode 100644 index 202ada1b016..00000000000 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestUserInfoFallback.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.ozone.om.request; - -import static org.apache.hadoop.ozone.om.request.OMRequestTestUtils.newBucketInfoBuilder; -import static org.apache.hadoop.ozone.om.request.OMRequestTestUtils.newCreateBucketRequest; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mockStatic; - -import java.util.UUID; -import org.apache.hadoop.hdds.protocol.proto.HddsProtos.StorageTypeProto; -import org.apache.hadoop.ipc_.Server; -import org.apache.hadoop.ozone.om.request.bucket.OMBucketCreateRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.BucketInfo; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.UserInfo; -import org.apache.hadoop.security.authentication.client.AuthenticationException; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; - -/** - * Tests that {@link OMClientRequest} does not silently fall back to the OM - * starter/login user when a request carries no user information (HDDS-15467). - */ -public class TestOMClientRequestUserInfoFallback { - - private OMRequest newBucketRequest(UserInfo userInfo) { - BucketInfo.Builder bucketInfo = newBucketInfoBuilder( - UUID.randomUUID().toString(), UUID.randomUUID().toString()) - .setIsVersionEnabled(true) - .setStorageType(StorageTypeProto.DISK); - OMRequest.Builder builder = newCreateBucketRequest(bucketInfo); - if (userInfo != null) { - builder.setUserInfo(userInfo); - } - return builder.build(); - } - - /** - * With no RPC/gRPC context and no UserInfo on the request, getUserInfo() must - * not manufacture an identity from the OM starter user; createUGI() then - * fails closed instead of silently escalating. - */ - @Test - public void noFallbackToServerUserWhenUserInfoMissing() throws Exception { - try (MockedStatic<Server> mockedRpcServer = mockStatic(Server.class)) { - mockedRpcServer.when(Server::getRemoteUser).thenReturn(null); - mockedRpcServer.when(Server::getRemoteIp).thenReturn(null); - - OMRequest omRequest = newBucketRequest(null); - OMClientRequest request = new OMBucketCreateRequest(omRequest); - - UserInfo userInfo = request.getUserInfo(); - assertFalse(userInfo.hasUserName()); - assertFalse(userInfo.hasRemoteAddress()); - - OMClientRequest withUserInfo = new OMBucketCreateRequest( - omRequest.toBuilder().setUserInfo(userInfo).build()); - assertThrows(AuthenticationException.class, withUserInfo::createUGI); - } - } - - /** - * An internal service (e.g. the Trash emptier) populates its own UserInfo. - * With no RPC/gRPC context, getUserInfo() must preserve that identity rather - * than replacing it with the OM starter user. - */ - @Test - public void internalServiceUserInfoIsPreserved() throws Exception { - try (MockedStatic<Server> mockedRpcServer = mockStatic(Server.class)) { - mockedRpcServer.when(Server::getRemoteUser).thenReturn(null); - mockedRpcServer.when(Server::getRemoteIp).thenReturn(null); - - UserInfo serviceUserInfo = UserInfo.newBuilder() - .setUserName("trash-service-user") - .setHostName("om-host") - .setRemoteAddress("10.0.0.9") - .build(); - - OMClientRequest request = - new OMBucketCreateRequest(newBucketRequest(serviceUserInfo)); - - UserInfo result = request.getUserInfo(); - assertEquals("trash-service-user", result.getUserName()); - assertEquals("10.0.0.9", result.getRemoteAddress()); - assertEquals("om-host", result.getHostName()); - } - } -} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
