perf(get): trim direct-read metadata allocations (#5976)

Co-authored-by: heihutu <heihutu@gmail.com>
This commit is contained in:
houseme
2026-08-12 15:27:58 +08:00
committed by GitHub
parent 537d34b8cd
commit 1b6ae33ce0
2 changed files with 68 additions and 3 deletions
+65
View File
@@ -9052,6 +9052,71 @@ mod tests {
assert_eq!(body.as_ref(), payload); assert_eq!(body.as_ref(), payload);
} }
#[tokio::test]
async fn direct_memory_versioned_bucket_uses_inline_data_shards_for_latest() {
let tempdir = tempfile::tempdir().expect("tempdir should be created");
let endpoint =
Endpoint::try_from(tempdir.path().to_str().expect("tempdir path should be utf8")).expect("endpoint should parse");
let disk = new_disk(
&endpoint,
&DiskOption {
cleanup: false,
health_check: false,
},
)
.await
.expect("disk should be created");
let payload = vec![b'v'; 64 * 1024];
let payload_size = i64::try_from(payload.len()).expect("test payload size should fit i64");
let (erasure, files, _read_length, _checksum_algo) = inline_bitrot_files_for_payload(&payload).await;
let mut fi = FileInfo::new("bucket/object", erasure.data_shards, erasure.parity_shards);
fi.size = payload_size;
fi.data = files[0].data.clone();
fi.add_object_part(1, String::new(), payload.len(), None, payload_size, None, None);
let mut object_info = ObjectInfo {
size: payload_size,
actual_size: payload_size,
parts: Arc::new(vec![ObjectPartInfo {
number: 1,
size: payload.len(),
actual_size: payload_size,
..Default::default()
}]),
..Default::default()
};
object_info.inlined = true;
let opts = ObjectOptions {
versioned: true,
..Default::default()
};
let metrics_size_bucket = rustfs_io_metrics::get_object_size_bucket(fi.size);
assert_eq!(
get_small_object_direct_memory_decision_with_threshold(&None, &object_info, &fi, &opts, true, 128 * 1024),
GetDirectMemoryDecision::Use {
object_size: payload.len()
}
);
let body = SetDisks::try_get_object_direct_data_shards_with_fileinfo(
"bucket",
"object",
&fi,
&files,
&vec![Some(disk); erasure.total_shard_count()],
true,
GET_CODEC_STREAMING_OBJECT_CLASS_PLAIN_SINGLE_PART,
metrics_size_bucket,
)
.await
.expect("versioned latest direct-memory read should not fail")
.expect("versioned latest should use inline data shards");
assert_eq!(body.as_ref(), payload);
}
#[tokio::test] #[tokio::test]
async fn direct_memory_data_shards_direct_read_reassembles_single_block_payload() { async fn direct_memory_data_shards_direct_read_reassembles_single_block_payload() {
use uuid::Uuid; use uuid::Uuid;
+3 -3
View File
@@ -221,9 +221,9 @@ impl SetDisks {
let disks = self.disks.read().await.clone(); let disks = self.disks.read().await.clone();
let required_reads = self.default_read_quorum(); let required_reads = self.default_read_quorum();
let bucket = bucket.to_string(); let bucket: Arc<str> = Arc::from(bucket);
let object = object.to_string(); let object: Arc<str> = Arc::from(object);
let version_id = version_id.to_string(); let version_id: Arc<str> = Arc::from(version_id);
let opts = *opts; let opts = *opts;
let processor = runtime_sources::batch_processors().read_processor(); let processor = runtime_sources::batch_processors().read_processor();