/** * 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. package pb; 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 "Filter.proto"; import "Cell.proto"; import "Comparator.proto"; //import "MapReduce.proto"; /** * The protocol buffer version of Authorizations. */ message Authorizations { repeated string label = 1; } /** * The protocol buffer version of CellVisibility. */ message CellVisibility { required string expression = 1; } /** * Container for a list of column qualifier names of a family. */ message Column { required bytes family = 1; repeated bytes qualifier = 2; } /** * Consistency defines the expected consistency level for an operation. */ enum Consistency { STRONG = 0; TIMELINE = 1; } /** * The protocol buffer version of Get. * Unless existence_only is specified, return all the requested data * for the row that matches exactly, or the one that immediately * precedes it if closest_row_before is specified. */ message Get { required bytes row = 1; repeated Column column = 2; repeated NameBytesPair attribute = 3; optional Filter filter = 4; optional TimeRange time_range = 5; optional uint32 max_versions = 6 [default = 1]; optional bool cache_blocks = 7 [default = true]; optional uint32 store_limit = 8; optional uint32 store_offset = 9; // The result isn't asked for, just check for // the existence. optional bool existence_only = 10 [default = false]; // If the row to get doesn't exist, return the // closest row before. optional bool closest_row_before = 11 [default = false]; optional Consistency consistency = 12 [default = STRONG]; repeated ColumnFamilyTimeRange cf_time_range = 13; } message Result { // Result includes the Cells or else it just has a count of Cells // that are carried otherwise. repeated Cell cell = 1; // The below count is set when the associated cells are // not part of this protobuf message; they are passed alongside // and then this Message is just a placeholder with metadata. // The count is needed to know how many to peel off the block of Cells as // ours. NOTE: This is different from the pb managed cell_count of the // 'cell' field above which is non-null when the cells are pb'd. optional int32 associated_cell_count = 2; // used for Get to check existence only. Not set if existence_only was not set to true // in the query. optional bool exists = 3; // Whether or not the results are coming from possibly stale data optional bool stale = 4 [default = false]; // Whether or not the entire result could be returned. Results will be split when // the RPC chunk size limit is reached. Partial results contain only a subset of the // cells for a row and must be combined with a result containing the remaining cells // to form a complete result optional bool partial = 5 [default = false]; } /** * The get request. Perform a single Get operation. */ message GetRequest { required RegionSpecifier region = 1; required Get get = 2; } message GetResponse { optional Result result = 1; } /** * 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 compare_type = 4; required Comparator comparator = 5; } /** * A specific mutation inside a mutate request. * It can be an append, increment, put or delete based * on the mutation type. It can be fully filled in or * only metadata present because data is being carried * elsewhere outside of pb. */ message MutationProto { optional bytes row = 1; optional MutationType mutate_type = 2; repeated ColumnValue column_value = 3; optional uint64 timestamp = 4; repeated NameBytesPair attribute = 5; optional Durability durability = 6 [default = USE_DEFAULT]; // For some mutations, a result may be returned, in which case, // time range can be specified for potential performance gain optional TimeRange time_range = 7; // The below count is set when the associated cells are NOT // part of this protobuf message; they are passed alongside // and then this Message is a placeholder with metadata. The // count is needed to know how many to peel off the block of Cells as // ours. NOTE: This is different from the pb managed cell_count of the // 'cell' field above which is non-null when the cells are pb'd. optional int32 associated_cell_count = 8; optional uint64 nonce = 9; enum Durability { USE_DEFAULT = 0; SKIP_WAL = 1; ASYNC_WAL = 2; SYNC_WAL = 3; FSYNC_WAL = 4; } enum MutationType { APPEND = 0; INCREMENT = 1; PUT = 2; DELETE = 3; } enum DeleteType { DELETE_ONE_VERSION = 0; DELETE_MULTIPLE_VERSIONS = 1; DELETE_FAMILY = 2; DELETE_FAMILY_VERSION = 3; } message ColumnValue { required bytes family = 1; repeated QualifierValue qualifier_value = 2; message QualifierValue { optional bytes qualifier = 1; optional bytes value = 2; optional uint64 timestamp = 3; optional DeleteType delete_type = 4; optional bytes tags = 5; } } } /** * 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 MutationProto mutation = 2; optional Condition condition = 3; optional uint64 nonce_group = 4; } 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 start_row = 3; optional bytes stop_row = 4; optional Filter filter = 5; optional TimeRange time_range = 6; optional uint32 max_versions = 7 [default = 1]; optional bool cache_blocks = 8 [default = true]; optional uint32 batch_size = 9; optional uint64 max_result_size = 10; optional uint32 store_limit = 11; optional uint32 store_offset = 12; optional bool load_column_families_on_demand = 13; /* DO NOT add defaults to load_column_families_on_demand. */ optional bool small = 14; optional bool reversed = 15 [default = false]; optional Consistency consistency = 16 [default = STRONG]; optional uint32 caching = 17; optional bool allow_partial_results = 18; repeated ColumnFamilyTimeRange cf_time_range = 19; } /** * 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 scanner_id = 3; optional uint32 number_of_rows = 4; optional bool close_scanner = 5; optional uint64 next_call_seq = 6; optional bool client_handles_partials = 7; optional bool client_handles_heartbeats = 8; optional bool track_scan_metrics = 9; optional bool renew = 10 [default = false]; } /** * The scan response. If there are no more results, more_results will * be false. If it is not specified, it means there are more. */ message ScanResponse { // This field is filled in if we are doing cellblocks. A cellblock is made up // of all Cells serialized out as one cellblock BUT responses from a server // have their Cells grouped by Result. So we can reconstitute the // Results on the client-side, this field is a list of counts of Cells // in each Result that makes up the response. For example, if this field // has 3, 3, 3 in it, then we know that on the client, we are to make // three Results each of three Cells each. repeated uint32 cells_per_result = 1; optional uint64 scanner_id = 2; optional bool more_results = 3; optional uint32 ttl = 4; // If cells are not carried in an accompanying cellblock, then they are pb'd here. // This field is mutually exclusive with cells_per_result (since the Cells will // be inside the pb'd Result) repeated Result results = 5; optional bool stale = 6; // This field is filled in if we are doing cellblocks. In the event that a row // could not fit all of its cells into a single RPC chunk, the results will be // returned as partials, and reconstructed into a complete result on the client // side. This field is a list of flags indicating whether or not the result // that the cells belong to is a partial result. For example, if this field // has false, false, true in it, then we know that on the client side, we need to // make another RPC request since the last result was only a partial. repeated bool partial_flag_per_result = 7; // A server may choose to limit the number of results returned to the client for // reasons such as the size in bytes or quantity of results accumulated. This field // will true when more results exist in the current region. optional bool more_results_in_region = 8; // This field is filled in if the server is sending back a heartbeat message. // Heartbeat messages are sent back to the client to prevent the scanner from // timing out. Seeing a heartbeat message communicates to the Client that the // server would have continued to scan had the time limit not been reached. optional bool heartbeat_message = 9; // This field is filled in if the client has requested that scan metrics be tracked. // The metrics tracked here are sent back to the client to be tracked together with // the existing client side metrics. //optional ScanMetrics scan_metrics = 10; // not in gohbase } /** * Atomically bulk load multiple HFiles (say from different column families) * into an open region. */ message BulkLoadHFileRequest { required RegionSpecifier region = 1; repeated FamilyPath family_path = 2; optional bool assign_seq_num = 3; message FamilyPath { required bytes family = 1; required string path = 2; } } message BulkLoadHFileResponse { required bool loaded = 1; } message CoprocessorServiceCall { required bytes row = 1; required string service_name = 2; required string method_name = 3; required bytes request = 4; } message CoprocessorServiceResult { optional NameBytesPair value = 1; } message CoprocessorServiceRequest { required RegionSpecifier region = 1; required CoprocessorServiceCall call = 2; } message CoprocessorServiceResponse { required RegionSpecifier region = 1; required NameBytesPair value = 2; } // Either a Get or a Mutation message Action { // If part of a multi action, useful aligning // result with what was originally submitted. optional uint32 index = 1; optional MutationProto mutation = 2; optional Get get = 3; optional CoprocessorServiceCall service_call = 4; } /** * Actions to run against a Region. */ message RegionAction { required RegionSpecifier region = 1; // When set, run mutations as atomic unit. optional bool atomic = 2; repeated Action action = 3; } /* * Statistics about the current load on the region */ message RegionLoadStats { // Percent load on the memstore. Guaranteed to be positive, between 0 and 100. optional int32 memstoreLoad = 1 [default = 0]; // Percent JVM heap occupancy. Guaranteed to be positive, between 0 and 100. // We can move this to "ServerLoadStats" should we develop them. optional int32 heapOccupancy = 2 [default = 0]; // Compaction pressure. Guaranteed to be positive, between 0 and 100. optional int32 compactionPressure = 3 [default = 0]; } message MultiRegionLoadStats{ repeated RegionSpecifier region = 1; repeated RegionLoadStats stat = 2; } /** * Either a Result or an Exception NameBytesPair (keyed by * exception name whose value is the exception stringified) * or maybe empty if no result and no exception. */ message ResultOrException { // If part of a multi call, save original index of the list of all // passed so can align this response w/ original request. optional uint32 index = 1; optional Result result = 2; optional NameBytesPair exception = 3; // result if this was a coprocessor service call optional CoprocessorServiceResult service_result = 4; // current load on the region optional RegionLoadStats loadStats = 5 [deprecated=true]; } /** * The result of a RegionAction. */ message RegionActionResult { repeated ResultOrException resultOrException = 1; // If the operation failed globally for this region, this exception is set optional NameBytesPair exception = 2; } /** * Execute a list of actions on a given region in order. * Nothing prevents a request to contains a set of RegionAction on the same region. * For this reason, the matching between the MultiRequest and the MultiResponse is not * done by the region specifier but by keeping the order of the RegionActionResult vs. * the order of the RegionAction. */ message MultiRequest { repeated RegionAction regionAction = 1; optional uint64 nonceGroup = 2; optional Condition condition = 3; } message MultiResponse { repeated RegionActionResult regionActionResult = 1; // used for mutate to indicate processed only optional bool processed = 2; optional MultiRegionLoadStats regionStatistics = 3; } service ClientService { rpc Get(GetRequest) returns(GetResponse); rpc Mutate(MutateRequest) returns(MutateResponse); rpc Scan(ScanRequest) returns(ScanResponse); rpc BulkLoadHFile(BulkLoadHFileRequest) returns(BulkLoadHFileResponse); rpc ExecService(CoprocessorServiceRequest) returns(CoprocessorServiceResponse); rpc ExecRegionServerService(CoprocessorServiceRequest) returns(CoprocessorServiceResponse); rpc Multi(MultiRequest) returns(MultiResponse); }