Skip to content

Commit bcc421e

Browse files
committed
refactor: unit test
1 parent 8702308 commit bcc421e

6 files changed

Lines changed: 128 additions & 20 deletions

File tree

src/mito2/src/cache/file_cache.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ impl FileCache {
9090
}
9191
}
9292

93+
pub(crate) fn contains_key(&self, key: &IndexKey) -> bool {
94+
self.memory_index.contains_key(key)
95+
}
96+
9397
/// Puts a file into the cache index.
9498
///
9599
/// The `WriteCache` should ensure the file is in the correct path.

src/mito2/src/cache/test_util.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ use std::sync::Arc;
1919
use bytes::Bytes;
2020
use datatypes::arrow::array::{ArrayRef, Int64Array};
2121
use datatypes::arrow::record_batch::RecordBatch;
22+
use object_store::services::Fs;
23+
use object_store::ObjectStore;
2224
use parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder;
2325
use parquet::arrow::ArrowWriter;
2426
use parquet::file::metadata::ParquetMetaData;
@@ -42,3 +44,9 @@ fn parquet_file_data() -> Vec<u8> {
4244

4345
buffer
4446
}
47+
48+
pub(crate) fn new_fs_store(path: &str) -> ObjectStore {
49+
let mut builder = Fs::default();
50+
builder.root(path);
51+
ObjectStore::new(builder).unwrap().finish()
52+
}

src/mito2/src/cache/write_cache.rs

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ use crate::metrics::{UPLOAD_BYTES_TOTAL, WRITE_AND_UPLOAD_ELAPSED_TOTAL};
3030
use crate::read::Source;
3131
use crate::sst::file::FileId;
3232
use crate::sst::parquet::writer::ParquetWriter;
33-
use crate::sst::parquet::{SstInfo, WriteOptions, DEFAULT_WRITE_BUFFER_SIZE};
33+
use crate::sst::parquet::{SstInfo, WriteOptions};
34+
use crate::sst::DEFAULT_WRITE_BUFFER_SIZE;
3435

3536
/// A cache for uploading files to remote object stores.
3637
///
@@ -137,3 +138,94 @@ pub struct SstUploadRequest {
137138
/// Remote object store to upload.
138139
pub remote_store: ObjectStore,
139140
}
141+
142+
#[cfg(test)]
143+
mod tests {
144+
use api::v1::OpType;
145+
use common_base::readable_size::ReadableSize;
146+
use common_test_util::temp_dir::create_temp_dir;
147+
use object_store::manager::ObjectStoreManager;
148+
use object_store::services::Fs;
149+
use object_store::ObjectStore;
150+
use store_api::storage::RegionId;
151+
152+
use super::*;
153+
use crate::cache::file_cache::{self, FileCache};
154+
use crate::cache::test_util::new_fs_store;
155+
use crate::sst::file::FileId;
156+
use crate::sst::location::sst_file_path;
157+
use crate::test_util::sst_util::{
158+
new_batch_by_range, new_source, sst_file_handle, sst_region_metadata,
159+
};
160+
use crate::test_util::{build_rows, new_batch_builder, CreateRequestBuilder, TestEnv};
161+
162+
#[tokio::test]
163+
async fn test_write_and_upload_sst() {
164+
// Create a local object store and FileCache.
165+
let local_dir = create_temp_dir("");
166+
let local_store = new_fs_store(local_dir.path().to_str().unwrap());
167+
let cache = FileCache::new(local_store.clone(), ReadableSize::mb(10));
168+
let file_id = FileId::random();
169+
170+
// Create Source
171+
let metadata = Arc::new(sst_region_metadata());
172+
let region_id = metadata.region_id;
173+
let source = new_source(&[
174+
new_batch_by_range(&["a", "d"], 0, 60),
175+
new_batch_by_range(&["b", "f"], 0, 40),
176+
new_batch_by_range(&["b", "h"], 100, 200),
177+
]);
178+
179+
// TODO(QuenKar): maybe find a way to create some object server for testing,
180+
// and now just use local file system to mock.
181+
let mut env = TestEnv::new();
182+
let mock_store = env.init_object_store_manager();
183+
let upload_path = sst_file_path("test", file_id);
184+
185+
// Create WriteCache
186+
let object_store_manager = Arc::new(ObjectStoreManager::new("mock", mock_store.clone()));
187+
let write_cache = WriteCache::new(
188+
local_store.clone(),
189+
object_store_manager,
190+
ReadableSize::mb(10),
191+
);
192+
193+
let request = SstUploadRequest {
194+
file_id,
195+
metadata,
196+
source,
197+
storage: Some("mock".to_string()),
198+
upload_path: upload_path.clone(),
199+
remote_store: mock_store.clone(),
200+
};
201+
202+
let write_opts = WriteOptions {
203+
row_group_size: 512,
204+
..Default::default()
205+
};
206+
207+
// Write to cache and upload sst to mock remote store
208+
let sst_info = write_cache
209+
.write_and_upload_sst(request, &write_opts)
210+
.await
211+
.unwrap()
212+
.unwrap();
213+
214+
// Check write cache contains the key
215+
let key = (region_id, file_id);
216+
assert!(write_cache.file_cache.contains_key(&key));
217+
218+
// Check file data
219+
let remote_data = mock_store.read(&upload_path).await.unwrap();
220+
let cache_data = local_store.read(&cache.cache_file_path(key)).await.unwrap();
221+
assert_eq!(remote_data.len(), 3434);
222+
assert_eq!(remote_data, cache_data);
223+
224+
// Delete test files
225+
mock_store
226+
.delete(&upload_path)
227+
.await
228+
.expect("delete must succeed");
229+
write_cache.file_cache.remove(key);
230+
}
231+
}

