1use std::time::Instant;
16
17use common_meta::key::TableMetadataManagerRef;
18use common_meta::key::table_route::TableRouteValue;
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
54 let start = Instant::now();
55
56 self.table_metadata_manager
57 .create_table_metadata(
58 table_info,
59 TableRouteValue::physical(region_routes),
60 region_wal_options,
61 )
62 .await
63 .unwrap();
64
65 start.elapsed()
66 },
67 self.count,
68 )
69 .await;
70 }
71
72 pub async fn bench_get(&self) {
73 let desc = format!(
74 "TableMetadataBencher: getting {} table info and region routes",
75 self.count
76 );
77
78 bench_self_recorded(
79 &desc,
80 |i| async move {
81 let start = Instant::now();
82 self.table_metadata_manager
83 .get_full_table_info(i)
84 .await
85 .unwrap();
86
87 start.elapsed()
88 },
89 self.count,
90 )
91 .await;
92 }
93
94 pub async fn bench_delete(&self) {
95 let desc = format!(
96 "TableMetadataBencher: deleting {} table metadata",
97 self.count
98 );
99
100 bench_self_recorded(
101 &desc,
102 |i| async move {
103 let (table_info, table_route) = self
104 .table_metadata_manager
105 .get_full_table_info(i)
106 .await
107 .unwrap();
108 let start = Instant::now();
109 let table_info = table_info.unwrap();
110 let table_route = table_route.unwrap();
111 let table_id = table_info.table_info.ident.table_id;
112
113 let regions: Vec<_> = (0..64).collect();
114 let region_wal_options = create_region_wal_options(regions);
115 let _ = self
116 .table_metadata_manager
117 .delete_table_metadata(
118 table_id,
119 &table_info.table_name(),
120 &table_route,
121 ®ion_wal_options,
122 )
123 .await;
124 start.elapsed()
125 },
126 self.count,
127 )
128 .await;
129 }
130
131 pub async fn bench_rename(&self) {
132 let desc = format!("TableMetadataBencher: renaming {} table", self.count);
133
134 bench_self_recorded(
135 &desc,
136 |i| async move {
137 let (table_info, _) = self
138 .table_metadata_manager
139 .get_full_table_info(i)
140 .await
141 .unwrap();
142
143 let new_table_name = format!("renamed_{}", i);
144
145 let start = Instant::now();
146 let _ = self
147 .table_metadata_manager
148 .rename_table(&table_info.unwrap(), new_table_name)
149 .await;
150
151 start.elapsed()
152 },
153 self.count,
154 )
155 .await;
156 }
157}