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 @@ -484,8 +484,9 @@ private void createSnapshotDataForBucket1() throws Exception {
client.getProxy().deleteKey(VOLUME_NAME, BUCKET_NAME_ONE,
"bucket1key0", false);
assertTableRowCount(keyTable, 0);
// bucket1key0 should also be reclaimed as it not same
assertTableRowCount(deletedTable, 1);
// one copy of bucket1key0 should also be reclaimed as it not same
// but original deleted key created during overwrite should not be deleted
assertTableRowCount(deletedTable, 2);

// Create Snapshot 2.
client.getProxy().createSnapshot(VOLUME_NAME, BUCKET_NAME_ONE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn
keyToDelete, trxnLogIndex, ozoneManager.isRatisEnabled());
checkBucketQuotaInBytes(omMetadataManager, omBucketInfo,
correctedSpace);
// using pseudoObjId as objectId can be same in case of overwrite key
long pseudoObjId = ozoneManager.getObjectIdFromTxId(trxnLogIndex);
String delKeyName = omMetadataManager.getOzoneDeletePathKey(
keyToDelete.getObjectID(), dbOzoneKey);
pseudoObjId, dbOzoneKey);
if (null == oldKeyVersionsToDeleteMap) {
oldKeyVersionsToDeleteMap = new HashMap<>();
}
Expand Down Expand Up @@ -303,8 +305,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn
if (null == oldKeyVersionsToDeleteMap) {
oldKeyVersionsToDeleteMap = new HashMap<>();
}
oldKeyVersionsToDeleteMap.put(delKeyName,
new RepeatedOmKeyInfo(pseudoKeyInfo));
oldKeyVersionsToDeleteMap.computeIfAbsent(delKeyName,
key -> new RepeatedOmKeyInfo()).addOmKeyInfo(pseudoKeyInfo);
}

// Add to cache of open key table and key table.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn
correctedSpace);
String delKeyName = omMetadataManager
.getOzoneKey(volumeName, bucketName, fileName);
// using pseudoObjId as objectId can be same in case of overwrite key
long pseudoObjId = ozoneManager.getObjectIdFromTxId(trxnLogIndex);
delKeyName = omMetadataManager.getOzoneDeletePathKey(
keyToDelete.getObjectID(), delKeyName);
pseudoObjId, delKeyName);
if (null == oldKeyVersionsToDeleteMap) {
oldKeyVersionsToDeleteMap = new HashMap<>();
}
Expand Down Expand Up @@ -238,8 +240,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn
if (null == oldKeyVersionsToDeleteMap) {
oldKeyVersionsToDeleteMap = new HashMap<>();
}
oldKeyVersionsToDeleteMap.put(delKeyName,
new RepeatedOmKeyInfo(pseudoKeyInfo));
oldKeyVersionsToDeleteMap.computeIfAbsent(delKeyName,
key -> new RepeatedOmKeyInfo()).addOmKeyInfo(pseudoKeyInfo);
}

// Add to cache of open key table and key table.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
import java.util.stream.Collectors;

import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.OzoneConfigKeys;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.om.exceptions.OMException;
Expand Down Expand Up @@ -56,10 +59,13 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when;