src/mito2/src/sst.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@
1414

1515
//! Sorted strings tables.
1616
17+
use common_base::readable_size::ReadableSize;
18+
1719
pub mod file;
1820
pub mod file_purger;
1921
pub mod index;
2022
pub mod location;
2123
pub mod parquet;
2224
pub(crate) mod version;
25+
26+
/// Default write buffer size.
27+
pub const DEFAULT_WRITE_BUFFER_SIZE: ReadableSize = ReadableSize::mb(8);

src/mito2/src/sst/parquet.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ pub mod writer;
2525
use common_base::readable_size::ReadableSize;
2626
use parquet::file::metadata::ParquetMetaData;
2727

28+
use super::DEFAULT_WRITE_BUFFER_SIZE;
2829
use crate::sst::file::FileTimeRange;
2930

3031
/// Key of metadata in parquet SST.
3132
pub const PARQUET_METADATA_KEY: &str = "greptime:metadata";
32-
pub const DEFAULT_WRITE_BUFFER_SIZE: ReadableSize = ReadableSize::mb(8);
33+
3334
/// Default batch size to read parquet files.
3435
pub(crate) const DEFAULT_READ_BATCH_SIZE: usize = 1024;
3536
/// Default row group size for parquet files.
@@ -69,33 +70,19 @@ pub struct SstInfo {
6970
mod tests {
7071
use std::sync::Arc;
7172

72-
use api::v1::OpType;
7373
use common_time::Timestamp;
7474

7575
use super::*;
7676
use crate::cache::{CacheManager, PageKey};
77-
use crate::read::Batch;
7877
use crate::sst::parquet::reader::ParquetReaderBuilder;
7978
use crate::sst::parquet::writer::ParquetWriter;
8079
use crate::test_util::sst_util::{
81-
new_primary_key, new_source, sst_file_handle, sst_region_metadata,
80+
new_batch_by_range, new_source, sst_file_handle, sst_region_metadata,
8281
};
83-
use crate::test_util::{check_reader_result, new_batch_builder, TestEnv};
82+
use crate::test_util::{check_reader_result, TestEnv};
8483

8584
const FILE_DIR: &str = "/";
8685

87-
fn new_batch_by_range(tags: &[&str], start: usize, end: usize) -> Batch {
88-
assert!(end > start);
89-
let pk = new_primary_key(tags);
90-
let timestamps: Vec<_> = (start..end).map(|v| v as i64).collect();
91-
let sequences = vec![1000; end - start];
92-
let op_types = vec![OpType::Put; end - start];
93-
let field: Vec<_> = (start..end).map(|v| v as u64).collect();
94-
new_batch_builder(&pk, &timestamps, &sequences, &op_types, 2, &field)
95-
.build()
96-
.unwrap()
97-
}
98-
9986
#[tokio::test]
10087
async fn test_write_read() {
10188
let mut env = TestEnv::new();

src/mito2/src/test_util/sst_util.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
//! Utilities for testing SSTs.
1616
17-
use api::v1::SemanticType;
17+
use api::v1::{OpType, SemanticType};
1818
use common_time::Timestamp;
1919
use datatypes::prelude::ConcreteDataType;
2020
use datatypes::schema::ColumnSchema;
@@ -25,7 +25,7 @@ use store_api::storage::RegionId;
2525
use crate::read::{Batch, Source};
2626
use crate::row_converter::{McmpRowCodec, RowCodec, SortField};
2727
use crate::sst::file::{FileHandle, FileId, FileMeta};
28-
use crate::test_util::{new_noop_file_purger, VecBatchReader};
28+
use crate::test_util::{new_batch_builder, new_noop_file_purger, VecBatchReader};
2929

3030
/// Test region id.
3131
const REGION_ID: RegionId = RegionId::new(0, 0);
@@ -110,3 +110,15 @@ pub fn sst_file_handle(start_ms: i64, end_ms: i64) -> FileHandle {
110110
file_purger,
111111
)
112112
}
113+
114+
pub fn new_batch_by_range(tags: &[&str], start: usize, end: usize) -> Batch {
115+
assert!(end > start);
116+
let pk = new_primary_key(tags);
117+
let timestamps: Vec<_> = (start..end).map(|v| v as i64).collect();
118+
let sequences = vec![1000; end - start];
119+
let op_types = vec![OpType::Put; end - start];
120+
let field: Vec<_> = (start..end).map(|v| v as u64).collect();
121+
new_batch_builder(&pk, &timestamps, &sequences, &op_types, 2, &field)
122+
.build()
123+
.unwrap()
124+
}

0 commit comments

Comments
 (0)