config: add mmap read env alias (#4021)

This commit is contained in:
Zhengchao An
2026-06-28 23:24:24 +08:00
committed by GitHub
parent b37c8c6435
commit 8284e6a75c
5 changed files with 61 additions and 17 deletions
+35
View File
@@ -15,6 +15,7 @@
use crate::disk::{self, DiskAPI as _, DiskStore, FileReader, error::DiskError};
use crate::erasure::coding::{BitrotReader, BitrotWriterWrapper, CustomWriter};
use bytes::Bytes;
use rustfs_config::{DEFAULT_OBJECT_MMAP_READ_ENABLE, ENV_OBJECT_MMAP_READ_ENABLE, ENV_OBJECT_ZERO_COPY_ENABLE};
use rustfs_utils::HashAlgorithm;
use std::future::Future;
use std::io::{self, Cursor};
@@ -28,6 +29,14 @@ use tracing::debug;
type BoxedObjectReader = Box<dyn AsyncRead + Send + Sync + Unpin>;
type OpenObjectReaderFuture = Pin<Box<dyn Future<Output = disk::error::Result<Option<BoxedObjectReader>>> + Send>>;
pub(crate) fn object_mmap_read_enabled() -> bool {
rustfs_utils::get_env_bool_with_aliases(
ENV_OBJECT_MMAP_READ_ENABLE,
&[ENV_OBJECT_ZERO_COPY_ENABLE],
DEFAULT_OBJECT_MMAP_READ_ENABLE,
)
}
#[derive(Clone)]
struct BitrotReaderSource {
inline_data: Option<Bytes>,
@@ -295,6 +304,32 @@ pub async fn create_bitrot_writer(
mod tests {
use super::*;
#[test]
fn object_mmap_read_enabled_accepts_legacy_zero_copy_alias() {
temp_env::with_vars(
[
(ENV_OBJECT_MMAP_READ_ENABLE, None::<&str>),
(ENV_OBJECT_ZERO_COPY_ENABLE, Some("false")),
],
|| {
assert!(!object_mmap_read_enabled());
},
);
}
#[test]
fn object_mmap_read_enabled_prefers_canonical_env() {
temp_env::with_vars(
[
(ENV_OBJECT_MMAP_READ_ENABLE, Some("true")),
(ENV_OBJECT_ZERO_COPY_ENABLE, Some("false")),
],
|| {
assert!(object_mmap_read_enabled());
},
);
}
#[tokio::test]
async fn test_create_bitrot_reader_with_inline_data() {
let test_data = b"hello world test data";
+2 -5
View File
@@ -13,8 +13,8 @@
// limitations under the License.
use super::*;
use crate::io_support::bitrot::object_mmap_read_enabled;
use crate::storage_api_contracts::namespace::NamespaceLocking as _;
use rustfs_config::{DEFAULT_OBJECT_ZERO_COPY_ENABLE, ENV_OBJECT_ZERO_COPY_ENABLE};
const LOG_COMPONENT_ECSTORE: &str = "ecstore";
const LOG_SUBSYSTEM_HEAL: &str = "heal";
@@ -360,10 +360,7 @@ impl SetDisks {
for (part_index, part) in latest_meta.parts.iter().enumerate() {
let till_offset = erasure.shard_file_offset(0, part.size, part.size);
// Read zero-copy configuration from environment variable
// Default: enabled (true) for performance
let use_mmap_read =
rustfs_utils::get_env_bool(ENV_OBJECT_ZERO_COPY_ENABLE, DEFAULT_OBJECT_ZERO_COPY_ENABLE);
let use_mmap_read = object_mmap_read_enabled();
let mut readers = Vec::with_capacity(latest_disks.len());
let mut writers = Vec::with_capacity(out_dated_disks.len());
+3 -6
View File
@@ -26,11 +26,10 @@ use crate::diagnostics::get::{
record_get_object_pipeline_failure_for_path, record_get_stage_duration_if_enabled,
};
use crate::erasure::coding::BitrotReader;
use crate::io_support::bitrot::create_deferred_bitrot_reader;
use crate::io_support::bitrot::{create_deferred_bitrot_reader, object_mmap_read_enabled};
use crate::set_disk::shard_source::ShardReadCost;
use futures::stream::{FuturesUnordered, StreamExt};
use metrics::counter;
use rustfs_config::{DEFAULT_OBJECT_ZERO_COPY_ENABLE, ENV_OBJECT_ZERO_COPY_ENABLE};
use std::{
collections::{HashMap, VecDeque},
future::Future,
@@ -2004,9 +2003,7 @@ impl SetDisks {
};
let read_length = till_offset.saturating_sub(read_offset);
// Read zero-copy configuration from environment variable
// Default: enabled (true) for performance
let use_mmap_read = rustfs_utils::get_env_bool(ENV_OBJECT_ZERO_COPY_ENABLE, DEFAULT_OBJECT_ZERO_COPY_ENABLE);
let use_mmap_read = object_mmap_read_enabled();
let reader_setup_stage_start = Instant::now();
let read_costs = disks
@@ -2387,7 +2384,7 @@ impl SetDisks {
} else {
checksum_info.algorithm
};
let use_mmap_read = rustfs_utils::get_env_bool(ENV_OBJECT_ZERO_COPY_ENABLE, DEFAULT_OBJECT_ZERO_COPY_ENABLE);
let use_mmap_read = object_mmap_read_enabled();
let till_offset = erasure.shard_file_offset(part_offset, part_length, part_size);
let read_offset = (part_offset / erasure.block_size) * erasure.shard_size();
let read_length = till_offset.saturating_sub(read_offset);