Skip to content

Commit c221094

Browse files
committed
refactor: Define DatabaseIdIdent with TIdent
1 parent 30a155e commit c221094

File tree

13 files changed

+269
-162
lines changed

13 files changed

+269
-162
lines changed

src/meta/api/src/kv_pb_api/mod.rs

+17
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,23 @@ use crate::kv_pb_api::errors::PbApiWriteError;
4646

4747
/// This trait provides a way to access a kv store with `kvapi::Key` type key and protobuf encoded value.
4848
pub trait KVPbApi: KVApi {
49+
/// Update a protobuf encoded value by kvapi::Key.
50+
///
51+
/// Equivalent to `update_pb(UpsertPB::update(key,value))`
52+
/// but returns the transition before and after executing the operation.
53+
fn update_pb<K>(
54+
&self,
55+
key: K,
56+
value: K::ValueType,
57+
) -> impl Future<Output = Result<Change<K::ValueType>, Self::Error>> + Send
58+
where
59+
K: kvapi::Key + Send + 'static,
60+
K::ValueType: FromToProto + Send,
61+
Self::Error: From<PbApiWriteError<Self::Error>>,
62+
{
63+
async move { self.upsert_pb(&UpsertPB::update(key, value)).await }
64+
}
65+
4966
/// Update or insert a protobuf encoded value by kvapi::Key.
5067
///
5168
/// The key will be converted to string and the value is encoded by `FromToProto`.

src/meta/api/src/schema_api.rs

+3
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ use databend_common_meta_app::schema::UpdateVirtualColumnReq;
9595
use databend_common_meta_app::schema::UpsertTableOptionReply;
9696
use databend_common_meta_app::schema::UpsertTableOptionReq;
9797
use databend_common_meta_app::schema::VirtualColumnMeta;
98+
use databend_common_meta_app::tenant::Tenant;
9899
use databend_common_meta_types::MetaError;
99100
use databend_common_meta_types::MetaId;
100101
use databend_common_meta_types::SeqV;
@@ -212,11 +213,13 @@ pub trait SchemaApi: Send + Sync {
212213

213214
async fn mget_table_names_by_ids(
214215
&self,
216+
tenant: &Tenant,
215217
table_ids: &[MetaId],
216218
) -> Result<Vec<Option<String>>, KVAppError>;
217219

218220
async fn mget_database_names_by_ids(
219221
&self,
222+
tenant: &Tenant,
220223
db_ids: &[MetaId],
221224
) -> Result<Vec<Option<String>>, KVAppError>;
222225

src/meta/api/src/schema_api_impl.rs

+83-49
Large diffs are not rendered by default.

src/meta/api/src/schema_api_test_suite.rs

+29-39
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ use databend_common_meta_app::schema::CreateTableIndexReq;
5050
use databend_common_meta_app::schema::CreateTableReq;
5151
use databend_common_meta_app::schema::CreateVirtualColumnReq;
5252
use databend_common_meta_app::schema::DBIdTableName;
53-
use databend_common_meta_app::schema::DatabaseId;
5453
use databend_common_meta_app::schema::DatabaseIdHistoryIdent;
54+
use databend_common_meta_app::schema::DatabaseIdIdent;
5555
use databend_common_meta_app::schema::DatabaseIdToName;
5656
use databend_common_meta_app::schema::DatabaseInfo;
5757
use databend_common_meta_app::schema::DatabaseMeta;
@@ -130,13 +130,14 @@ use databend_common_meta_types::MatchSeq;
130130
use databend_common_meta_types::MetaError;
131131
use databend_common_meta_types::Operation;
132132
use databend_common_meta_types::UpsertKV;
133+
use databend_common_proto_conv::FromToProto;
133134
use log::debug;
134135
use log::info;
135136
use minitrace::func_name;
136137

137138
use crate::deserialize_struct;
138139
use crate::kv_app_error::KVAppError;
139-
use crate::serialize_struct;
140+
use crate::kv_pb_api::KVPbApi;
140141
use crate::testing::get_kv_data;
141142
use crate::testing::get_kv_u64_data;
142143
use crate::DatamaskApi;
@@ -232,20 +233,16 @@ fn calc_and_compare_drop_on_table_result(result: Vec<Arc<TableInfo>>, expected:
232233
assert_eq!(get, expected_map);
233234
}
234235

235-
async fn upsert_test_data(
236+
async fn upsert_test_data<K: kvapi::Key + Send>(
236237
kv_api: &(impl kvapi::KVApi<Error = MetaError> + ?Sized),
237-
key: &impl kvapi::Key,
238-
value: Vec<u8>,
239-
) -> Result<u64, KVAppError> {
240-
let res = kv_api
241-
.upsert_kv(UpsertKVReq {
242-
key: key.to_string_key(),
243-
seq: MatchSeq::GE(0),
244-
value: Operation::Update(value),
245-
value_meta: None,
246-
})
247-
.await?;
248-
238+
key: K,
239+
value: K::ValueType,
240+
) -> Result<u64, KVAppError>
241+
where
242+
K: kvapi::Key + Send + 'static,
243+
K::ValueType: FromToProto + Send,
244+
{
245+
let res = kv_api.update_pb(key, value).await?;
249246
let seq_v = res.result.unwrap();
250247
Ok(seq_v.seq)
251248
}
@@ -1918,7 +1915,7 @@ impl SchemaApiTestSuite {
19181915
{
19191916
let undrop_table_req = UndropTableByIdReq {
19201917
name_ident: create_table_req.name_ident.clone(),
1921-
db_id: create_table_as_dropped_resp.db_id,
1918+
db_id_ident: create_table_as_dropped_resp.database_id_ident.clone(),
19221919
table_id: create_table_as_dropped_resp.table_id,
19231920
table_id_seq: create_table_as_dropped_resp.table_id_seq.unwrap(),
19241921
force_replace: true,
@@ -1937,7 +1934,7 @@ impl SchemaApiTestSuite {
19371934
// undrop-table-by-id with force_replace set to false should fail.
19381935
let undrop_table_req = UndropTableByIdReq {
19391936
name_ident: create_table_req.name_ident.clone(),
1940-
db_id: create_table_as_dropped_resp.db_id,
1937+
db_id_ident: create_table_as_dropped_resp.database_id_ident.clone(),
19411938
table_id: create_table_as_dropped_resp.table_id,
19421939
table_id_seq: create_table_as_dropped_resp.table_id_seq.unwrap(),
19431940
force_replace: false,
@@ -3263,9 +3260,9 @@ impl SchemaApiTestSuite {
32633260
drop_on,
32643261
..Default::default()
32653262
};
3266-
let id_key = DatabaseId { db_id };
3267-
let data = serialize_struct(&drop_data)?;
3268-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
3263+
3264+
let db_id_ident = DatabaseIdIdent::new(&tenant, db_id);
3265+
upsert_test_data(mt.as_kv_api(), db_id_ident, drop_data).await?;
32693266

32703267
let res = mt
32713268
.get_database_history(ListDatabaseReq {
@@ -3309,9 +3306,8 @@ impl SchemaApiTestSuite {
33093306
drop_on,
33103307
..Default::default()
33113308
};
3312-
let id_key = DatabaseId { db_id };
3313-
let data = serialize_struct(&drop_data)?;
3314-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
3309+
let id_key = DatabaseIdIdent::new(db_name.tenant(), db_id);
3310+
upsert_test_data(mt.as_kv_api(), id_key, drop_data).await?;
33153311

33163312
if delete {
33173313
delete_test_data(mt.as_kv_api(), &db_name).await?;
@@ -3387,7 +3383,7 @@ impl SchemaApiTestSuite {
33873383

33883384
// assert old db meta and id to name mapping has been removed
33893385
for db_id in old_id_list.iter() {
3390-
let id_key = DatabaseId { db_id: *db_id };
3386+
let id_key = DatabaseIdIdent::new(&tenant, *db_id);
33913387
let id_mapping = DatabaseIdToName { db_id: *db_id };
33923388

33933389
let meta_res: Result<DatabaseMeta, KVAppError> =
@@ -3452,8 +3448,7 @@ impl SchemaApiTestSuite {
34523448
};
34533449

34543450
let id_key = TableId { table_id };
3455-
let data = serialize_struct(&drop_data)?;
3456-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
3451+
upsert_test_data(mt.as_kv_api(), id_key, drop_data.clone()).await?;
34573452

34583453
if delete {
34593454
delete_test_data(mt.as_kv_api(), &dbid_tbname).await?;
@@ -3731,9 +3726,8 @@ impl SchemaApiTestSuite {
37313726
drop_on,
37323727
..Default::default()
37333728
};
3734-
let id_key = DatabaseId { db_id };
3735-
let data = serialize_struct(&drop_data)?;
3736-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
3729+
let id_key = DatabaseIdIdent::new(&tenant, db_id);
3730+
upsert_test_data(mt.as_kv_api(), id_key, drop_data).await?;
37373731

37383732
let dbid_idlist1 = DatabaseIdHistoryIdent::new(&tenant, db1_name);
37393733
let old_id_list: DbIdList = get_kv_data(mt.as_kv_api(), &dbid_idlist1).await?;
@@ -3772,7 +3766,7 @@ impl SchemaApiTestSuite {
37723766

37733767
// assert old db meta and id to name mapping has been removed
37743768
for db_id in old_id_list.id_list.iter() {
3775-
let id_key = DatabaseId { db_id: *db_id };
3769+
let id_key = DatabaseIdIdent::new(&tenant, *db_id);
37763770
let id_mapping = DatabaseIdToName { db_id: *db_id };
37773771

37783772
let meta_res: Result<DatabaseMeta, KVAppError> =
@@ -3914,9 +3908,8 @@ impl SchemaApiTestSuite {
39143908
drop_on: Some(created_on - Duration::days(1)),
39153909
..TableMeta::default()
39163910
};
3917-
let data = serialize_struct(&create_drop_table_meta)?;
39183911

3919-
upsert_test_data(mt.as_kv_api(), &tbid, data).await?;
3912+
upsert_test_data(mt.as_kv_api(), tbid, create_drop_table_meta).await?;
39203913
// assert not return out of retention time data
39213914
let res = mt
39223915
.get_table_history(ListTableReq::new(&tenant, db_name))
@@ -4070,8 +4063,7 @@ impl SchemaApiTestSuite {
40704063
let table_id = resp.table_id;
40714064
let id_key = TableId { table_id };
40724065
table_meta.drop_on = Some(created_on + Duration::seconds(100));
4073-
let data = serialize_struct(&table_meta)?;
4074-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
4066+
upsert_test_data(mt.as_kv_api(), id_key, table_meta).await?;
40754067
}
40764068

40774069
info!("--- create db2.tb3");
@@ -4098,9 +4090,8 @@ impl SchemaApiTestSuite {
40984090
// change db meta to make this db drop time outof filter time
40994091
let mut drop_db_meta = create_db_req.meta.clone();
41004092
drop_db_meta.drop_on = Some(created_on + Duration::seconds(100));
4101-
let id_key = DatabaseId { db_id };
4102-
let data = serialize_struct(&drop_db_meta)?;
4103-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
4093+
let id_key = DatabaseIdIdent::new(&tenant, db_id);
4094+
upsert_test_data(mt.as_kv_api(), id_key, drop_db_meta).await?;
41044095
}
41054096

41064097
// third create a database not dropped, but has a table drop within filter time
@@ -4170,8 +4161,7 @@ impl SchemaApiTestSuite {
41704161
let table_id = resp.table_id;
41714162
let id_key = TableId { table_id };
41724163
table_meta.drop_on = Some(created_on + Duration::seconds(100));
4173-
let data = serialize_struct(&table_meta)?;
4174-
upsert_test_data(mt.as_kv_api(), &id_key, data).await?;
4164+
upsert_test_data(mt.as_kv_api(), id_key, table_meta).await?;
41754165
}
41764166

41774167
info!("--- create db3.tb3");

src/meta/app/src/schema/database.rs

+4-54
Original file line numberDiff line numberDiff line change
@@ -42,29 +42,6 @@ pub struct DatabaseIdent {
4242
pub seq: u64,
4343
}
4444

45-
#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Ord)]
46-
pub struct DatabaseId {
47-
pub db_id: u64,
48-
}
49-
50-
impl DatabaseId {
51-
pub fn new(db_id: u64) -> Self {
52-
DatabaseId { db_id }
53-
}
54-
}
55-
56-
impl From<u64> for DatabaseId {
57-
fn from(db_id: u64) -> Self {
58-
DatabaseId { db_id }
59-
}
60-
}
61-
62-
impl Display for DatabaseId {
63-
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
64-
write!(f, "{}", self.db_id)
65-
}
66-
}
67-
6845
#[derive(Clone, Debug, Default, Eq, PartialEq)]
6946
pub struct DatabaseIdToName {
7047
pub db_id: u64,
@@ -327,31 +304,9 @@ mod kvapi_key_impl {
327304
use databend_common_meta_kvapi::kvapi;
328305

329306
use crate::schema::database_name_ident::DatabaseNameIdentRaw;
330-
use crate::schema::DatabaseId;
307+
use crate::schema::DatabaseIdIdent;
331308
use crate::schema::DatabaseIdToName;
332-
use crate::schema::DatabaseMeta;
333-
334-
impl kvapi::KeyCodec for DatabaseId {
335-
fn encode_key(&self, b: kvapi::KeyBuilder) -> kvapi::KeyBuilder {
336-
b.push_u64(self.db_id)
337-
}
338-
339-
fn decode_key(parser: &mut kvapi::KeyParser) -> Result<Self, kvapi::KeyError> {
340-
let db_id = parser.next_u64()?;
341-
Ok(Self { db_id })
342-
}
343-
}
344-
345-
/// "__fd_database_by_id/<db_id>"
346-
impl kvapi::Key for DatabaseId {
347-
const PREFIX: &'static str = "__fd_database_by_id";
348-
349-
type ValueType = DatabaseMeta;
350-
351-
fn parent(&self) -> Option<String> {
352-
None
353-
}
354-
}
309+
use crate::tenant::Tenant;
355310

356311
impl kvapi::KeyCodec for DatabaseIdToName {
357312
fn encode_key(&self, b: kvapi::KeyBuilder) -> kvapi::KeyBuilder {
@@ -371,13 +326,8 @@ mod kvapi_key_impl {
371326
type ValueType = DatabaseNameIdentRaw;
372327

373328
fn parent(&self) -> Option<String> {
374-
Some(DatabaseId::new(self.db_id).to_string_key())
375-
}
376-
}
377-
378-
impl kvapi::Value for DatabaseMeta {
379-
fn dependency_keys(&self) -> impl IntoIterator<Item = String> {
380-
[]
329+
// TODO(TIdent): add real tenant
330+
Some(DatabaseIdIdent::new(Tenant::new_literal("dummy"), self.db_id).to_string_key())
381331
}
382332
}
383333

src/meta/app/src/schema/database_id_history_ident.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ mod kvapi_impl {
3939
use databend_common_meta_kvapi::kvapi;
4040
use databend_common_meta_kvapi::kvapi::Key;
4141

42-
use crate::schema::DatabaseId;
42+
use crate::schema::DatabaseIdIdent;
4343
use crate::schema::DbIdList;
44+
use crate::tenant::Tenant;
4445
use crate::tenant_key::resource::TenantResource;
4546

4647
pub struct Resource;
@@ -53,9 +54,10 @@ mod kvapi_impl {
5354

5455
impl kvapi::Value for DbIdList {
5556
fn dependency_keys(&self) -> impl IntoIterator<Item = String> {
57+
// TODO(TIdent): add real tenant:
5658
self.id_list
5759
.iter()
58-
.map(|id| DatabaseId::new(*id).to_string_key())
60+
.map(|id| DatabaseIdIdent::new(Tenant::new_literal("dummy"), *id).to_string_key())
5961
}
6062
}
6163

0 commit comments

Comments
 (0)