1use std::time::Instant;
16
17use common_meta::key::table_route::TableRouteValue;
18use common_meta::key::TableMetadataManagerRef;
19use table::table_name::TableName;
20
21use crate::bench::{
22 bench_self_recorded, create_region_routes, create_region_wal_options, create_table_info,
23};
24
25pub struct TableMetadataBencher {
26 table_metadata_manager: TableMetadataManagerRef,
27 count: u32,
28}
29
30impl TableMetadataBencher {
31 pub fn new(table_metadata_manager: TableMetadataManagerRef, count: u32) -> Self {
32 Self {
33 table_metadata_manager,
34 count,
35 }
36 }
37
38 pub async fn bench_create(&self) {
39 let desc = format!(
40 "TableMetadataBencher: creating {} table metadata",
41 self.count
42 );
43 bench_self_recorded(
44 &desc,
45 |i| async move {
46 let table_name = format!("bench_table_name_{}", i);
47 let table_name = TableName::new("bench_catalog", "bench_schema", table_name);
48 let table_info = create_table_info(i, table_name);
49
50 let regions: Vec<_> = (0..64).collect();
51 let region_routes = create_region_routes(regions.clone());
52 let region_wal_options = create_region_wal_options(regions)
53 .into_iter()
54 .map(|(region_id, wal_options)| {
55 (region_id, serde_json::to_string(&wal_options).unwrap())
56 })
57 .collect();
58
59 let start = Instant::now();
60
61 self.table_metadata_manager
62 .create_table_metadata(
63 table_info,
64 TableRouteValue::physical(region_routes),
65 region_wal_options,
66 )
67 .await
68 .unwrap();
69
70 start.elapsed()
71 },
72 self.count,
73 )
74 .await;
75 }
76
77 pub async fn bench_get(&self) {
78 let desc = format!(
79 "TableMetadataBencher: getting {} table info and region routes",
80 self.count
81 );
82
83 bench_self_recorded(
84 &desc,
85 |i| async move {
86 let start = Instant::now();
87 self.table_metadata_manager
88 .get_full_table_info(i)
89 .await
90 .unwrap();
91
92 start.elapsed()
93 },
94 self.count,
95 )
96 .await;
97 }
98
99 pub async fn bench_delete(&self) {
100 let desc = format!(
101 "TableMetadataBencher: deleting {} table metadata",
102 self.count
103 );
104
105 bench_self_recorded(
106 &desc,
107 |i| async move {
108 let (table_info, table_route) = self
109 .table_metadata_manager
110 .get_full_table_info(i)
111 .await
112 .unwrap();
113 let start = Instant::now();
114 let table_info = table_info.unwrap();
115 let table_route = table_route.unwrap();
116 let table_id = table_info.table_info.ident.table_id;
117
118 let regions: Vec<_> = (0..64).collect();
119 let region_wal_options = create_region_wal_options(regions);
120 let _ = self
121 .table_metadata_manager
122 .delete_table_metadata(
123 table_id,
124 &table_info.table_name(),
125 &table_route,
126 ®ion_wal_options,
127 )
128 .await;
129 start.elapsed()
130 },
131 self.count,
132 )
133 .await;
134 }
135
136 pub async fn bench_rename(&self) {
137 let desc = format!("TableMetadataBencher: renaming {} table", self.count);
138
139 bench_self_recorded(
140 &desc,
141 |i| async move {
142 let (table_info, _) = self
143 .table_metadata_manager
144 .get_full_table_info(i)
145 .await
146 .unwrap();
147
148 let new_table_name = format!("renamed_{}", i);
149
150 let start = Instant::now();
151 let _ = self
152 .table_metadata_manager
153 .rename_table(&table_info.unwrap(), new_table_name)
154 .await;
155
156 start.elapsed()
157 },
158 self.count,
159 )
160 .await;
161 }
162}