Skip to main content

mito2/sst/index/indexer/
abort.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 common_telemetry::warn;
16
17use crate::access_layer::TempFileCleaner;
18use crate::sst::file::{RegionFileId, RegionIndexId};
19use crate::sst::index::Indexer;
20
21impl Indexer {
22    pub(crate) async fn do_abort(&mut self) {
23        self.dense_pk_decoder = None;
24        self.do_abort_inverted_index().await;
25        self.do_abort_fulltext_index().await;
26        self.do_abort_bloom_filter().await;
27        self.do_prune_intm_sst_dir().await;
28        if self.write_cache_enabled {
29            self.do_abort_clean_fs_temp_dir().await;
30        }
31        self.puffin_manager = None;
32    }
33
34    async fn do_abort_inverted_index(&mut self) {
35        let Some(mut indexer) = self.inverted_indexer.take() else {
36            return;
37        };
38        let Err(err) = indexer.abort().await else {
39            return;
40        };
41
42        if cfg!(any(test, feature = "test")) {
43            panic!(
44                "Failed to abort inverted index, region_id: {}, file_id: {}, err: {:?}",
45                self.region_id, self.file_id, err
46            );
47        } else {
48            warn!(
49                err; "Failed to abort inverted index, region_id: {}, file_id: {}",
50                self.region_id, self.file_id,
51            );
52        }
53    }
54
55    async fn do_abort_fulltext_index(&mut self) {
56        let Some(mut indexer) = self.fulltext_indexer.take() else {
57            return;
58        };
59        let Err(err) = indexer.abort().await else {
60            return;
61        };
62
63        if cfg!(any(test, feature = "test")) {
64            panic!(
65                "Failed to abort full-text index, region_id: {}, file_id: {}, err: {:?}",
66                self.region_id, self.file_id, err
67            );
68        } else {
69            warn!(
70                err; "Failed to abort full-text index, region_id: {}, file_id: {}",
71                self.region_id, self.file_id,
72            );
73        }
74    }
75
76    async fn do_abort_bloom_filter(&mut self) {
77        let Some(mut indexer) = self.bloom_filter_indexer.take() else {
78            return;
79        };
80        let Err(err) = indexer.abort().await else {
81            return;
82        };
83
84        if cfg!(any(test, feature = "test")) {
85            panic!(
86                "Failed to abort bloom filter, region_id: {}, file_id: {}, err: {:?}",
87                self.region_id, self.file_id, err
88            );
89        } else {
90            warn!(
91                err; "Failed to abort bloom filter, region_id: {}, file_id: {}",
92                self.region_id, self.file_id,
93            );
94        }
95    }
96
97    async fn do_abort_clean_fs_temp_dir(&mut self) {
98        let Some(puffin_manager) = &self.puffin_manager else {
99            return;
100        };
101        let fs_accessor = puffin_manager.file_accessor();
102
103        let fs_handle = RegionIndexId::new(
104            RegionFileId::new(self.physical_region_id, self.file_id),
105            self.index_version,
106        )
107        .to_string();
108        TempFileCleaner::clean_atomic_dir_files(fs_accessor.store().store(), &[&fs_handle]).await;
109    }
110}