diff --git a/hadoop-hdfs-project/hadoop-hdfs/pom.xml b/hadoop-hdfs-project/hadoop-hdfs/pom.xml index b46d64e07a1..c6620ed7ecd 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/pom.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/pom.xml @@ -352,6 +352,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> QJournalProtocol.proto editlog.proto fsimage.proto + DatanodeContainerProtocol.proto ${project.build.directory}/generated-sources/java diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/package-info.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/package-info.java new file mode 100644 index 00000000000..db399db25ab --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/package-info.java @@ -0,0 +1,35 @@ +/** + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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; + +/** + This package contains class that support ozone implementation on the datanode + side. + + Main parts of ozone on datanode are: + + 1. REST Interface - This code lives under the web directory and listens to the + WebHDFS port. + + 2. Datanode container classes: This support persistence of ozone objects on + datanode. These classes live under container directory. + + 3. Client and Shell: We also support a ozone REST client lib, they are under + web/client and web/ozShell. + + */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/DatanodeContainerProtocol.proto b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/DatanodeContainerProtocol.proto new file mode 100644 index 00000000000..0fba636900f --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/proto/DatanodeContainerProtocol.proto @@ -0,0 +1,314 @@ +/** + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +/** + * These .proto interfaces are private and Unstable. + * Please see http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/InterfaceClassification.html + * for what changes are allowed for a *Unstable* .proto interface. + */ + +// This file contains protocol buffers that are used to transfer data +// to and from the datanode. +option java_package = "org.apache.hadoop.hdfs.ozone.protocol.proto"; +option java_outer_classname = "ContainerProtos"; +option java_generate_equals_and_hash = true; +package hadoop.hdfs.ozone; +import "hdfs.proto"; + +/** + * Commands that are used to manipulate the state of containers on a datanode. + * + * These commands allow us to work against the datanode - from + * StorageContainer Manager as well as clients. + * + * 1. CreateContainer - This call is usually made by Storage Container + * manager, when we need to create a new container on a given datanode. + * + * 2. ReadContainer - Allows end user to stat a container. For example + * this allows us to return the metadata of a container. + * + * 3. UpdateContainer - Updates a container metadata. + + * 4. DeleteContainer - This call is made to delete a container. + * + * 5. ListContainer - Returns the list of containers on this + * datanode. This will be used by tests and tools. + * + * 6. CreateKey - Given a valid container, creates a key. + * + * 7. ReadKey - Allows user to read the metadata of a Key. + * + * 8. UpdateKey - Updates the metadata of a Key. + * + * 9. DeleteKey - Deletes a given key. + * + * 10. ListKey - Returns a list of keys that are present inside + * a given container. + * + * 11. ReadChunk - Allows us to read a chunk. + * + * 12. DeleteChunk - Delete an unused chunk. + * + * 13. WriteChunk - Allows us to write a chunk + * + * 14. ListChunk - Given a Container/Key returns the list of Chunks. + * + */ + +enum Type { + CreateContainer = 1; + ReadContainer = 2; + UpdateContainer = 3; + DeleteContainer = 4; + ListContainer = 5; + + CreateKey = 6; + Readkey = 7; + UpdateKey = 8; + DeleteKey = 9; + ListKey = 10; + + ReadChunk = 11; + DeleteChunk = 12; + WriteChunk = 13; + ListChunk = 14; +} + + +message ContainerCommandRequestProto { + required Type cmdType = 1; // Type of the command + + // A string that identifies this command, we generate Trace ID in Ozone + // frontend and this allows us to trace that command all over ozone. + optional string traceID = 2; + + // One of the following command is available when the corresponding + // cmdType is set. At the protocol level we allow only + // one command in each packet. + // TODO : Upgrade to Protobuf 2.6 or later. + optional CreateContainerRequestProto createContainer = 3; + optional ReadContainerRequestProto readContainer = 4; + optional UpdateContainerRequestProto updateContainer = 5; + optional DeleteContainerRequestProto deleteContainer = 6; + optional ListContainerRequestProto listContainer = 7; + + optional CreateKeyRequestProto createKey = 8; + optional ReadKeyRequestProto readKey = 9; + optional UpdateKeyRequestProto updateKey = 10; + optional DeleteKeyRequestProto deleteKey = 11; + optional ListKeyRequestProto listKey = 12; + + optional ReadChunkRequestProto readChunk = 13; + optional WriteChunkRequestProto writeChunk = 14; + optional DeleteChunkRequestProto deleteChunk = 15; + optional ListChunkRequestProto listChunk = 16; +} + +message ContainerCommandResponseProto { + required Type cmdType = 1; + optional string traceID = 2; + + optional CreateContainerResponseProto createContainer = 3; + optional ReadContainerResponseProto readContainer = 4; + optional UpdateContainerResponseProto updateContainer = 5; + optional DeleteContainerResponseProto deleteContainer = 6; + optional ListContainerResponseProto listContainer = 7; + + optional CreateKeyResponseProto createKey = 8; + optional ReadKeyResponeProto readKey = 9; + optional UpdateKeyResponseProto updateKey = 10; + optional DeleteKeyResponeProto deleteKey = 11; + optional ListKeyResponeProto listKey = 12; + + optional WriteChunkReponseProto writeChunk = 13; + optional ReadChunkReponseProto readChunk = 14; + optional DeleteChunkResponseProto deleteChunk = 15; + optional ListChunkResponseProto listChunk = 16; + +} + +// A pipeline is composed of one or more datanodes that back a container. +message Pipeline { + required string leaderID = 1; + repeated DatanodeIDProto members = 2; + optional string containerName = 3; +} + +message KeyValue { + required string key = 1; + optional string value = 2; +} + +message ContainerData { + required string name = 1; + repeated KeyValue metadata = 2; + optional string containerPath = 3; +} + +// Container Messages. +message CreateContainerRequestProto { + required Pipeline pipeline = 1; + required ContainerData containerData = 2; +} + +message CreateContainerResponseProto { +} + +message ReadContainerRequestProto { + required Pipeline pipeline = 1; + required string name = 2; +} + +message ReadContainerResponseProto { + optional ContainerData containerData = 2; +} + +message UpdateContainerRequestProto { + required Pipeline pipeline = 1; + required ContainerData containerData = 2; +} + +message UpdateContainerResponseProto { +} + +message DeleteContainerRequestProto { + required Pipeline pipeline = 1; + required string name = 2; +} + +message DeleteContainerResponseProto { +} + +message ListContainerRequestProto { + required Pipeline pipeline = 1; + optional string prevKey = 2; // if this is not set query from start. + required uint32 count = 3; // Max Results to return +} + +message ListContainerResponseProto { + repeated ContainerData containerData = 1; +} + + +message ContainerKeyData { + optional string containerName = 1; + required string name = 2; + repeated KeyValue metadata = 3; +} + +// Key Messages. +message CreateKeyRequestProto { + required Pipeline pipeline = 1; + required ContainerKeyData containerKeyData = 2; +} + +message CreateKeyResponseProto { +} + +message ReadKeyRequestProto { + required Pipeline pipeline = 1; + required ContainerKeyData containerKeyData = 2; +} + +message ReadKeyResponeProto { + repeated KeyValue metadata = 1; + repeated chunkInfo chunkData = 2; +} + +message UpdateKeyRequestProto { + required Pipeline pipeline = 1; + required ContainerKeyData containerKeyData = 2; +} + +message UpdateKeyResponseProto { +} + + +message DeleteKeyRequestProto { + required Pipeline pipeline = 1; + required string name = 2; +} + +message DeleteKeyResponeProto { +} + +message ListKeyRequestProto { + required Pipeline pipeline = 1; + required string prevKey = 2; + required uint32 count = 3; +} + +message ListKeyResponeProto { + repeated ContainerKeyData containerKeyData = 1; +} + +// Chunk Operations + +message chunkInfo { + required uint64 offset = 1; + required uint64 len = 2; + optional uint64 checksum = 3; + repeated KeyValue metadata = 4; +} + +message WriteChunkRequestProto { + required Pipeline pipeline = 1; + required string containerName = 2; + required string keyName = 3; + required chunkInfo chunkData = 4; + repeated bytes data = 5; +} + +message WriteChunkReponseProto { +} + +message ReadChunkRequestProto { + required Pipeline pipeline = 1; + required string containerName = 2; + required string keyName = 3; + required chunkInfo chunkData = 4; +} + +message ReadChunkReponseProto { + required Pipeline pipeline = 1; + required chunkInfo chunkData = 2; + repeated bytes data = 3; +} + +message DeleteChunkRequestProto { + required Pipeline pipeline = 1; + required string containerName = 2; + required string keyName = 3; + required chunkInfo chunkData = 4; +} + +message DeleteChunkResponseProto { +} + +message ListChunkRequestProto { + required Pipeline pipeline = 1; + required string containerName = 2; + required string keyName = 3; + required uint64 startOffset = 4; + required uint32 count = 5; +} + +message ListChunkResponseProto { + repeated chunkInfo chunkData = 1; +} +