|
@@ -20,14 +20,19 @@ import com.google.common.base.Preconditions;
|
|
import org.apache.hadoop.ksm.helpers.KsmKeyArgs;
|
|
import org.apache.hadoop.ksm.helpers.KsmKeyArgs;
|
|
import org.apache.hadoop.ksm.helpers.KsmKeyInfo;
|
|
import org.apache.hadoop.ksm.helpers.KsmKeyInfo;
|
|
import org.apache.hadoop.ozone.ksm.exceptions.KSMException;
|
|
import org.apache.hadoop.ozone.ksm.exceptions.KSMException;
|
|
|
|
+import org.apache.hadoop.ozone.ksm.exceptions.KSMException.ResultCodes;
|
|
import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos.KeyInfo;
|
|
import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos.KeyInfo;
|
|
|
|
+import org.apache.hadoop.ozone.protocol.proto.ScmBlockLocationProtocolProtos.DeleteScmBlockResult.Result;
|
|
import org.apache.hadoop.scm.container.common.helpers.AllocatedBlock;
|
|
import org.apache.hadoop.scm.container.common.helpers.AllocatedBlock;
|
|
|
|
+import org.apache.hadoop.scm.container.common.helpers.DeleteBlockResult;
|
|
import org.apache.hadoop.scm.protocol.ScmBlockLocationProtocol;
|
|
import org.apache.hadoop.scm.protocol.ScmBlockLocationProtocol;
|
|
import org.iq80.leveldb.DBException;
|
|
import org.iq80.leveldb.DBException;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Implementation of keyManager.
|
|
* Implementation of keyManager.
|
|
@@ -139,4 +144,40 @@ public class KeyManagerImpl implements KeyManager {
|
|
metadataManager.writeLock().unlock();
|
|
metadataManager.writeLock().unlock();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void deleteKey(KsmKeyArgs args) throws IOException {
|
|
|
|
+ Preconditions.checkNotNull(args);
|
|
|
|
+ KsmKeyInfo keyInfo = lookupKey(args);
|
|
|
|
+
|
|
|
|
+ metadataManager.writeLock().lock();
|
|
|
|
+ String volumeName = args.getVolumeName();
|
|
|
|
+ String bucketName = args.getBucketName();
|
|
|
|
+ String keyName = args.getKeyName();
|
|
|
|
+ try {
|
|
|
|
+ List<DeleteBlockResult> resultList =
|
|
|
|
+ scmBlockClient.deleteBlocks(
|
|
|
|
+ Collections.singleton(keyInfo.getBlockID()));
|
|
|
|
+ if (resultList.size() != 1) {
|
|
|
|
+ throw new KSMException("Delete result size from SCM is wrong",
|
|
|
|
+ ResultCodes.FAILED_INTERNAL_ERROR);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (resultList.get(0).getResult() == Result.success) {
|
|
|
|
+ byte[] objectKey = metadataManager.getDBKeyForKey(
|
|
|
|
+ volumeName, bucketName, keyName);
|
|
|
|
+ metadataManager.deleteKey(objectKey);
|
|
|
|
+ } else {
|
|
|
|
+ throw new KSMException("Cannot delete key from SCM",
|
|
|
|
+ ResultCodes.FAILED_INTERNAL_ERROR);
|
|
|
|
+ }
|
|
|
|
+ } catch (DBException ex) {
|
|
|
|
+ LOG.error(String.format("Delete key failed for volume:%s "
|
|
|
|
+ + "bucket:%s key:%s", volumeName, bucketName, keyName), ex);
|
|
|
|
+ throw new KSMException(ex.getMessage(), ex,
|
|
|
|
+ ResultCodes.FAILED_INTERNAL_ERROR);
|
|
|
|
+ } finally {
|
|
|
|
+ metadataManager.writeLock().unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|