blob: 1cdc2a1355981b02e87e955d19fe2d0cc4a64056 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.ozone.om.request.key;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.ozone.OzoneConsts;
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.OmVolumeArgs;
import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import org.apache.hadoop.util.Time;
import org.junit.Assert;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
/**
* Tests OMCreateKeyRequestWithFSO class.
*/
public class TestOMKeyCreateRequestWithFSO extends TestOMKeyCreateRequest {
public TestOMKeyCreateRequestWithFSO(boolean setKeyPathLock,
boolean setFileSystemPaths) {
super(setKeyPathLock, setFileSystemPaths);
}
@Override
protected OzoneConfiguration getOzoneConfiguration() {
OzoneConfiguration config = super.getOzoneConfiguration();
// Metadata layout prefix will be set while invoking OzoneManager#start()
// and its not invoked in this test. Hence it is explicitly setting
// this configuration to populate prefix tables.
return config;
}
@Override
protected void addToKeyTable(String keyName) throws Exception {
Path keyPath = Paths.get(keyName);
long parentId = checkIntermediatePaths(keyPath);
String fileName = OzoneFSUtils.getFileName(keyName);
OmKeyInfo omKeyInfo =
OMRequestTestUtils.createOmKeyInfo(volumeName, bucketName, fileName,
HddsProtos.ReplicationType.RATIS,
HddsProtos.ReplicationFactor.ONE,
parentId + 1,
parentId, 100, Time.now());
OMRequestTestUtils.addFileToKeyTable(false, false,
fileName, omKeyInfo, -1, 50, omMetadataManager);
}
@Override
protected void checkCreatedPaths(OMKeyCreateRequest omKeyCreateRequest,
OMRequest omRequest, String keyName) throws Exception {
keyName = omKeyCreateRequest.validateAndNormalizeKey(true, keyName,
BucketLayout.FILE_SYSTEM_OPTIMIZED);
// Check intermediate directories created or not.
Path keyPath = Paths.get(keyName);
long parentID = checkIntermediatePaths(keyPath);
final long volumeId = omMetadataManager.getVolumeId(volumeName);
final long bucketId = omMetadataManager.getBucketId(volumeName,
bucketName);
// Check open key entry
Path keyPathFileName = keyPath.getFileName();
Assert.assertNotNull("Failed to find fileName", keyPathFileName);
String fileName = keyPathFileName.toString();
String openKey = omMetadataManager.getOpenFileName(volumeId, bucketId,
parentID, fileName, omRequest.getCreateKeyRequest().getClientID());
OmKeyInfo omKeyInfo =
omMetadataManager.getOpenKeyTable(omKeyCreateRequest.getBucketLayout())
.get(openKey);
Assert.assertNotNull(omKeyInfo);
}
@Override
protected long checkIntermediatePaths(Path keyPath) throws Exception {
// Check intermediate paths are created
keyPath = keyPath.getParent(); // skip the file name
String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName);
OmBucketInfo omBucketInfo =
omMetadataManager.getBucketTable().get(bucketKey);
Assert.assertNotNull("Bucket not found!", omBucketInfo);
long lastKnownParentId = omBucketInfo.getObjectID();
final long volumeId = omMetadataManager.getVolumeId(volumeName);
Iterator<Path> elements = keyPath.iterator();
StringBuilder fullKeyPath = new StringBuilder(bucketKey);
while (elements.hasNext()) {
String fileName = elements.next().toString();
fullKeyPath.append(OzoneConsts.OM_KEY_PREFIX);
fullKeyPath.append(fileName);
String dbNodeName = omMetadataManager.getOzonePathKey(volumeId,
omBucketInfo.getObjectID(), lastKnownParentId, fileName);
OmDirectoryInfo omDirInfo = omMetadataManager.getDirectoryTable().
get(dbNodeName);
Assert.assertNotNull("Parent key path:" + fullKeyPath +
" doesn't exist", omDirInfo);
lastKnownParentId = omDirInfo.getObjectID();
}
return lastKnownParentId;
}
@Override
protected String getOpenKey(long id) throws IOException {
OmVolumeArgs volumeInfo = omMetadataManager.getVolumeTable()
.get(omMetadataManager.getVolumeKey(volumeName));
OmBucketInfo omBucketInfo = omMetadataManager.getBucketTable()
.get(omMetadataManager.getBucketKey(volumeName, bucketName));
return omMetadataManager.getOpenFileName(
volumeInfo == null ? 100 : volumeInfo.getObjectID(),
omBucketInfo == null ? 1000 : omBucketInfo.getObjectID(),
omBucketInfo == null ? 1000 : omBucketInfo.getObjectID(),
keyName, id);
}
@Override
protected String getOzoneKey() throws IOException {
String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName);
final long volumeId = omMetadataManager.getVolumeId(volumeName);
OmBucketInfo omBucketInfo =
omMetadataManager.getBucketTable().get(bucketKey);
if (omBucketInfo != null) {
final long bucketId = omMetadataManager.getBucketId(volumeName,
bucketName);
return omMetadataManager.getOzonePathKey(volumeId, bucketId,
omBucketInfo.getObjectID(), keyName);
} else {
return omMetadataManager.getOzonePathKey(volumeId, 1000,
1000, keyName);
}
}
@Override
protected OMKeyCreateRequest getOMKeyCreateRequest(OMRequest omRequest) {
return new OMKeyCreateRequestWithFSO(omRequest,
BucketLayout.FILE_SYSTEM_OPTIMIZED);
}
@Override
public BucketLayout getBucketLayout() {
return BucketLayout.FILE_SYSTEM_OPTIMIZED;
}
}