Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@

import java.io.IOException;
import java.nio.file.InvalidPathException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.audit.OMAction;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OMMetrics;
Expand Down Expand Up @@ -57,6 +60,34 @@ public OMVolumeDeleteRequest(OMRequest omRequest) {
super(omRequest);
}

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
OMRequest request = super.preExecute(ozoneManager);
DeleteVolumeRequest deleteVolumeRequest =
getOmRequest().getDeleteVolumeRequest();
Objects.requireNonNull(deleteVolumeRequest);
String volume = deleteVolumeRequest.getVolumeName();

// ACL check during preExecute
if (ozoneManager.getAclsEnabled()) {
try {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.DELETE, volume,
null, null);
} catch (IOException ex) {
// Ensure audit log captures preExecute failures
Map<String, String> auditMap = new LinkedHashMap<>();
auditMap.put(OzoneConsts.VOLUME, volume);
markForAudit(ozoneManager.getAuditLogger(),
buildAuditMessage(OMAction.DELETE_VOLUME, auditMap, ex,
request.getUserInfo()));
throw ex;
}
}

return request;
}

@Override
public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) {
final long transactionLogIndex = context.getIndex();
Expand All @@ -80,13 +111,6 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
String owner = null;
OMClientResponse omClientResponse = null;
try {
// check Acl
if (ozoneManager.getAclsEnabled()) {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.DELETE, volume,
null, null);
}

mergeOmLockDetails(omMetadataManager.getLock().acquireWriteLock(
VOLUME_LOCK, volume));
acquiredVolumeLock = getOmLockDetails().isLockAcquired();
Expand Down Expand Up @@ -169,6 +193,4 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
}
return omClientResponse;
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import java.io.IOException;
import java.nio.file.InvalidPathException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
Expand Down Expand Up @@ -61,15 +62,38 @@ public OMVolumeSetOwnerRequest(OMRequest omRequest) {

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
OMRequest request = super.preExecute(ozoneManager);

long modificationTime = Time.now();
SetVolumePropertyRequest.Builder setPropertyRequestBuilder = getOmRequest()
.getSetVolumePropertyRequest().toBuilder()
.setModificationTime(modificationTime);

return getOmRequest().toBuilder()
SetVolumePropertyRequest setVolumePropertyRequest =
getOmRequest().getSetVolumePropertyRequest();
String volume = setVolumePropertyRequest.getVolumeName();

// ACL check during preExecute
if (ozoneManager.getAclsEnabled()) {
try {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL,
volume, null, null);
} catch (IOException ex) {
// Ensure audit log captures preExecute failures
Map<String, String> auditMap = new LinkedHashMap<>();
auditMap.put(OzoneConsts.VOLUME, volume);
auditMap.put(OzoneConsts.OWNER,
setVolumePropertyRequest.getOwnerName());
markForAudit(ozoneManager.getAuditLogger(),
buildAuditMessage(OMAction.SET_OWNER, auditMap, ex,
request.getUserInfo()));
throw ex;
}
}

return request.toBuilder()
.setSetVolumePropertyRequest(setPropertyRequestBuilder)
.setUserInfo(getUserInfo())
.build();
}

Expand Down Expand Up @@ -108,13 +132,6 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
String oldOwner = null;
OMClientResponse omClientResponse = null;
try {
// check Acl
if (ozoneManager.getAclsEnabled()) {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL,
volume, null, null);
}

long maxUserVolumeCount = ozoneManager.getMaxUserVolumeCount();
OzoneManagerStorageProtos.PersistedUserVolumeInfo oldOwnerVolumeList;
OzoneManagerStorageProtos.PersistedUserVolumeInfo newOwnerVolumeList;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import java.io.IOException;
import java.nio.file.InvalidPathException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand Down Expand Up @@ -63,15 +64,38 @@ public OMVolumeSetQuotaRequest(OMRequest omRequest) {

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
OMRequest request = super.preExecute(ozoneManager);

long modificationTime = Time.now();
SetVolumePropertyRequest.Builder setPropertyRequestBuilde = getOmRequest()
SetVolumePropertyRequest.Builder setPropertyRequestBuilder = getOmRequest()
.getSetVolumePropertyRequest().toBuilder()
.setModificationTime(modificationTime);

return getOmRequest().toBuilder()
.setSetVolumePropertyRequest(setPropertyRequestBuilde)
.setUserInfo(getUserInfo())
SetVolumePropertyRequest setVolumePropertyRequest =
getOmRequest().getSetVolumePropertyRequest();
String volume = setVolumePropertyRequest.getVolumeName();

// ACL check during preExecute
if (ozoneManager.getAclsEnabled()) {
try {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE, volume,
null, null);
} catch (IOException ex) {
// Ensure audit log captures preExecute failures
Map<String, String> auditMap = new LinkedHashMap<>();
auditMap.put(OzoneConsts.VOLUME, volume);
auditMap.put(OzoneConsts.QUOTA_IN_BYTES,
String.valueOf(setVolumePropertyRequest.getQuotaInBytes()));
markForAudit(ozoneManager.getAuditLogger(),
buildAuditMessage(OMAction.SET_QUOTA, auditMap, ex,
request.getUserInfo()));
throw ex;
}
}

