Skip to content

Commit e112d92

Browse files
committed
Initialize FileMetadata using OnceCell
1 parent 1f54293 commit e112d92

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

crates/iceberg/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ serde_derive = { workspace = true }
7878
serde_json = { workspace = true }
7979
serde_repr = { workspace = true }
8080
serde_with = { workspace = true }
81-
tokio = { workspace = true, optional = true }
81+
tokio = { workspace = true, optional = true, features = ["sync"] }
8282
typed-builder = { workspace = true }
8383
url = { workspace = true }
8484
uuid = { workspace = true }

crates/iceberg/src/puffin/reader.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use tokio::sync::OnceCell;
19+
1820
use crate::io::{FileRead, InputFile};
1921
use crate::puffin::blob::Blob;
2022
use crate::puffin::metadata::{BlobMetadata, FileMetadata};
@@ -23,26 +25,23 @@ use crate::Result;
2325
/// Puffin reader
2426
pub(crate) struct PuffinReader {
2527
input_file: InputFile,
26-
file_metadata: Option<FileMetadata>,
28+
file_metadata: OnceCell<FileMetadata>,
2729
}
2830

2931
impl PuffinReader {
3032
/// Returns a new Puffin reader
3133
pub(crate) fn new(input_file: InputFile) -> Self {
3234
Self {
3335
input_file,
34-
file_metadata: None,
36+
file_metadata: OnceCell::new(),
3537
}
3638
}
3739

3840
/// Returns file metadata
39-
pub(crate) async fn file_metadata(&mut self) -> Result<&FileMetadata> {
40-
if let Some(ref file_metadata) = self.file_metadata {
41-
Ok(file_metadata)
42-
} else {
43-
let file_metadata = FileMetadata::read(&self.input_file).await?;
44-
Ok(self.file_metadata.insert(file_metadata))
45-
}
41+
pub(crate) async fn file_metadata(&self) -> Result<&FileMetadata> {
42+
self.file_metadata
43+
.get_or_try_init(|| FileMetadata::read(&self.input_file))
44+
.await
4645
}
4746

4847
/// Returns blob
@@ -77,7 +76,7 @@ mod tests {
7776
#[tokio::test]
7877
async fn test_puffin_reader_uncompressed_metric_data() {
7978
let input_file = java_uncompressed_metric_input_file();
80-
let mut puffin_reader = PuffinReader::new(input_file);
79+
let puffin_reader = PuffinReader::new(input_file);
8180

8281
let file_metadata = puffin_reader.file_metadata().await.unwrap().clone();
8382
assert_eq!(file_metadata, uncompressed_metric_file_metadata());
@@ -102,7 +101,7 @@ mod tests {
102101
#[tokio::test]
103102
async fn test_puffin_reader_zstd_compressed_metric_data() {
104103
let input_file = java_zstd_compressed_metric_input_file();
105-
let mut puffin_reader = PuffinReader::new(input_file);
104+
let puffin_reader = PuffinReader::new(input_file);
106105

107106
let file_metadata = puffin_reader.file_metadata().await.unwrap().clone();
108107
assert_eq!(file_metadata, zstd_compressed_metric_file_metadata());

0 commit comments

Comments
 (0)