1
1
// Copyright 2018 TiKV Project Authors. Licensed under Apache-2.0.
2
2
3
- // Long and nested future chains can quickly result in large generic types.
4
- #![ type_length_limit = "16777216" ]
5
- #![ allow( clippy:: redundant_closure) ]
6
- #![ allow( clippy:: type_complexity) ]
7
- #![ allow( incomplete_features) ]
8
-
9
- //! This crate provides a clean, ready to use client for [TiKV](https://github.com/tikv/tikv), a
10
- //! distributed transactional Key-Value database written in Rust.
11
- //!
12
- //! With this crate you can easily connect to any TiKV deployment, interact with it, and mutate the
13
- //! data it contains.
3
+ //! This crate provides an easy-to-use client for [TiKV](https://github.com/tikv/tikv), a
4
+ //! distributed, transactional key-value database written in Rust.
5
+ //!
6
+ //! This crate lets you connect to a TiKV cluster and use either a transactional or raw (simple
7
+ //! get/put style without transactional consistency guarantees) API to access and update your data.
8
+ //!
9
+ //! The TiKV Rust client supports several levels of abstraction. The most convenient way to use the
10
+ //! client is via [`RawClient`] and [`TransactionClient`]. This gives a very high-level API which
11
+ //! mostly abstracts over the distributed nature of the store and has sensible defaults for all
12
+ //! protocols. This interface can be configured, primarily when creating the client or transaction
13
+ //! objects via the [`Config`] and [`TransactionOptions`] structs. Using some options, you can take
14
+ //! over parts of the protocols (such as retrying failed messages) yourself.
15
+ //!
16
+ //! The lowest level of abstraction is to create and send gRPC messages directly to TiKV (and PD)
17
+ //! nodes. The `tikv-client-store` and `tikv-client-pd` crates make this easier than using the
18
+ //! protobuf definitions and a gRPC library directly, but give you the same level of control.
19
+ //!
20
+ //! In between these levels of abstraction, you can send and receive individual messages to the TiKV
21
+ //! cluster, but take advantage of library code for common operations such as resolving data to
22
+ //! regions and thus nodes in the cluster, or retrying failed messages. This can be useful for
23
+ //! testing a TiKV cluster or for some advanced use cases. See the [`request`] module for
24
+ //! this API, and [`raw::lowering`] and [`transaction::lowering`] for
25
+ //! convenience methods for creating request objects.
14
26
//!
15
27
//! ## Choosing an API
16
28
//!
17
- //! This crate offers both [** raw**](raw/index.html ) and
18
- //! [** transactional**](transaction/index.html ) APIs. You should choose just one for your system.
29
+ //! This crate offers both [raw](RawClient ) and
30
+ //! [transactional](Transaction ) APIs. You should choose just one for your system.
19
31
//!
20
- //! The * consequence* of supporting transactions is increased overhead of coordination with the
21
- //! placement driver for timestamp acquisition. This is approximately 1 RTT .
32
+ //! The consequence of supporting transactions is increased overhead of coordination with the
33
+ //! placement driver and TiKV, and additional code complexity .
22
34
//!
23
35
//! *While it is possible to use both APIs at the same time, doing so is unsafe and unsupported.*
24
36
//!
25
- //! Choose the one that suites your needs as described below, then add the import statement to your
26
- //! file where you need to use the library.
27
- //!
28
37
//! ### Transactional
29
38
//!
30
- //! The [transactional](transaction/index.html ) API supports **transactions** via Multi-Version
31
- //! Concurrency Control (MVCC).
39
+ //! The [transactional](Transaction ) API supports **transactions** via multi-version
40
+ //! concurrency control (MVCC).
32
41
//!
33
- //! ** Best when you mostly do** complex sets of actions, actions which may require a rollback,
34
- //! operations affecting multiple keys or values, or operations that depend on strong ordering .
42
+ //! Best when you mostly do complex sets of actions, actions which may require a rollback,
43
+ //! operations affecting multiple keys or values, or operations that depend on strong consistency .
35
44
//!
36
- //! ```rust
37
- //! use tikv_client::*;
38
- //! ```
39
45
//!
40
46
//! ### Raw
41
47
//!
42
- //! The [raw](raw/index.html ) API has ** reduced coordination overhead** , but lacks any
48
+ //! The [raw](RawClient ) API has reduced coordination overhead, but lacks any
43
49
//! transactional abilities.
44
50
//!
45
- //! ** Best when you mostly do** single row changes, and have very limited cross-row (eg. foreign
46
- //! key) requirements. You will not be able to use transactions with this API.
51
+ //! Best when you mostly do single value changes, and have very limited cross-value
52
+ //! requirements. You will not be able to use transactions with this API.
47
53
//!
48
- //! ```rust
49
- //! use tikv_client::*;
50
- //! ```
54
+ //! ## Usage
55
+ //!
56
+ //! The general flow of using the client crate is to create either a raw or transaction client
57
+ //! object (which can be configured) then send commands using the client object, or use it to create
58
+ //! transactions objects. In the latter case, the transaction is built up using various commands and
59
+ //! then committed (or rolled back).
51
60
//!
52
- //! ## Connect
61
+ //! ### Examples
53
62
//!
54
- //! Regardless of which API you choose, you'll need to connect your client
55
- //! ([raw](raw::Client), [transactional](transaction::Client)).
63
+ //! Raw mode:
56
64
//!
57
65
//! ```rust,no_run
58
- //! # use tikv_client::* ;
66
+ //! # use tikv_client::{RawClient, Result} ;
59
67
//! # use futures::prelude::*;
60
- //!
68
+ //! # fn main() -> Result<()> {
61
69
//! # futures::executor::block_on(async {
62
- //! // Configure endpoints and optional TLS.
63
- //! let config = Config::default().with_security("root.ca", "internal.cert", "internal.key");
64
- //!
65
- //! // Get a transactional client.
66
- //! let client = TransactionClient::new_with_config(
67
- //! vec![
68
- //! // A list of PD endpoints.
69
- //! "192.168.0.100:2379",
70
- //! "192.168.0.101:2379",
71
- //! ], config).await.unwrap();
72
- //! # });
70
+ //! let client = RawClient::new(vec!["127.0.0.1:2379"]).await?;
71
+ //! client.put("key".to_owned(), "value".to_owned()).await?;
72
+ //! let value = client.get("key".to_owned()).await?;
73
+ //! # Ok(())
74
+ //! # })}
73
75
//! ```
74
76
//!
75
- //! At this point, you should seek the documentation in the related API modules.
77
+ //! Transactional mode:
78
+ //!
79
+ //! ```rust,no_run
80
+ //! # use tikv_client::{TransactionClient, Result};
81
+ //! # use futures::prelude::*;
82
+ //! # fn main() -> Result<()> {
83
+ //! # futures::executor::block_on(async {
84
+ //! let txn_client = TransactionClient::new(vec!["127.0.0.1:2379"]).await?;
85
+ //! let mut txn = txn_client.begin_optimistic().await?;
86
+ //! txn.put("key".to_owned(), "value".to_owned()).await?;
87
+ //! let value = txn.get("key".to_owned()).await?;
88
+ //! txn.commit().await?;
89
+ //! # Ok(())
90
+ //! # })}
91
+ //! ```
76
92
77
93
#[ macro_use]
78
- mod request;
79
-
94
+ pub mod request;
80
95
#[ macro_use]
81
- mod transaction;
96
+ #[ doc( hidden) ]
97
+ pub mod transaction;
82
98
83
99
mod backoff;
84
100
mod compat;
85
101
mod config;
86
102
mod kv;
87
103
mod pd;
88
- mod raw;
104
+ #[ doc( hidden) ]
105
+ pub mod raw;
89
106
mod region;
90
107
mod stats;
91
108
mod store;
@@ -105,18 +122,17 @@ pub use crate::backoff::Backoff;
105
122
#[ doc( inline) ]
106
123
pub use crate :: kv:: { BoundRange , IntoOwnedRange , Key , KvPair , Value } ;
107
124
#[ doc( inline) ]
108
- pub use crate :: raw:: { lowering:: * , Client as RawClient , ColumnFamily } ;
125
+ pub use crate :: raw:: { lowering as raw_lowering , Client as RawClient , ColumnFamily } ;
109
126
#[ doc( inline) ]
110
127
pub use crate :: request:: RetryOptions ;
111
128
#[ doc( inline) ]
112
129
pub use crate :: timestamp:: { Timestamp , TimestampExt } ;
113
130
#[ doc( inline) ]
114
131
pub use crate :: transaction:: {
115
- lowering:: * , CheckLevel , Client as TransactionClient , Snapshot , Transaction , TransactionOptions ,
132
+ lowering as transaction_lowering, CheckLevel , Client as TransactionClient , Snapshot ,
133
+ Transaction , TransactionOptions ,
116
134
} ;
117
135
#[ doc( inline) ]
118
136
pub use config:: Config ;
119
137
#[ doc( inline) ]
120
- pub use region:: { Region , RegionId , RegionVerId , StoreId } ;
121
- #[ doc( inline) ]
122
138
pub use tikv_client_common:: { security:: SecurityManager , Error , Result } ;
0 commit comments