/**
* Class tests OMKeyCommitRequest class.
Expand Down Expand Up @@ -555,16 +561,17 @@ public void testValidateAndUpdateCacheWithKeyNotFound() throws Exception {

@Test
public void testValidateAndUpdateCacheOnOverwrite() throws Exception {
when(ozoneManager.getObjectIdFromTxId(anyLong())).thenAnswer(tx ->
OmUtils.getObjectIdFromTxId(2, tx.getArgument(0)));
testValidateAndUpdateCache();

// Become a new client and set next version number
clientID = Time.now();
version += 1;

OMRequest modifiedOmRequest = doPreExecute(createCommitKeyRequest());
OMRequest modifiedOmRequest = doPreExecute(createCommitKeyRequest(getKeyLocation(10).subList(4, 10), false));

OMKeyCommitRequest omKeyCommitRequest =
getOmKeyCommitRequest(modifiedOmRequest);
OMKeyCommitRequest omKeyCommitRequest = getOmKeyCommitRequest(modifiedOmRequest);

KeyArgs keyArgs = modifiedOmRequest.getCommitKeyRequest().getKeyArgs();

Expand All @@ -576,49 +583,54 @@ public void testValidateAndUpdateCacheOnOverwrite() throws Exception {

assertNotNull(omKeyInfo);
// Previously committed version
assertEquals(0L,
omKeyInfo.getLatestVersionLocations().getVersion());
assertEquals(0L, omKeyInfo.getLatestVersionLocations().getVersion());

// Append new blocks
List<OmKeyLocationInfo> allocatedLocationList =
keyArgs.getKeyLocationsList().stream()
.map(OmKeyLocationInfo::getFromProtobuf)
.collect(Collectors.toList());
keyArgs.getKeyLocationsList().stream()
.map(OmKeyLocationInfo::getFromProtobuf)
.collect(Collectors.toList());
addKeyToOpenKeyTable(allocatedLocationList);

OMClientResponse omClientResponse =
omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 102L);

assertEquals(OzoneManagerProtocolProtos.Status.OK,
omClientResponse.getOMResponse().getStatus());
assertEquals(OzoneManagerProtocolProtos.Status.OK, omClientResponse.getOMResponse().getStatus());

// New entry should be created in key Table.
omKeyInfo =
omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout())
.get(ozoneKey);
omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);

assertNotNull(omKeyInfo);
assertEquals(version,
omKeyInfo.getLatestVersionLocations().getVersion());
assertEquals(version, omKeyInfo.getLatestVersionLocations().getVersion());
// DB keyInfo format
verifyKeyName(omKeyInfo);

// Check modification time
CommitKeyRequest commitKeyRequest = modifiedOmRequest.getCommitKeyRequest();
assertEquals(commitKeyRequest.getKeyArgs().getModificationTime(),
omKeyInfo.getModificationTime());
assertEquals(commitKeyRequest.getKeyArgs().getModificationTime(), omKeyInfo.getModificationTime());

// Check block location.
List<OmKeyLocationInfo> locationInfoListFromCommitKeyRequest =
commitKeyRequest.getKeyArgs()
.getKeyLocationsList().stream().map(OmKeyLocationInfo::getFromProtobuf)
.collect(Collectors.toList());
commitKeyRequest.getKeyArgs().getKeyLocationsList().stream().map(OmKeyLocationInfo::getFromProtobuf)
.collect(Collectors.toList());

assertEquals(locationInfoListFromCommitKeyRequest,
omKeyInfo.getLatestVersionLocations().getLocationList());
assertEquals(allocatedLocationList,
omKeyInfo.getLatestVersionLocations().getLocationList());
assertEquals(locationInfoListFromCommitKeyRequest, omKeyInfo.getLatestVersionLocations().getLocationList());
assertEquals(allocatedLocationList, omKeyInfo.getLatestVersionLocations().getLocationList());
assertEquals(1, omKeyInfo.getKeyLocationVersions().size());

// flush response content to db
BatchOperation batchOperation = omMetadataManager.getStore().initBatchOperation();
((OMKeyCommitResponse) omClientResponse).addToDBBatch(omMetadataManager, batchOperation);
omMetadataManager.getStore().commitBatchOperation(batchOperation);

// verify deleted key is unique generated
String deletedKey = omMetadataManager.getOzoneKey(volumeName, omKeyInfo.getBucketName(), keyName);
List<? extends Table.KeyValue<String, RepeatedOmKeyInfo>> rangeKVs
= omMetadataManager.getDeletedTable().getRangeKVs(null, 100, deletedKey);
assertThat(rangeKVs.size()).isGreaterThan(0);
assertEquals(1, rangeKVs.get(0).getValue().getOmKeyInfoList().size());
assertFalse(rangeKVs.get(0).getKey().endsWith(rangeKVs.get(0).getValue().getOmKeyInfoList().get(0).getObjectID()
+ ""));
}

/**
Expand Down