blob: 0952d83035a8e0ff424feb57cfa0249d257f8dbe [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
*
* 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.
*/
// This file contains protocol buffers that are used for Client service.
option java_package = "org.apache.hadoop.hbase.protobuf.generated";
option java_outer_classname = "ClientProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
option optimize_for = SPEED;
import "hbase.proto";
import "Comparator.proto";
/**
* Container for a list of column qualifier names of a family.
*/
message Column {
required bytes family = 1;
repeated bytes qualifier = 2;
}
/**
* The protocol buffer version of Get
*/
message Get {
required bytes row = 1;
repeated Column column = 2;
repeated NameBytesPair attribute = 3;
optional uint64 lockId = 4;
optional Filter filter = 5;
optional TimeRange timeRange = 6;
optional uint32 maxVersions = 7 [default = 1];
optional bool cacheBlocks = 8 [default = true];
optional uint32 storeLimit = 9;
optional uint32 storeOffset = 10;
}
/**
* For performance reason, we don't use KeyValue
* here. We use the actual KeyValue bytes.
*/
message Result {
repeated bytes keyValueBytes = 1;
}
/**
* The get request. Perform a single Get operation.
* Unless existenceOnly is specified, return all the requested data
* for the row that matches exactly, or the one that immediately
* precedes it if closestRowBefore is specified.
*
* If existenceOnly is set, only the existence will be returned.
*/
message GetRequest {
required RegionSpecifier region = 1;
required Get get = 2;
// If the row to get doesn't exist, return the
// closest row before.
optional bool closestRowBefore = 3;
// The result isn't asked for, just check for
// the existence. If specified, closestRowBefore
// will be ignored
optional bool existenceOnly = 4;
}
message GetResponse {
optional Result result = 1;
// used for Get to check existence only
optional bool exists = 2;
}
/**
* Condition to check if the value of a given cell (row,
* family, qualifier) matches a value via a given comparator.
*
* Condition is used in check and mutate operations.
*/
message Condition {
required bytes row = 1;
required bytes family = 2;
required bytes qualifier = 3;
required CompareType compareType = 4;
required Comparator comparator = 5;
}
/**
* A specific mutate inside a mutate request.
* It can be an append, increment, put or delete based
* on the mutate type.
*/
message Mutate {
required bytes row = 1;
required MutateType mutateType = 2;
repeated ColumnValue columnValue = 3;
repeated NameBytesPair attribute = 4;
optional uint64 timestamp = 5;
optional uint64 lockId = 6;
optional bool writeToWAL = 7 [default = true];
// For some mutate, result may be returned, in which case,
// time range can be specified for potential performance gain
optional TimeRange timeRange = 10;
enum MutateType {
APPEND = 0;
INCREMENT = 1;
PUT = 2;
DELETE = 3;
}
enum DeleteType {
DELETE_ONE_VERSION = 0;
DELETE_MULTIPLE_VERSIONS = 1;
DELETE_FAMILY = 2;
}
message ColumnValue {
required bytes family = 1;
repeated QualifierValue qualifierValue = 2;
message QualifierValue {
optional bytes qualifier = 1;
optional bytes value = 2;
optional uint64 timestamp = 3;
optional DeleteType deleteType = 4;
}
}
}
/**
* The mutate request. Perform a single Mutate operation.
*
* Optionally, you can specify a condition. The mutate
* will take place only if the condition is met. Otherwise,
* the mutate will be ignored. In the response result,
* parameter processed is used to indicate if the mutate
* actually happened.
*/
message MutateRequest {
required RegionSpecifier region = 1;
required Mutate mutate = 2;
optional Condition condition = 3;
}
message MutateResponse {
optional Result result = 1;
// used for mutate to indicate processed only
optional bool processed = 2;
}
/**
* Instead of get from a table, you can scan it with optional filters.
* You can specify the row key range, time range, the columns/families
* to scan and so on.
*
* This scan is used the first time in a scan request. The response of
* the initial scan will return a scanner id, which should be used to
* fetch result batches later on before it is closed.
*/
message Scan {
repeated Column column = 1;
repeated NameBytesPair attribute = 2;
optional bytes startRow = 3;
optional bytes stopRow = 4;
optional Filter filter = 5;
optional TimeRange timeRange = 6;
optional uint32 maxVersions = 7 [default = 1];
optional bool cacheBlocks = 8 [default = true];
optional uint32 batchSize = 9;
optional uint64 maxResultSize = 10;
optional uint32 storeLimit = 11;
optional uint32 storeOffset = 12;
}
/**
* A scan request. Initially, it should specify a scan. Later on, you
* can use the scanner id returned to fetch result batches with a different
* scan request.
*
* The scanner will remain open if there are more results, and it's not
* asked to be closed explicitly.
*
* You can fetch the results and ask the scanner to be closed to save
* a trip if you are not interested in remaining results.
*/
message ScanRequest {
optional RegionSpecifier region = 1;
optional Scan scan = 2;
optional uint64 scannerId = 3;
optional uint32 numberOfRows = 4;
optional bool closeScanner = 5;
}
/**
* The scan response. If there are no more results, moreResults will
* be false. If it is not specified, it means there are more.
*/
message ScanResponse {
repeated Result result = 1;
optional uint64 scannerId = 2;
optional bool moreResults = 3;
optional uint32 ttl = 4;
}
message LockRowRequest {
required RegionSpecifier region = 1;
repeated bytes row = 2;
}
message LockRowResponse {
required uint64 lockId = 1;
optional uint32 ttl = 2;
}
message UnlockRowRequest {
required RegionSpecifier region = 1;
required uint64 lockId = 2;
}
message UnlockRowResponse {
}
/**
* Atomically bulk load multiple HFiles (say from different column families)
* into an open region.
*/
message BulkLoadHFileRequest {
required RegionSpecifier region = 1;
repeated FamilyPath familyPath = 2;
optional bool assignSeqNum = 3;
message FamilyPath {
required bytes family = 1;
required string path = 2;
}
}
message BulkLoadHFileResponse {
required bool loaded = 1;
}
/**
* An individual coprocessor call. You must specify the protocol,
* the method, and the row to which the call will be executed.
*
* You can specify the configuration settings in the property list.
*
* The parameter list has the parameters used for the method.
* A parameter is a pair of parameter name and the binary parameter
* value. The name is the parameter class name. The value is the
* binary format of the parameter, for example, protocol buffer
* encoded value.
*/
message Exec {
required bytes row = 1;
required string protocolName = 2;
required string methodName = 3;
repeated NameStringPair property = 4;
repeated NameBytesPair parameter = 5;
}
/**
* Executes a single {@link org.apache.hadoop.hbase.ipc.CoprocessorProtocol}
* method using the registered protocol handlers.
* {@link CoprocessorProtocol} implementations must be registered via the
* {@link org.apache.hadoop.hbase.regionserver.HRegion#registerProtocol(
* Class, org.apache.hadoop.hbase.ipc.CoprocessorProtocol)}
* method before they are available.
*/
message ExecCoprocessorRequest {
required RegionSpecifier region = 1;
required Exec call = 2;
}
message ExecCoprocessorResponse {
required NameBytesPair value = 1;
}
/**
* An action that is part of MultiRequest.
* This is a union type - exactly one of the fields will be set.
*/
message MultiAction {
optional Mutate mutate = 1;
optional Get get = 2;
optional Exec exec = 3;
}
/**
* An individual action result. The result will in the
* same order as the action in the request. If an action
* returns a value, it is set in value field. If it doesn't
* return anything, the result will be empty. If an action
* fails to execute due to any exception, the exception
* is returned as a stringified parameter.
*/
message ActionResult {
optional NameBytesPair value = 1;
optional NameBytesPair exception = 2;
}
/**
* You can execute a list of actions on a given region in order.
*
* If it is a list of mutate actions, atomic can be set
* to make sure they can be processed atomically, just like
* RowMutations.
*/
message MultiRequest {
required RegionSpecifier region = 1;
repeated MultiAction action = 2;
optional bool atomic = 3;
}
message MultiResponse {
repeated ActionResult result = 1;
}
service ClientService {
rpc get(GetRequest)
returns(GetResponse);
rpc mutate(MutateRequest)
returns(MutateResponse);
rpc scan(ScanRequest)
returns(ScanResponse);
rpc lockRow(LockRowRequest)
returns(LockRowResponse);
rpc unlockRow(UnlockRowRequest)
returns(UnlockRowResponse);
rpc bulkLoadHFile(BulkLoadHFileRequest)
returns(BulkLoadHFileResponse);
rpc execCoprocessor(ExecCoprocessorRequest)
returns(ExecCoprocessorResponse);
rpc multi(MultiRequest)
returns(MultiResponse);
}