cli/bench/
metadata.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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                        &region_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}