Skip to content

Commit 5bb29dd

Browse files
committed
Initialize FileMetadata using OnceCell
1 parent 1f54293 commit 5bb29dd

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

crates/iceberg/src/puffin/reader.rs

Lines changed: 12 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,25 @@ 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 {
34+
let file_metadata = OnceCell::const_new();
35+
3236
Self {
3337
input_file,
34-
file_metadata: None,
38+
file_metadata,
3539
}
3640
}
3741

3842
/// 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-
}
43+
pub(crate) async fn file_metadata(&self) -> Result<&FileMetadata> {
44+
self.file_metadata
45+
.get_or_try_init(|| FileMetadata::read(&self.input_file))
46+
.await
4647
}
4748

4849
/// Returns blob
@@ -77,7 +78,7 @@ mod tests {
7778
#[tokio::test]
7879
async fn test_puffin_reader_uncompressed_metric_data() {
7980
let input_file = java_uncompressed_metric_input_file();
80-
let mut puffin_reader = PuffinReader::new(input_file);
81+
let puffin_reader = PuffinReader::new(input_file);
8182

8283
let file_metadata = puffin_reader.file_metadata().await.unwrap().clone();
8384
assert_eq!(file_metadata, uncompressed_metric_file_metadata());
@@ -102,7 +103,7 @@ mod tests {
102103
#[tokio::test]
103104
async fn test_puffin_reader_zstd_compressed_metric_data() {
104105
let input_file = java_zstd_compressed_metric_input_file();
105-
let mut puffin_reader = PuffinReader::new(input_file);
106+
let puffin_reader = PuffinReader::new(input_file);
106107

107108
let file_metadata = puffin_reader.file_metadata().await.unwrap().clone();
108109
assert_eq!(file_metadata, zstd_compressed_metric_file_metadata());

0 commit comments

Comments
 (0)