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 @@ -23,6 +23,7 @@
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_REQUIRED_OM_VERSION_MIN_KEY;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS_DEFAULT;
import static org.apache.hadoop.ozone.OzoneConsts.ETAG;
import static org.apache.hadoop.ozone.OzoneConsts.MAXIMUM_NUMBER_OF_PARTS_PER_UPLOAD;
import static org.apache.hadoop.ozone.OzoneConsts.OLD_QUOTA_DEFAULT;
import static org.apache.hadoop.ozone.OzoneConsts.OZONE_MAXIMUM_ACCESS_ID_LENGTH;
Expand Down Expand Up @@ -1722,8 +1723,10 @@ public List<OzoneKey> listKeys(String volumeName, String bucketName,
key.getCreationTime(),
key.getModificationTime(),
key.getReplicationConfig(),
Collections.singletonMap(ETAG, key.getETag()),
key.isFile(),
key.getOwnerName()))
key.getOwnerName(),
Collections.emptyMap()))
.collect(Collectors.toList());
} else {
List<OmKeyInfo> keys = ozoneManagerClient.listKeys(
Expand All @@ -1735,8 +1738,10 @@ public List<OzoneKey> listKeys(String volumeName, String bucketName,
key.getCreationTime(),
key.getModificationTime(),
key.getReplicationConfig(),
key.getMetadata(),
key.isFile(),
key.getOwnerName()))
key.getOwnerName(),
key.getTags()))
.collect(Collectors.toList());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@
import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientFactory;
import org.apache.hadoop.ozone.client.OzoneVolume;
import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
Expand Down Expand Up @@ -373,9 +372,8 @@ public void testPutDoubleSlashPrefixObject() throws IOException {
final String bucketName = getBucketName();
final String keyName = "//dir1";
final String content = "bar";
OzoneConfiguration conf = cluster.getConf();
// Create a FSO bucket for test
try (OzoneClient ozoneClient = OzoneClientFactory.getRpcClient(conf)) {
try (OzoneClient ozoneClient = cluster.newClient()) {
ObjectStore store = ozoneClient.getObjectStore();
OzoneVolume volume = store.getS3Volume();
OmBucketInfo.Builder bucketInfo = new OmBucketInfo.Builder()
Expand Down Expand Up @@ -502,8 +500,7 @@ public void testGetObjectWithoutETag() throws Exception {
String value = "sample value";
byte[] valueBytes = value.getBytes(StandardCharsets.UTF_8);

OzoneConfiguration conf = cluster.getConf();
try (OzoneClient ozoneClient = OzoneClientFactory.getRpcClient(conf)) {
try (OzoneClient ozoneClient = cluster.newClient()) {
ObjectStore store = ozoneClient.getObjectStore();

OzoneVolume volume = store.getS3Volume();
Expand Down Expand Up @@ -532,81 +529,108 @@ public void testGetObjectWithoutETag() throws Exception {
}

@Test
public void testListObjectsMany() {
final String bucketName = getBucketName();
s3Client.createBucket(bucketName);
final List<String> keyNames = Arrays.asList(
getKeyName("1"),
getKeyName("2"),
getKeyName("3")
);

for (String keyName: keyNames) {
s3Client.putObject(bucketName, keyName, RandomStringUtils.secure().nextAlphanumeric(5));
}

ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withMaxKeys(2);
ObjectListing listObjectsResponse = s3Client.listObjects(listObjectsRequest);
assertThat(listObjectsResponse.getObjectSummaries()).hasSize(2);
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertEquals(listObjectsResponse.getObjectSummaries().stream()
.map(S3ObjectSummary::getKey).collect(Collectors.toList()),
keyNames.subList(0, 2));
assertTrue(listObjectsResponse.isTruncated());


listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withMaxKeys(2)
.withMarker(listObjectsResponse.getNextMarker());
listObjectsResponse = s3Client.listObjects(listObjectsRequest);
assertThat(listObjectsResponse.getObjectSummaries()).hasSize(1);
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertEquals(listObjectsResponse.getObjectSummaries().stream()
.map(S3ObjectSummary::getKey).collect(Collectors.toList()),
keyNames.subList(2, keyNames.size()));
assertFalse(listObjectsResponse.isTruncated());
public void testListObjectsMany() throws Exception {
testListObjectsMany(false);
}

@Test
public void testListObjectsManyV2() {
public void testListObjectsManyV2() throws Exception {
testListObjectsMany(true);
}

private void testListObjectsMany(boolean isListV2) throws Exception {
final String bucketName = getBucketName();
s3Client.createBucket(bucketName);
final List<String> keyNames = Arrays.asList(
getKeyName("1"),
getKeyName("2"),
getKeyName("3")
);
final List<String> keyNamesWithoutETag = Arrays.asList(
getKeyName("4"),
getKeyName("5")
);

final Map<String, String> keyToEtag = new HashMap<>();
for (String keyName: keyNames) {
s3Client.putObject(bucketName, keyName, RandomStringUtils.secure().nextAlphanumeric(5));
PutObjectResult putObjectResult = s3Client.putObject(bucketName, keyName,
RandomStringUtils.secure().nextAlphanumeric(5));
keyToEtag.put(keyName, putObjectResult.getETag());
}
try (OzoneClient ozoneClient = cluster.newClient()) {
ObjectStore store = ozoneClient.getObjectStore();

ListObjectsV2Request listObjectsRequest = new ListObjectsV2Request()
.withBucketName(bucketName)
.withMaxKeys(2);
ListObjectsV2Result listObjectsResponse = s3Client.listObjectsV2(listObjectsRequest);
assertThat(listObjectsResponse.getObjectSummaries()).hasSize(2);
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertEquals(listObjectsResponse.getObjectSummaries().stream()
OzoneVolume volume = store.getS3Volume();
OzoneBucket bucket = volume.getBucket(bucketName);

for (String keyNameWithoutETag : keyNamesWithoutETag) {
byte[] valueBytes = RandomStringUtils.secure().nextAlphanumeric(5).getBytes(StandardCharsets.UTF_8);
try (OzoneOutputStream out = bucket.createKey(keyNameWithoutETag,
valueBytes.length,
ReplicationConfig.fromTypeAndFactor(ReplicationType.RATIS, ReplicationFactor.ONE),
Collections.emptyMap())) {
out.write(valueBytes);
}
}
}

List<S3ObjectSummary> objectSummaries;
String continuationToken;
if (isListV2) {
ListObjectsV2Request listObjectsRequest = new ListObjectsV2Request()
.withBucketName(bucketName)
.withMaxKeys(2);
ListObjectsV2Result listObjectsResponse = s3Client.listObjectsV2(listObjectsRequest);
objectSummaries = listObjectsResponse.getObjectSummaries();
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertTrue(listObjectsResponse.isTruncated());
continuationToken = listObjectsResponse.getNextContinuationToken();
} else {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withMaxKeys(2);
ObjectListing listObjectsResponse = s3Client.listObjects(listObjectsRequest);
objectSummaries = listObjectsResponse.getObjectSummaries();
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertTrue(listObjectsResponse.isTruncated());
continuationToken = listObjectsResponse.getNextMarker();
}
assertThat(objectSummaries).hasSize(2);
assertEquals(objectSummaries.stream()
.map(S3ObjectSummary::getKey).collect(Collectors.toList()),
keyNames.subList(0, 2));
assertTrue(listObjectsResponse.isTruncated());
for (S3ObjectSummary objectSummary : objectSummaries) {
assertEquals(keyToEtag.get(objectSummary.getKey()), objectSummary.getETag());
}

// Include both keys with and without ETag
if (isListV2) {
ListObjectsV2Request listObjectsRequest = new ListObjectsV2Request()
.withBucketName(bucketName)
.withMaxKeys(5)
.withContinuationToken(continuationToken);
ListObjectsV2Result listObjectsResponse = s3Client.listObjectsV2(listObjectsRequest);
objectSummaries = listObjectsResponse.getObjectSummaries();
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertFalse(listObjectsResponse.isTruncated());
} else {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withMaxKeys(5)
.withMarker(continuationToken);
ObjectListing listObjectsResponse = s3Client.listObjects(listObjectsRequest);
objectSummaries = listObjectsResponse.getObjectSummaries();
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertFalse(listObjectsResponse.isTruncated());
}

listObjectsRequest = new ListObjectsV2Request()
.withBucketName(bucketName)
.withMaxKeys(2)
.withContinuationToken(listObjectsResponse.getNextContinuationToken());
listObjectsResponse = s3Client.listObjectsV2(listObjectsRequest);
assertThat(listObjectsResponse.getObjectSummaries()).hasSize(1);
assertEquals(bucketName, listObjectsResponse.getBucketName());
assertEquals(listObjectsResponse.getObjectSummaries().stream()
.map(S3ObjectSummary::getKey).collect(Collectors.toList()),
keyNames.subList(2, keyNames.size()));
assertFalse(listObjectsResponse.isTruncated());
assertThat(objectSummaries).hasSize(3);
assertEquals(keyNames.get(2), objectSummaries.get(0).getKey());
assertEquals(keyNamesWithoutETag.get(0), objectSummaries.get(1).getKey());
assertEquals(keyNamesWithoutETag.get(1), objectSummaries.get(2).getKey());
for (S3ObjectSummary objectSummary : objectSummaries) {
assertEquals(keyToEtag.get(objectSummary.getKey()), objectSummary.getETag());
}
}

@Test
Expand Down Expand Up @@ -961,15 +985,15 @@ private boolean isBucketEmpty(Bucket bucket) {
}

private String getBucketName() {
return getBucketName(null);
return getBucketName("");
}

private String getBucketName(String suffix) {
return (getTestName() + "bucket" + suffix).toLowerCase(Locale.ROOT);
}

private String getKeyName() {
return getKeyName(null);
return getKeyName("");
}

private String getKeyName(String suffix) {
Expand Down
Loading