feat: router impl (#363)

* feat: heartbeat lease & route api

* feat: batchput&cas

* chore: demo&ut

* chore: by cr

* chore: datanode selector

* chore: rename with_key_range to with_range

* chore: ut
This commit is contained in:
Jiachun Feng
2022-11-01 11:45:05 +08:00
committed by GitHub
parent 518b665f1e
commit dacfd12b8f
31 changed files with 1487 additions and 285 deletions

View File

@@ -11,6 +11,13 @@ service Store {
// Put puts the given key into the key-value store.
rpc Put(PutRequest) returns (PutResponse);
// BatchPut atomically puts the given keys into the key-value store.
rpc BatchPut(BatchPutRequest) returns (BatchPutResponse);
// CompareAndPut atomically puts the value to the given updated
// value if the current value == the expected value.
rpc CompareAndPut(CompareAndPutRequest) returns (CompareAndPutResponse);
// DeleteRange deletes the given range from the key-value store.
rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse);
}
@@ -64,6 +71,42 @@ message PutResponse {
KeyValue prev_kv = 2;
}
message BatchPutRequest {
RequestHeader header = 1;
repeated KeyValue kvs = 2;
// If prev_kv is set, gets the previous key-value pairs before changing it.
// The previous key-value pairs will be returned in the batch put response.
bool prev_kv = 3;
}
message BatchPutResponse {
ResponseHeader header = 1;
// If prev_kv is set in the request, the previous key-value pairs will be
// returned.
repeated KeyValue prev_kvs = 2;
}
message CompareAndPutRequest {
RequestHeader header = 1;
// key is the key, in bytes, to put into the key-value store.
bytes key = 2;
// expect is the previous value, in bytes
bytes expect = 3;
// value is the value, in bytes, to associate with the key in the
// key-value store.
bytes value = 4;
}
message CompareAndPutResponse {
ResponseHeader header = 1;
bool success = 2;
KeyValue prev_kv = 3;
}
message DeleteRangeRequest {
RequestHeader header = 1;

View File

@@ -2,18 +2,34 @@ tonic::include_proto!("greptime.v1.meta");
pub const PROTOCOL_VERSION: u64 = 1;
pub const fn request_header((cluster_id, member_id): (u64, u64)) -> Option<RequestHeader> {
Some(RequestHeader::new((cluster_id, member_id)))
}
impl RequestHeader {
#[inline]
pub const fn new((cluster_id, member_id): (u64, u64)) -> Self {
Self {
pub fn new((cluster_id, member_id): (u64, u64)) -> Option<Self> {
Some(Self {
protocol_version: PROTOCOL_VERSION,
cluster_id,
member_id,
}
})
}
}
impl ResponseHeader {
#[inline]
pub fn success(cluster_id: u64) -> Option<Self> {
Some(Self {
protocol_version: PROTOCOL_VERSION,
cluster_id,
..Default::default()
})
}
#[inline]
pub fn failed(cluster_id: u64, error: Error) -> Option<Self> {
Some(Self {
protocol_version: PROTOCOL_VERSION,
cluster_id,
error: Some(error),
})
}
}