Skip to content

Commit fb9d1a1

Browse files
committed
chore: add compression encoding for request/response
1 parent d71b1ae commit fb9d1a1

File tree

6 files changed

+156
-37
lines changed

6 files changed

+156
-37
lines changed

examples/ingest.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use greptimedb_ingester::api::v1::*;
1818
use greptimedb_ingester::helpers::schema::*;
1919
use greptimedb_ingester::helpers::values::*;
2020
use greptimedb_ingester::{
21-
ChannelConfig, ChannelManager, Client, ClientTlsOption, Database, DEFAULT_SCHEMA_NAME,
21+
ChannelConfig, ChannelManager, ClientBuilder, ClientTlsOption, Database, DEFAULT_SCHEMA_NAME,
2222
};
2323

2424
#[tokio::main]
@@ -31,14 +31,17 @@ async fn main() {
3131
.map(|s| s == "1")
3232
.unwrap_or(false);
3333

34+
let builder = ClientBuilder::default()
35+
.peers(vec![&greptimedb_endpoint])
36+
.compression(greptimedb_ingester::Compression::Gzip);
3437
let grpc_client = if greptimedb_secure {
3538
let channel_config = ChannelConfig::default().client_tls_config(ClientTlsOption::default());
3639

3740
let channel_manager = ChannelManager::with_tls_config(channel_config)
3841
.expect("Failed to create channel manager");
39-
Client::with_manager_and_urls(channel_manager, vec![&greptimedb_endpoint])
42+
builder.channel_manager(channel_manager).build()
4043
} else {
41-
Client::with_urls(vec![&greptimedb_endpoint])
44+
builder.build()
4245
};
4346

4447
let client = Database::new_with_dbname(greptimedb_dbname, grpc_client);

examples/stream_ingest.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use derive_new::new;
1616

1717
use greptimedb_ingester::api::v1::*;
18-
use greptimedb_ingester::{Client, Database, DEFAULT_SCHEMA_NAME};
18+
use greptimedb_ingester::{ClientBuilder, Database, DEFAULT_SCHEMA_NAME};
1919

2020
#[tokio::main]
2121
async fn main() {
@@ -25,7 +25,9 @@ async fn main() {
2525
let greptimedb_dbname =
2626
std::env::var("GREPTIMEDB_DBNAME").unwrap_or_else(|_| DEFAULT_SCHEMA_NAME.to_owned());
2727

28-
let grpc_client = Client::with_urls(vec![&greptimedb_endpoint]);
28+
let grpc_client = ClientBuilder::default()
29+
.peers(vec![&greptimedb_endpoint])
30+
.build();
2931

3032
let client = Database::new_with_dbname(greptimedb_dbname, grpc_client);
3133

src/client.rs

Lines changed: 142 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use crate::api::v1::HealthCheckRequest;
2020
use crate::channel_manager::ChannelManager;
2121
use parking_lot::RwLock;
2222
use snafu::OptionExt;
23+
use tonic::codec::CompressionEncoding;
2324
use tonic::transport::Channel;
2425

2526
use crate::load_balance::{LoadBalance, Loadbalancer};
@@ -36,22 +37,74 @@ pub struct Client {
3637
inner: Arc<Inner>,
3738
}
3839

40+
#[derive(Default)]
41+
pub struct ClientBuilder {
42+
channel_manager: ChannelManager,
43+
load_balance: Loadbalancer,
44+
compression: Compression,
45+
peers: Vec<String>,
46+
}
47+
48+
impl ClientBuilder {
49+
pub fn channel_manager(mut self, channel_manager: ChannelManager) -> Self {
50+
self.channel_manager = channel_manager;
51+
self
52+
}
53+
54+
pub fn load_balance(mut self, load_balance: Loadbalancer) -> Self {
55+
self.load_balance = load_balance;
56+
self
57+
}
58+
59+
pub fn compression(mut self, compression: Compression) -> Self {
60+
self.compression = compression;
61+
self
62+
}
63+
64+
pub fn peers<U, A>(mut self, peers: A) -> Self
65+
where
66+
U: AsRef<str>,
67+
A: AsRef<[U]>,
68+
{
69+
self.peers = normailze_urls(peers);
70+
self
71+
}
72+
73+
pub fn build(self) -> Client {
74+
let inner = InnerBuilder::default()
75+
.channel_manager(self.channel_manager)
76+
.load_balance(self.load_balance)
77+
.compression(self.compression)
78+
.peers(self.peers)
79+
.build();
80+
Client {
81+
inner: Arc::new(inner),
82+
}
83+
}
84+
}
85+
86+
#[derive(Debug, Clone)]
87+
pub enum Compression {
88+
Gzip,
89+
Zstd,
90+
Plain,
91+
}
92+
93+
impl Default for Compression {
94+
fn default() -> Self {
95+
Self::Gzip
96+
}
97+
}
98+
3999
#[derive(Debug, Default)]
40100
struct Inner {
41101
channel_manager: ChannelManager,
42102
peers: Arc<RwLock<Vec<String>>>,
43103
load_balance: Loadbalancer,
104+
compression: Compression,
44105
}
45106

46107
impl Inner {
47-
fn with_manager(channel_manager: ChannelManager) -> Self {
48-
Self {
49-
channel_manager,
50-
peers: Default::default(),
51-
load_balance: Default::default(),
52-
}
53-
}
54-
55108
fn set_peers(&self, peers: Vec<String>) {
56109
let mut guard = self.peers.write();
57110
*guard = peers;
@@ -63,51 +116,93 @@ impl Inner {
63116
}
64117
}
65118

119+
#[derive(Default)]
120+
pub struct InnerBuilder {
121+
channel_manager: ChannelManager,
122+
load_balance: Loadbalancer,
123+
compression: Compression,
124+
peers: Arc<RwLock<Vec<String>>>,
125+
}
126+
127+
impl InnerBuilder {
128+
pub(self) fn channel_manager(mut self, channel_manager: ChannelManager) -> Self {
129+
self.channel_manager = channel_manager;
130+
self
131+
}
132+
133+
pub(self) fn load_balance(mut self, load_balance: Loadbalancer) -> Self {
134+
self.load_balance = load_balance;
135+
self
136+
}
137+
138+
pub(self) fn compression(mut self, compression: Compression) -> Self {
139+
self.compression = compression;
140+
self
141+
}
142+
143+
pub(self) fn peers(mut self, peers: Vec<String>) -> Self {
144+
self.peers = Arc::new(RwLock::new(peers));
145+
self
146+
}
147+
148+
pub(self) fn build(self) -> Inner {
149+
Inner {
150+
channel_manager: self.channel_manager,
151+
load_balance: self.load_balance,
152+
compression: self.compression,
153+
peers: self.peers,
154+
}
155+
}
156+
}
157+
66158
impl Client {
159+
#[deprecated(since = "0.1.0", note = "use `ClientBuilder` instead of this method")]
67160
pub fn new() -> Self {
68161
Default::default()
69162
}
70163

164+
#[deprecated(since = "0.1.0", note = "use `ClientBuilder` instead of this method")]
71165
pub fn with_manager(channel_manager: ChannelManager) -> Self {
72-
let inner = Arc::new(Inner::with_manager(channel_manager));
73-
Self { inner }
166+
let inner = InnerBuilder::default()
167+
.channel_manager(channel_manager)
168+
.build();
169+
Self {
170+
inner: Arc::new(inner),
171+
}
74172
}
75173

174+
#[deprecated(since = "0.1.0", note = "use `ClientBuilder` instead of this method")]
76175
pub fn with_urls<U, A>(urls: A) -> Self
77176
where
78177
U: AsRef<str>,
79178
A: AsRef<[U]>,
80179
{
81-
Self::with_manager_and_urls(ChannelManager::new(), urls)
180+
ClientBuilder::default().peers(urls).build()
82181
}
83182

183+
#[deprecated(since = "0.1.0", note = "use `ClientBuilder` instead of this method")]
84184
pub fn with_manager_and_urls<U, A>(channel_manager: ChannelManager, urls: A) -> Self
85185
where
86186
U: AsRef<str>,
87187
A: AsRef<[U]>,
88188
{
89-
let inner = Inner::with_manager(channel_manager);
90-
let urls: Vec<String> = urls
91-
.as_ref()
92-
.iter()
93-
.map(|peer| peer.as_ref().to_string())
94-
.collect();
95-
inner.set_peers(urls);
189+
let inner = InnerBuilder::default()
190+
.channel_manager(channel_manager)
191+
.peers(normailze_urls(urls))
192+
.build();
193+
96194
Self {
97195
inner: Arc::new(inner),
98196
}
99197
}
100198

199+
#[deprecated(since = "0.1.0", note = "should be removed in the future")]
101200
pub fn start<U, A>(&self, urls: A)
102201
where
103202
U: AsRef<str>,
104203
A: AsRef<[U]>,
105204
{
106-
let urls: Vec<String> = urls
107-
.as_ref()
108-
.iter()
109-
.map(|peer| peer.as_ref().to_string())
110-
.collect();
205+
let urls: Vec<String> = normailze_urls(urls);
111206

112207
self.inner.set_peers(urls);
113208
}
@@ -127,8 +222,19 @@ impl Client {
127222

128223
pub(crate) fn make_database_client(&self) -> Result<DatabaseClient> {
129224
let (_, channel) = self.find_channel()?;
130-
let client =
131-
GreptimeDatabaseClient::new(channel).max_decoding_message_size(MAX_MESSAGE_SIZE);
225+
let mut client = GreptimeDatabaseClient::new(channel)
226+
.max_decoding_message_size(MAX_MESSAGE_SIZE)
227+
.accept_compressed(CompressionEncoding::Gzip)
228+
.accept_compressed(CompressionEncoding::Zstd);
229+
match self.inner.compression {
230+
Compression::Gzip => {
231+
client = client.send_compressed(CompressionEncoding::Gzip);
232+
}
233+
Compression::Zstd => {
234+
client = client.send_compressed(CompressionEncoding::Zstd);
235+
}
236+
Compression::Plain => {}
237+
}
132238
Ok(DatabaseClient { inner: client })
133239
}
134240

@@ -140,6 +246,17 @@ impl Client {
140246
}
141247
}
142248

249+
fn normailze_urls<U, A>(urls: A) -> Vec<String>
250+
where
251+
U: AsRef<str>,
252+
A: AsRef<[U]>,
253+
{
254+
urls.as_ref()
255+
.iter()
256+
.map(|peer| peer.as_ref().to_string())
257+
.collect()
258+
}
259+
143260
#[cfg(test)]
144261
mod tests {
145262
use std::collections::HashSet;

src/database.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use crate::api::v1::{
2121
use crate::stream_insert::StreamInserter;
2222

2323
use snafu::OptionExt;
24-
use tonic::codec::CompressionEncoding;
2524

2625
use crate::error::IllegalDatabaseResponseSnafu;
2726
use crate::{Client, Result};
@@ -116,11 +115,9 @@ impl Database {
116115
}
117116

118117
async fn handle(&self, request: Request) -> Result<u32> {
119-
let client = self.client.make_database_client()?.inner;
118+
let mut client = self.client.make_database_client()?.inner;
120119
let request = self.to_rpc_request(request);
121120
let response = client
122-
.send_compressed(CompressionEncoding::Zstd)
123-
.accept_compressed(CompressionEncoding::Zstd)
124121
.handle(request)
125122
.await?
126123
.into_inner()

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub mod load_balance;
2222
mod stream_insert;
2323

2424
pub use self::channel_manager::{ChannelConfig, ChannelManager, ClientTlsOption};
25-
pub use self::client::Client;
25+
pub use self::client::{Client, ClientBuilder, Compression};
2626
pub use self::database::Database;
2727
pub use self::error::{Error, Result};
2828
pub use self::stream_insert::StreamInserter;

src/load_balance.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub trait LoadBalance {
2121
}
2222

2323
#[enum_dispatch(LoadBalance)]
24-
#[derive(Debug)]
24+
#[derive(Debug, Clone)]
2525
pub enum Loadbalancer {
2626
Random,
2727
}
@@ -32,7 +32,7 @@ impl Default for Loadbalancer {
3232
}
3333
}
3434

35-
#[derive(Debug)]
35+
#[derive(Debug, Copy, Clone)]
3636
pub struct Random;
3737

3838
impl LoadBalance for Random {

0 commit comments

Comments
 (0)