1use common_telemetry::{info, warn};
18use object_store::factory::new_raw_object_store;
19use object_store::util::{clean_temp_dir, join_dir, with_instrument_layers, with_retry_layers};
20use object_store::{ATOMIC_WRITE_DIR, ObjectStore};
21use snafu::prelude::*;
22
23use crate::config::ObjectStoreConfig;
24use crate::error::{self, Result};
25
26fn clean_old_read_cache(store: &ObjectStoreConfig, data_home: &str) {
28 if !store.is_object_storage() {
29 return;
30 }
31
32 let Some(cache_config) = store.cache_config() else {
33 return;
34 };
35
36 if !cache_config.enable_read_cache {
38 return;
39 }
40
41 let cache_base_dir = if cache_config.cache_path.is_empty() {
42 data_home
43 } else {
44 &cache_config.cache_path
45 };
46
47 let old_read_cache_dir = join_dir(cache_base_dir, "cache/object/read");
49 info!(
50 "Cleaning up old read cache directory: {}",
51 old_read_cache_dir
52 );
53 if let Err(e) = clean_temp_dir(&old_read_cache_dir) {
54 warn!(e; "Failed to clean old read cache directory {}", old_read_cache_dir);
55 }
56
57 let cache_atomic_temp_dir = join_dir(cache_base_dir, ATOMIC_WRITE_DIR);
59 info!(
60 "Cleaning up old cache atomic temp directory: {}",
61 cache_atomic_temp_dir
62 );
63 if let Err(e) = clean_temp_dir(&cache_atomic_temp_dir) {
64 warn!(e; "Failed to clean old cache atomic temp directory {}", cache_atomic_temp_dir);
65 }
66}
67
68pub async fn new_object_store(store: ObjectStoreConfig, data_home: &str) -> Result<ObjectStore> {
69 clean_old_read_cache(&store, data_home);
72
73 let object_store = new_raw_object_store(&store, data_home)
74 .await
75 .context(error::ObjectStoreSnafu)?;
76 let object_store = if store.is_object_storage() {
78 with_retry_layers(object_store)
80 } else {
81 object_store
82 };
83
84 let object_store = with_instrument_layers(object_store, true);
85 Ok(object_store)
86}