return request.toBuilder()
.setSetVolumePropertyRequest(setPropertyRequestBuilder)
.build();
}

Expand Down Expand Up @@ -109,13 +133,6 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
boolean acquireVolumeLock = false;
OMClientResponse omClientResponse = null;
try {
// check Acl
if (ozoneManager.getAclsEnabled()) {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE, volume,
null, null);
}

mergeOmLockDetails(omMetadataManager.getLock().acquireWriteLock(
VOLUME_LOCK, volume));
acquireVolumeLock = getOmLockDetails().isLockAcquired();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@

import java.io.IOException;
import java.nio.file.InvalidPathException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.audit.AuditLogger;
import org.apache.hadoop.ozone.audit.OMAction;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.OzoneManager;
Expand All @@ -53,6 +55,43 @@ public abstract class OMVolumeAclRequest extends OMVolumeRequest {
omVolumeAclOp = aclOp;
}

@Override
public OzoneManagerProtocolProtos.OMRequest preExecute(OzoneManager ozoneManager)
throws IOException {
OzoneManagerProtocolProtos.OMRequest omRequest = super.preExecute(ozoneManager);
Comment thread
ivandika3 marked this conversation as resolved.

// ACL check during preExecute
if (ozoneManager.getAclsEnabled()) {
String volume = getVolumeName();
try {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL,
volume, null, null);
Comment on lines +67 to +69

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems this is a regression, previously we don't always require WRITE_ACL, but not super.preExecute requires WRITE_ACL. Please check this and write a test for this in another ticket.

} catch (IOException ex) {
// Ensure audit log captures preExecute failures
Map<String, String> auditMap = new LinkedHashMap<>();
auditMap.put(OzoneConsts.VOLUME, volume);
List<OzoneAcl> acls = getAcls();
if (acls != null) {
auditMap.put(OzoneConsts.ACL, acls.toString());
}
// Determine which action based on request type
OMAction action = OMAction.SET_ACL;
if (omRequest.hasAddAclRequest()) {
action = OMAction.ADD_ACL;
} else if (omRequest.hasRemoveAclRequest()) {
action = OMAction.REMOVE_ACL;
}
markForAudit(ozoneManager.getAuditLogger(),
buildAuditMessage(action, auditMap, ex,
omRequest.getUserInfo()));
throw ex;
}
}

return omRequest;
}

@Override
public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) {
final long trxnLogIndex = context.getIndex();
Expand All @@ -71,12 +110,6 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
boolean lockAcquired = false;
Result result;
try {
// check Acl
if (ozoneManager.getAclsEnabled()) {
checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME,
OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL,
volume, null, null);
}
mergeOmLockDetails(omMetadataManager.getLock().acquireWriteLock(
VOLUME_LOCK, volume));
lockAcquired = getOmLockDetails().isLockAcquired();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,16 @@ public class OMVolumeAddAclRequest extends OMVolumeAclRequest {

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
// Call parent preExecute to perform ACL check
OMRequest omRequest = super.preExecute(ozoneManager);

long modificationTime = Time.now();
OzoneManagerProtocolProtos.AddAclRequest.Builder addAclRequestBuilder =
getOmRequest().getAddAclRequest().toBuilder()
omRequest.getAddAclRequest().toBuilder()
.setModificationTime(modificationTime);
Comment on lines 65 to 67

@ivandika3 ivandika3 Jun 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the future, we also might want to have OMRequest carries the modificationTime so that we are not rebuilding the OMRequest just to add a modificationTime.


return getOmRequest().toBuilder()
return omRequest.toBuilder()
.setAddAclRequest(addAclRequestBuilder)
.setUserInfo(getUserInfo())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,16 @@ public class OMVolumeRemoveAclRequest extends OMVolumeAclRequest {

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
// Call parent preExecute to perform ACL check
OMRequest omRequest = super.preExecute(ozoneManager);

long modificationTime = Time.now();
OzoneManagerProtocolProtos.RemoveAclRequest.Builder removeAclRequestBuilder
= getOmRequest().getRemoveAclRequest().toBuilder()
= omRequest.getRemoveAclRequest().toBuilder()
.setModificationTime(modificationTime);

return getOmRequest().toBuilder()
return omRequest.toBuilder()
.setRemoveAclRequest(removeAclRequestBuilder)
.setUserInfo(getUserInfo())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,16 @@ public class OMVolumeSetAclRequest extends OMVolumeAclRequest {

@Override
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
// Call parent preExecute to perform ACL check
OMRequest omRequest = super.preExecute(ozoneManager);

long modificationTime = Time.now();
OzoneManagerProtocolProtos.SetAclRequest.Builder setAclRequestBuilder =
getOmRequest().getSetAclRequest().toBuilder()
omRequest.getSetAclRequest().toBuilder()
.setModificationTime(modificationTime);

return getOmRequest().toBuilder()
return omRequest.toBuilder()
.setSetAclRequest(setAclRequestBuilder)
.setUserInfo(getUserInfo())
.build();
}

Expand Down