blob: 6260bd5f8961fecfdf085c218c2406ec3645b73f [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.
syntax = "proto2";
package kudu.tserver;
option java_package = "org.apache.kudu.tserver";
import "kudu/common/wire_protocol.proto";
import "kudu/consensus/metadata.proto";
import "kudu/fs/fs.proto";
import "kudu/rpc/rpc_header.proto";
import "kudu/tablet/metadata.proto";
import "kudu/util/pb_util.proto";
// RaftConfig tablet copy RPC calls.
service TabletCopyService {
option (kudu.rpc.default_authz_method) = "AuthorizeServiceUser";
// Establish a tablet copy session.
rpc BeginTabletCopySession(BeginTabletCopySessionRequestPB)
returns (BeginTabletCopySessionResponsePB);
// Check whether the specified session is active.
rpc CheckSessionActive(CheckTabletCopySessionActiveRequestPB)
returns (CheckTabletCopySessionActiveResponsePB);
// Fetch data (blocks, logs) from the server.
rpc FetchData(FetchDataRequestPB)
returns (FetchDataResponsePB);
// End a tablet copy session, allow server to release resources.
rpc EndTabletCopySession(EndTabletCopySessionRequestPB)
returns (EndTabletCopySessionResponsePB);
}
// Tablet Copy-specific errors use this protobuf.
message TabletCopyErrorPB {
extend kudu.rpc.ErrorStatusPB {
optional TabletCopyErrorPB tablet_copy_error_ext = 102;
}
enum Code {
// An error which has no more specific error code.
// The code and message in 'status' may reveal more details.
//
// RPCs should avoid returning this, since callers will not be
// able to easily parse the error.
UNKNOWN_ERROR = 1;
// The specified tablet copy session either never existed or has expired.
NO_SESSION = 2;
// Unknown tablet.
TABLET_NOT_FOUND = 3;
// Unknown data block.
BLOCK_NOT_FOUND = 4;
// Unknown WAL segment.
WAL_SEGMENT_NOT_FOUND = 5;
// Invalid request. Possibly missing parameters.
INVALID_TABLET_COPY_REQUEST = 6;
// Error reading or transferring data.
IO_ERROR = 7;
}
// The error code.
required Code code = 1 [ default = UNKNOWN_ERROR ];
// The Status object for the error. This will include a textual
// message that may be more useful to present in log messages, etc,
// though its error code is less specific.
required AppStatusPB status = 2;
}
message BeginTabletCopySessionRequestPB {
// permanent_uuid of the requesting peer.
required bytes requestor_uuid = 1;
// tablet_id of the tablet the requester desires to bootstrap from.
required bytes tablet_id = 2;
}
message BeginTabletCopySessionResponsePB {
// Opaque session id assigned by the server.
// No guarantees are made as to the format of the session id.
required bytes session_id = 1;
// Maximum session idle timeout between requests.
// Learners will have to start over again if they reach this timeout.
// A value of 0 means there is no timeout.
required uint64 session_idle_timeout_millis = 2;
// Active superblock at the time of the request.
required tablet.TabletSuperBlockPB superblock = 3;
// Identifiers for the WAL segments available for download.
// Each WAL segment is keyed by its sequence number.
repeated uint64 wal_segment_seqnos = 4;
// A snapshot of the consensus state at the time that the
// tablet copy session was started.
required consensus.ConsensusStatePB initial_cstate = 5;
// permanent_uuid of the responding peer.
optional bytes responder_uuid = 6;
}
message CheckTabletCopySessionActiveRequestPB {
// Valid Session ID returned by a BeginTabletCopySession() RPC call.
required bytes session_id = 1;
// Set keepalive to true to reset the session timeout timer.
optional bool keepalive = 2 [default = false];
}
message CheckTabletCopySessionActiveResponsePB {
// Whether the given session id represents an active tablet copy session.
required bool session_is_active = 1;
}
// A "union" type that allows the same RPC call to fetch different types of
// data (data blocks or log files).
message DataIdPB {
enum IdType {
UNKNOWN = 0;
BLOCK = 1;
LOG_SEGMENT = 2;
}
// Indicator whether it's a block or log segment id.
required IdType type = 1;
// Exactly one of these must be set.
optional BlockIdPB block_id = 2; // To fetch a block.
optional uint64 wal_segment_seqno = 3; // To fetch a log segment.
}
message FetchDataRequestPB {
// Valid Session ID returned by a BeginTabletCopySession() RPC call.
required bytes session_id = 1;
// The server will use this ID to determine the key and type of data
// that was requested.
required DataIdPB data_id = 2;
// Offset into data to start reading from.
// If not specified, the server will send the data from offset 0.
optional uint64 offset = 3 [default = 0];
// Maximum length of the chunk of data to return.
// If max_length is not specified, or if the server's max is less than the
// requested max, the server will use its own max.
optional int64 max_length = 4 [default = 0];
}
// A chunk of data (a slice of a block, file, etc).
message DataChunkPB {
// Offset into the complete data block or file that 'data' starts at.
required uint64 offset = 1;
// Actual bytes of data from the data block, starting at 'offset'.
required bytes data = 2 [(kudu.REDACT) = true];
// CRC32C of the bytes contained in 'data'.
required fixed32 crc32 = 3;
// Full length, in bytes, of the complete data block or file on the server.
// The number of bytes returned in 'data' can certainly be less than this.
required int64 total_data_length = 4;
}
message FetchDataResponsePB {
// The server will automatically release the resources (i.e. close file, free
// read buffers) for a given data resource after the last byte is read.
// So, per-resource, chunks are optimized to be fetched in-order.
required DataChunkPB chunk = 1;
}
message EndTabletCopySessionRequestPB {
required bytes session_id = 1;
// Set to true if bootstrap is successful.
required bool is_success = 2;
// Client-provided error message. The server will log this error so that an
// admin can identify when bad things are happening with tablet copy.
optional AppStatusPB error = 3;
}
message EndTabletCopySessionResponsePB {
}