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 @@ -162,7 +162,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
// Empty entries won't be added to deleted table so this key shouldn't get added to snapshotUsed space.
boolean isKeyNonEmpty = !OmKeyInfo.isKeyEmpty(omKeyInfo);
omBucketInfo.decrUsedBytes(quotaReleased, isKeyNonEmpty);
omBucketInfo.decrUsedNamespace(1L, isKeyNonEmpty);
omBucketInfo.decrUsedNamespace(1L, isKeyNonEmpty || keyStatus.isDirectory());

// If omKeyInfo has hsync metadata, delete its corresponding open key as well
String dbOpenKey = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,13 @@ public static String deleteDir(String ozoneKey, String volume, String bucket,
omDirectoryInfo.getName());
omMetadataManager.getDeletedDirTable().put(ozoneKey, omKeyInfo);
omMetadataManager.getDirectoryTable().delete(ozoneKey);

String bucketKey = omMetadataManager.getBucketKey(volume, bucket);
OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable().get(bucketKey);
if (omBucketInfo != null) {
omBucketInfo.decrUsedNamespace(1L, true);
omMetadataManager.getBucketTable().put(bucketKey, omBucketInfo);
}
return ozoneKey;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.hadoop.ozone.om.OzonePrefixPathImpl;
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus;
Expand Down Expand Up @@ -333,4 +334,72 @@ public void testDeleteParentAfterChildDeleted() throws Exception {
assertEquals(OzoneManagerProtocolProtos.Status.OK, response.getOMResponse().getStatus(),
"Parent delete should succeed after children deleted");
}

@Test
public void testSnapshotUsedNamespaceAfterDirectoryDeleteAndPurge() throws Exception {
OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName, omMetadataManager, getBucketLayout());

String dirName = "dir1";
String dirKeyPath = addKeyToDirTable(volumeName, bucketName, dirName);

long parentObjectID = 0L;
long dirObjectID = 12345L;
OmDirectoryInfo omDirectoryInfo = OMRequestTestUtils.createOmDirectoryInfo(dirName, dirObjectID, parentObjectID);
omMetadataManager.getDirectoryTable().put(dirKeyPath, omDirectoryInfo);

String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName);
OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable().get(bucketKey);
assertNotNull(omBucketInfo);
// Initialize used namespace and snapshot used namespace for test predictability
omBucketInfo.incrUsedNamespace(1);
omMetadataManager.getBucketTable().put(bucketKey, omBucketInfo);

// Delete the directory
long txnId = 100L;
OMRequest deleteRequest = doPreExecute(createDeleteKeyRequest(dirName, false));
OMKeyDeleteRequest omKeyDeleteRequest = getOmKeyDeleteRequest(deleteRequest);
OMClientResponse deleteResponse = omKeyDeleteRequest.validateAndUpdateCache(ozoneManager, txnId++);
assertEquals(OzoneManagerProtocolProtos.Status.OK, deleteResponse.getOMResponse().getStatus());

OmBucketInfo bucketInfoAfterDelete = omMetadataManager.getBucketTable().get(bucketKey);

// Perform purge
OzoneManagerProtocolProtos.PurgeDirectoriesRequest.Builder purgeDirRequest =
OzoneManagerProtocolProtos.PurgeDirectoriesRequest.newBuilder();

long volumeId = omMetadataManager.getVolumeId(volumeName);
long bucketId = bucketInfoAfterDelete.getObjectID();

OzoneManagerProtocolProtos.PurgePathRequest purgePathRequest =
OzoneManagerProtocolProtos.PurgePathRequest.newBuilder()
.setVolumeId(volumeId)
.setBucketId(bucketId)
.setDeletedDir(dirKeyPath)
.build();

purgeDirRequest.addDeletedPath(purgePathRequest);
purgeDirRequest.addBucketNameInfos(
OzoneManagerProtocolProtos.BucketNameInfo.newBuilder()
.setVolumeName(volumeName)
.setBucketName(bucketName)
.setBucketId(bucketId)
.setVolumeId(volumeId)
.build());

OMRequest purgeRequest = OMRequest.newBuilder()
.setCmdType(OzoneManagerProtocolProtos.Type.PurgeDirectories)
.setPurgeDirectoriesRequest(purgeDirRequest)
.setClientId(UUID.randomUUID().toString())
.build();

OMDirectoriesPurgeRequestWithFSO omPurgeRequest = new OMDirectoriesPurgeRequestWithFSO(purgeRequest);
OMClientResponse purgeResponse = omPurgeRequest.validateAndUpdateCache(ozoneManager, txnId);
assertEquals(OzoneManagerProtocolProtos.Status.OK, purgeResponse.getOMResponse().getStatus());

OmBucketInfo bucketInfoAfterPurge = omMetadataManager.getBucketTable().get(bucketKey);

// We expect snapshotUsedNamespace to not go negative
assertTrue(bucketInfoAfterPurge.getSnapshotUsedNamespace() >= 0,
"SnapshotUsedNamespace went negative (" + bucketInfoAfterPurge.getSnapshotUsedNamespace() + ") due to bug.");
Comment on lines +402 to +403

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.

nit: please use assertThat(<number>).isNotNegative() instead of assertTrue(<number> >= 0), see HDDS-9951

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

ah good point.

}
}
Loading