Skip to content
Draft
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 @@ -177,6 +177,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut
.build());
LOG.error("Received a request name of new key {} already exists",
toKeyName);
continue;
}

// fromKeyName should exist
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@
package org.apache.hadoop.ozone.om.request.key;

import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.THREE;
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.assertTrue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
Expand Down Expand Up @@ -110,6 +112,38 @@ public void testKeysRenameRequestFail() throws Exception {
assertEquals("testKey", unRenamedKeys.getFromKeyName());
}

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

String fromKeyName = parentDir.concat("/fromKey");
String toKeyName = parentDir.concat("/toKey");
OmKeyInfo fromKeyInfo = OMRequestTestUtils.addKeyToTableCache(volumeName, bucketName, fromKeyName,
RatisReplicationConfig.getInstance(THREE), omMetadataManager);
OmKeyInfo toKeyInfo = OMRequestTestUtils.addKeyToTableCache(volumeName, bucketName, toKeyName,
RatisReplicationConfig.getInstance(THREE), omMetadataManager);

RenameKeysMap renameKey = RenameKeysMap.newBuilder().setFromKeyName(fromKeyName).setToKeyName(toKeyName).build();
// fromKey does not exist either, the pair should still be reported only once.
RenameKeysMap missingRenameKey =
RenameKeysMap.newBuilder().setFromKeyName("testKey").setToKeyName(toKeyName).build();
OMRequest omRequest = createRenameKeyRequest(Arrays.asList(renameKey, missingRenameKey));

OMClientResponse omKeysRenameResponse =
new OMKeysRenameRequest(omRequest, getBucketLayout()).validateAndUpdateCache(ozoneManager, 100L);

assertThat(omKeysRenameResponse.getOMResponse().getStatus())
.isEqualTo(OzoneManagerProtocolProtos.Status.PARTIAL_RENAME);
assertThat(omKeysRenameResponse.getOMResponse().getRenameKeysResponse().getUnRenamedKeysList())
.containsExactly(renameKey, missingRenameKey);

// The existing toKey must not be overwritten, and fromKey must stay.
assertThat(omMetadataManager.getKeyTable(getBucketLayout())
.get(omMetadataManager.getOzoneKey(volumeName, bucketName, fromKeyName))).isEqualTo(fromKeyInfo);
assertThat(omMetadataManager.getKeyTable(getBucketLayout())
.get(omMetadataManager.getOzoneKey(volumeName, bucketName, toKeyName))).isEqualTo(toKeyInfo);
}

/**
* Create OMRequest which encapsulates RenameKeyRequest.
*
Expand Down Expand Up @@ -144,6 +178,10 @@ private OMRequest createRenameKeyRequest(Boolean isIllegal) throws Exception {
renameKeyList.add(renameKey.build());
}

return createRenameKeyRequest(renameKeyList);
}

private OMRequest createRenameKeyRequest(List<RenameKeysMap> renameKeyList) {
RenameKeysArgs.Builder renameKeyArgs = RenameKeysArgs.newBuilder()
.setVolumeName(volumeName)
.setBucketName(bucketName)
Expand Down