mito2/manifest/storage/
utils.rs1use object_store::{Entry, ObjectStore};
16use snafu::ResultExt;
17use store_api::ManifestVersion;
18
19use crate::cache::manifest_cache::ManifestCache;
20use crate::error::{OpenDalSnafu, Result};
21
22const CHUNK_SIZE: usize = 64 * 1024 * 1024; pub(crate) async fn get_from_cache(cache: Option<&ManifestCache>, key: &str) -> Option<Vec<u8>> {
27 let cache = cache?;
28 cache.get_file(key).await
29}
30
31pub(crate) async fn put_to_cache(cache: Option<&ManifestCache>, key: String, data: &[u8]) {
33 let Some(cache) = cache else {
34 return;
35 };
36 cache.put_file(key, data.to_vec()).await
37}
38
39pub(crate) async fn remove_from_cache(cache: Option<&ManifestCache>, key: &str) {
41 let Some(cache) = cache else {
42 return;
43 };
44 cache.remove(key).await
45}
46
47pub(crate) async fn write_and_put_cache(
49 object_store: &ObjectStore,
50 cache: Option<&ManifestCache>,
51 path: &str,
52 data: Vec<u8>,
53) -> Result<()> {
54 let cache_data = if cache.is_some() {
56 Some(data.clone())
57 } else {
58 None
59 };
60
61 object_store
63 .write_with(path, data)
64 .chunk(CHUNK_SIZE) .await
66 .context(OpenDalSnafu)?;
67
68 if let Some(data) = cache_data {
70 put_to_cache(cache, path.to_string(), &data).await;
71 }
72
73 Ok(())
74}
75
76pub(crate) fn sort_manifests(entries: &mut [(ManifestVersion, Entry)]) {
78 entries.sort_unstable_by_key(|(version, _)| *version);
79}