Skip to content

Commit 70c7768

Browse files
authored
refactor: auto split large mget_database_names_by_ids into chunks with KVPbApi::get_pb_values_vec() (#17011)
* refactor: auto split large mget_database_names_by_ids into chunks with `KVPbApi::get_pb_values_vec()` And fix the issue that when db-meta is not found, the returned db-name should be set to None too.
1 parent 0b3a480 commit 70c7768

File tree

1 file changed

+23
-51
lines changed

1 file changed

+23
-51
lines changed

src/meta/api/src/schema_api_impl.rs

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,38 +1648,23 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
16481648
) -> Result<Vec<Option<String>>, KVAppError> {
16491649
debug!(req :? =(&table_ids); "SchemaApi: {}", func_name!());
16501650

1651-
let mut id_name_kv_keys = Vec::with_capacity(table_ids.len());
1652-
for id in table_ids {
1653-
let k = TableIdToName { table_id: *id }.to_string_key();
1654-
id_name_kv_keys.push(k);
1655-
}
1656-
1657-
// Batch get all table-name by id
1658-
let seq_names = self.mget_kv(&id_name_kv_keys).await?;
1659-
let mut table_names = Vec::with_capacity(table_ids.len());
1660-
1661-
for seq_name in seq_names {
1662-
if let Some(seq_name) = seq_name {
1663-
let name_ident: DBIdTableName = deserialize_struct(&seq_name.data)?;
1664-
table_names.push(Some(name_ident.table_name));
1665-
} else {
1666-
table_names.push(None);
1667-
}
1668-
}
1651+
let id_to_name_idents = table_ids.iter().map(|id| TableIdToName { table_id: *id });
16691652

1670-
let mut meta_kv_keys = Vec::with_capacity(table_ids.len());
1671-
for id in table_ids {
1672-
let k = TableId { table_id: *id }.to_string_key();
1673-
meta_kv_keys.push(k);
1674-
}
1653+
let seq_names = self.get_pb_values_vec(id_to_name_idents).await?;
1654+
let mut table_names = seq_names
1655+
.into_iter()
1656+
.map(|seq_name| seq_name.map(|s| s.data.table_name))
1657+
.collect::<Vec<_>>();
16751658

1676-
let seq_metas = self.mget_kv(&meta_kv_keys).await?;
1659+
let id_idents = table_ids.iter().map(|id| TableId { table_id: *id });
1660+
let seq_metas = self.get_pb_values_vec(id_idents).await?;
16771661
for (i, seq_meta_opt) in seq_metas.iter().enumerate() {
16781662
if let Some(seq_meta) = seq_meta_opt {
1679-
let table_meta: TableMeta = deserialize_struct(&seq_meta.data)?;
1680-
if table_meta.drop_on.is_some() {
1663+
if seq_meta.data.drop_on.is_some() {
16811664
table_names[i] = None;
16821665
}
1666+
} else {
1667+
table_names[i] = None;
16831668
}
16841669
}
16851670

@@ -1714,39 +1699,26 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SchemaApi for KV {
17141699
) -> Result<Vec<Option<String>>, KVAppError> {
17151700
debug!(req :? =(&db_ids); "SchemaApi: {}", func_name!());
17161701

1717-
let mut kv_keys = Vec::with_capacity(db_ids.len());
1718-
for id in db_ids {
1719-
let k = DatabaseIdToName { db_id: *id }.to_string_key();
1720-
kv_keys.push(k);
1721-
}
1702+
let id_to_name_keys = db_ids.iter().map(|id| DatabaseIdToName { db_id: *id });
17221703

1723-
// Batch get all table-name by id
1724-
let seq_names = self.mget_kv(&kv_keys).await?;
1725-
// If multi drop/create db the capacity may not same
1726-
let mut db_names = Vec::with_capacity(db_ids.len());
1704+
let seq_names = self.get_pb_values_vec(id_to_name_keys).await?;
17271705

1728-
for seq_name in seq_names {
1729-
if let Some(seq_name) = seq_name {
1730-
let name_ident: DatabaseNameIdentRaw = deserialize_struct(&seq_name.data)?;
1731-
db_names.push(Some(name_ident.database_name().to_string()));
1732-
} else {
1733-
db_names.push(None);
1734-
}
1735-
}
1706+
let mut db_names = seq_names
1707+
.into_iter()
1708+
.map(|seq_name| seq_name.map(|s| s.data.database_name().to_string()))
1709+
.collect::<Vec<_>>();
17361710

1737-
let mut meta_kv_keys = Vec::with_capacity(db_ids.len());
1738-
for id in db_ids {
1739-
let k = DatabaseId { db_id: *id }.to_string_key();
1740-
meta_kv_keys.push(k);
1741-
}
1711+
let id_keys = db_ids.iter().map(|id| DatabaseId { db_id: *id });
1712+
1713+
let seq_metas = self.get_pb_values_vec(id_keys).await?;
17421714

1743-
let seq_metas = self.mget_kv(&meta_kv_keys).await?;
17441715
for (i, seq_meta_opt) in seq_metas.iter().enumerate() {
17451716
if let Some(seq_meta) = seq_meta_opt {
1746-
let db_meta: DatabaseMeta = deserialize_struct(&seq_meta.data)?;
1747-
if db_meta.drop_on.is_some() {
1717+
if seq_meta.data.drop_on.is_some() {
17481718
db_names[i] = None;
17491719
}
1720+
} else {
1721+
db_names[i] = None;
17501722
}
17511723
}
17521724
Ok(db_names)

0 commit comments

Comments
 (0)