diff options
author | Mukul Kumar Singh <msingh@apache.org> | 2018-01-24 20:16:31 +0530 |
---|---|---|
committer | Owen O'Malley <omalley@apache.org> | 2018-04-26 05:36:04 -0700 |
commit | 4bb9ad8e8f39d88b07a0e408623b39a58d7d72fc (patch) | |
tree | 8bb8feb2b65c06f4b0c113e2bfe70fcd3057fbb2 /hadoop-hdfs-project/hadoop-hdfs/src/main | |
parent | ba4d5a52a8be68ae826f6e6f9d4edbaba9131e85 (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')
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); + } |