Skip to main content

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::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                        &region_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}