summaryrefslogtreecommitdiff
path: root/hadoop-hdfs-project/hadoop-hdfs/src/main
diff options
context:
space:
mode:
authorMukul Kumar Singh <msingh@apache.org>2018-01-24 20:16:31 +0530
committerOwen O'Malley <omalley@apache.org>2018-04-26 05:36:04 -0700
commit4bb9ad8e8f39d88b07a0e408623b39a58d7d72fc (patch)
tree8bb8feb2b65c06f4b0c113e2bfe70fcd3057fbb2 /hadoop-hdfs-project/hadoop-hdfs/src/main
parentba4d5a52a8be68ae826f6e6f9d4edbaba9131e85 (diff)
HDFS-13017. Block Storage: implement simple iscsi discovery in jscsi server. Contributed by Elek, Marton.
Diffstat (limited to 'hadoop-hdfs-project/hadoop-hdfs/src/main')
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/CBlockManager.java5
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockClientProtocolClientSideTranslatorPB.java43
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockManagerHandler.java6
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockTargetServer.java17
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/proto/CBlockClientProtocol.java5
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/protocolPB/CBlockClientServerProtocolServerSideTranslatorPB.java30
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/proto/CBlockClientServerProtocol.proto15
7 files changed, 115 insertions, 6 deletions
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/CBlockManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/CBlockManager.java
index bb4252c901..2bfbd89298 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/CBlockManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/CBlockManager.java
@@ -247,6 +247,11 @@ public class CBlockManager implements CBlockServiceProtocol,
}
@Override
+ public List<VolumeInfo> listVolumes() throws IOException {
+ return listVolume(null);
+ }
+
+ @Override
public synchronized void createVolume(String userName, String volumeName,
long volumeSize, int blockSize) throws IOException {
LOG.info("Create volume received: userName: {} volumeName: {} " +
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockClientProtocolClientSideTranslatorPB.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockClientProtocolClientSideTranslatorPB.java
index 84484a1d0f..84b68e35e0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockClientProtocolClientSideTranslatorPB.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockClientProtocolClientSideTranslatorPB.java
@@ -20,9 +20,21 @@ package org.apache.hadoop.cblock.jscsiHelper;
import com.google.common.primitives.Longs;
import com.google.protobuf.ServiceException;
import org.apache.hadoop.cblock.exception.CBlockException;
+import org.apache.hadoop.cblock.meta.VolumeInfo;
import org.apache.hadoop.cblock.proto.CBlockClientProtocol;
import org.apache.hadoop.cblock.proto.MountVolumeResponse;
-import org.apache.hadoop.cblock.protocol.proto.CBlockClientServerProtocolProtos;
+import org.apache.hadoop.cblock.protocol.proto
+ .CBlockClientServerProtocolProtos.ContainerIDProto;
+import org.apache.hadoop.cblock.protocol.proto
+ .CBlockClientServerProtocolProtos.ListVolumesRequestProto;
+import org.apache.hadoop.cblock.protocol.proto
+ .CBlockClientServerProtocolProtos.ListVolumesResponseProto;
+import org.apache.hadoop.cblock.protocol.proto
+ .CBlockClientServerProtocolProtos.MountVolumeRequestProto;
+import org.apache.hadoop.cblock.protocol.proto
+ .CBlockClientServerProtocolProtos.MountVolumeResponseProto;
+import org.apache.hadoop.cblock.protocol.proto.CBlockServiceProtocolProtos
+ .VolumeInfoProto;
import org.apache.hadoop.cblock.protocolPB.CBlockClientServerProtocolPB;
import org.apache.hadoop.ipc.ProtobufHelper;
import org.apache.hadoop.ipc.ProtocolTranslator;
@@ -69,14 +81,14 @@ public class CBlockClientProtocolClientSideTranslatorPB
@Override
public MountVolumeResponse mountVolume(
String userName, String volumeName) throws IOException {
- CBlockClientServerProtocolProtos.MountVolumeRequestProto.Builder
+ MountVolumeRequestProto.Builder
request
- = CBlockClientServerProtocolProtos.MountVolumeRequestProto
+ = MountVolumeRequestProto
.newBuilder();
request.setUserName(userName);
request.setVolumeName(volumeName);
try {
- CBlockClientServerProtocolProtos.MountVolumeResponseProto resp
+ MountVolumeResponseProto resp
= rpcProxy.mountVolume(null, request.build());
if (!resp.getIsValid()) {
throw new CBlockException(
@@ -87,7 +99,7 @@ public class CBlockClientProtocolClientSideTranslatorPB
if (resp.getAllContainerIDsList().size() == 0) {
throw new CBlockException("Mount volume request returned no container");
}
- for (CBlockClientServerProtocolProtos.ContainerIDProto containerID :
+ for (ContainerIDProto containerID :
resp.getAllContainerIDsList()) {
if (containerID.hasPipeline()) {
// it should always have a pipeline only except for tests.
@@ -111,4 +123,25 @@ public class CBlockClientProtocolClientSideTranslatorPB
throw ProtobufHelper.getRemoteException(e);
}
}
+
+ @Override
+ public List<VolumeInfo> listVolumes() throws IOException {
+ try {
+ List<VolumeInfo> result = new ArrayList<>();
+ ListVolumesResponseProto
+ listVolumesResponseProto = this.rpcProxy.listVolumes(null,
+ ListVolumesRequestProto.newBuilder()
+ .build());
+ for (VolumeInfoProto volumeInfoProto :
+ listVolumesResponseProto
+ .getVolumeEntryList()) {
+ result.add(new VolumeInfo(volumeInfoProto.getUserName(),
+ volumeInfoProto.getVolumeName(), volumeInfoProto.getVolumeSize(),
+ volumeInfoProto.getBlockSize()));
+ }
+ return result;
+ } catch (ServiceException e) {
+ throw ProtobufHelper.getRemoteException(e);
+ }
+ }
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockManagerHandler.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockManagerHandler.java
index a2ef5b5460..6367c61896 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockManagerHandler.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockManagerHandler.java
@@ -17,9 +17,11 @@
*/
package org.apache.hadoop.cblock.jscsiHelper;
+import org.apache.hadoop.cblock.meta.VolumeInfo;
import org.apache.hadoop.cblock.proto.MountVolumeResponse;
import java.io.IOException;
+import java.util.List;
/**
* This class is the handler of CBlockManager used by target server
@@ -41,4 +43,8 @@ public class CBlockManagerHandler {
String userName, String volumeName) throws IOException {
return handler.mountVolume(userName, volumeName);
}
+
+ public List<VolumeInfo> listVolumes() throws IOException {
+ return handler.listVolumes();
+ }
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockTargetServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockTargetServer.java
index b4f9a92d6b..6c5c56474c 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockTargetServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/jscsiHelper/CBlockTargetServer.java
@@ -104,6 +104,23 @@ public final class CBlockTargetServer extends TargetServer {
return targets.containsKey(checkTargetName);
}
+ @Override
+ public String[] getTargetNames() {
+ try {
+ if (cBlockManagerHandler != null) {
+ return cBlockManagerHandler.listVolumes().
+ stream().map(
+ volumeInfo -> volumeInfo.getUserName() + ":" + volumeInfo
+ .getVolumeName()).toArray(String[]::new);
+ } else {
+ return new String[0];
+ }
+ } catch (IOException e) {
+ LOGGER.error("Can't list existing volumes", e);
+ return new String[0];
+ }
+ }
+
@VisibleForTesting
public HashMap<String, Target> getTargets() {
return targets;
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/proto/CBlockClientProtocol.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/proto/CBlockClientProtocol.java
index 68e32da31a..fc40cef4fc 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/proto/CBlockClientProtocol.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/proto/CBlockClientProtocol.java
@@ -17,7 +17,10 @@
*/
package org.apache.hadoop.cblock.proto;
+import org.apache.hadoop.cblock.meta.VolumeInfo;
+
import java.io.IOException;
+import java.util.List;
/**
* The protocol that CBlock client side uses to talk to server side. CBlock
@@ -30,4 +33,6 @@ import java.io.IOException;
public interface CBlockClientProtocol {
MountVolumeResponse mountVolume(String userName, String volumeName)
throws IOException;
+
+ List<VolumeInfo> listVolumes() throws IOException;
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/protocolPB/CBlockClientServerProtocolServerSideTranslatorPB.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/protocolPB/CBlockClientServerProtocolServerSideTranslatorPB.java
index 23d603aaef..bfe2130822 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/protocolPB/CBlockClientServerProtocolServerSideTranslatorPB.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/cblock/protocolPB/CBlockClientServerProtocolServerSideTranslatorPB.java
@@ -19,15 +19,18 @@ package org.apache.hadoop.cblock.protocolPB;
import com.google.protobuf.RpcController;
import com.google.protobuf.ServiceException;
+import org.apache.hadoop.cblock.meta.VolumeInfo;
import org.apache.hadoop.cblock.proto.CBlockClientProtocol;
import org.apache.hadoop.cblock.proto.MountVolumeResponse;
import org.apache.hadoop.cblock.protocol.proto.CBlockClientServerProtocolProtos;
+import org.apache.hadoop.cblock.protocol.proto.CBlockServiceProtocolProtos;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.scm.container.common.helpers.Pipeline;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
+import java.util.stream.Collectors;
/**
* The server side implementation of cblock client to server protocol.
@@ -83,4 +86,31 @@ public class CBlockClientServerProtocolServerSideTranslatorPB implements
}
return resp.build();
}
+
+ @Override
+ public CBlockClientServerProtocolProtos.ListVolumesResponseProto listVolumes(
+ RpcController controller,
+ CBlockClientServerProtocolProtos.ListVolumesRequestProto request)
+ throws ServiceException {
+ try {
+ CBlockClientServerProtocolProtos.ListVolumesResponseProto.Builder resp =
+ CBlockClientServerProtocolProtos.ListVolumesResponseProto
+ .newBuilder();
+ List<VolumeInfo> volumeInfos = impl.listVolumes();
+ List<CBlockServiceProtocolProtos.VolumeInfoProto> convertedInfos =
+ volumeInfos.stream().map(
+ volumeInfo -> CBlockServiceProtocolProtos.VolumeInfoProto
+ .newBuilder().setUserName(volumeInfo.getUserName())
+ .setBlockSize(volumeInfo.getBlockSize())
+ .setVolumeName(volumeInfo.getVolumeName())
+ .setVolumeSize(volumeInfo.getVolumeSize())
+ .setUsage(volumeInfo.getUsage()).build())
+ .collect(Collectors.toList());
+ resp.addAllVolumeEntry(convertedInfos);
+ return resp.build();
+ } catch (IOException e) {
+ throw new ServiceException(e);
+ }
+ }
+
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/CBlockClientServerProtocol.proto b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/CBlockClientServerProtocol.proto
index 0183baef42..5e3e0c7de6 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/CBlockClientServerProtocol.proto
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/CBlockClientServerProtocol.proto
@@ -28,7 +28,7 @@ option java_generate_equals_and_hash = true;
package hadoop.cblock;
import "Ozone.proto";
-
+import "CBlockServiceProtocol.proto";
/**
* This message is sent from CBlock client side to CBlock server to
* mount a volume specified by owner name and volume name.
@@ -72,9 +72,22 @@ message ContainerIDProto {
optional hadoop.hdfs.ozone.Pipeline pipeline = 3;
}
+
+message ListVolumesRequestProto {
+
+}
+
+message ListVolumesResponseProto {
+ repeated VolumeInfoProto volumeEntry = 1;
+}
+
+
service CBlockClientServerProtocolService {
/**
* mount the volume.
*/
rpc mountVolume(MountVolumeRequestProto) returns (MountVolumeResponseProto);
+
+ rpc listVolumes(ListVolumesRequestProto) returns(ListVolumesResponseProto);
+
}