mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-18 10:43:15 +00:00
@@ -617,7 +617,10 @@ impl ReplicationResyncer {
|
||||
} else {
|
||||
let state = TargetReplicationResyncStatus::new();
|
||||
bucket_status.targets_map.insert(opts.arn.clone(), state);
|
||||
bucket_status.targets_map.get_mut(&opts.arn).expect("ARN should be in targets map")
|
||||
bucket_status
|
||||
.targets_map
|
||||
.get_mut(&opts.arn)
|
||||
.expect("ARN should be in targets map")
|
||||
};
|
||||
|
||||
if !resync_state_accepts_update(state, &opts) {
|
||||
@@ -678,7 +681,10 @@ impl ReplicationResyncer {
|
||||
} else {
|
||||
let state = TargetReplicationResyncStatus::new();
|
||||
bucket_status.targets_map.insert(opts.arn.clone(), state);
|
||||
bucket_status.targets_map.get_mut(&opts.arn).expect("ARN should be in targets map")
|
||||
bucket_status
|
||||
.targets_map
|
||||
.get_mut(&opts.arn)
|
||||
.expect("ARN should be in targets map")
|
||||
};
|
||||
|
||||
if !resync_state_accepts_update(state, &opts) {
|
||||
@@ -2710,7 +2716,13 @@ async fn replicate_delete_to_target(dobj: &DeletedObjectReplicationInfo, tgt_cli
|
||||
&& !tgt_client.reset_id.is_empty()
|
||||
&& dobj.op_type == ReplicationType::ExistingObject
|
||||
{
|
||||
rinfo.resync_timestamp = format!("{};{}", OffsetDateTime::now_utc().format(&Rfc3339).unwrap_or_else(|_| "invalid-time".to_string()), tgt_client.reset_id);
|
||||
rinfo.resync_timestamp = format!(
|
||||
"{};{}",
|
||||
OffsetDateTime::now_utc()
|
||||
.format(&Rfc3339)
|
||||
.unwrap_or_else(|_| "invalid-time".to_string()),
|
||||
tgt_client.reset_id
|
||||
);
|
||||
}
|
||||
|
||||
rinfo
|
||||
@@ -3473,8 +3485,13 @@ impl ReplicateObjectInfoExt for ReplicateObjectInfo {
|
||||
&& self.op_type == ReplicationType::ExistingObject
|
||||
&& !tgt_client.reset_id.is_empty()
|
||||
{
|
||||
rinfo.resync_timestamp =
|
||||
format!("{};{}", OffsetDateTime::now_utc().format(&Rfc3339).unwrap_or_else(|_| "invalid-time".to_string()), tgt_client.reset_id);
|
||||
rinfo.resync_timestamp = format!(
|
||||
"{};{}",
|
||||
OffsetDateTime::now_utc()
|
||||
.format(&Rfc3339)
|
||||
.unwrap_or_else(|_| "invalid-time".to_string()),
|
||||
tgt_client.reset_id
|
||||
);
|
||||
rinfo.replication_resynced = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -133,7 +133,8 @@ struct ObjectAttributePart {
|
||||
|
||||
impl ObjectAttributes {
|
||||
pub async fn parse_response(&mut self, h: &HeaderMap, body_vec: Vec<u8>) -> Result<(), std::io::Error> {
|
||||
let last_modified = h.get("Last-Modified")
|
||||
let last_modified = h
|
||||
.get("Last-Modified")
|
||||
.ok_or_else(|| std::io::Error::other("missing Last-Modified header"))?
|
||||
.to_str()
|
||||
.map_err(|e| std::io::Error::other(format!("invalid Last-Modified header: {e}")))?;
|
||||
@@ -141,14 +142,14 @@ impl ObjectAttributes {
|
||||
.map_err(|e| std::io::Error::other(format!("invalid Last-Modified date: {e}")))?;
|
||||
self.last_modified = mod_time;
|
||||
|
||||
let version_id = h.get(X_AMZ_VERSION_ID)
|
||||
let version_id = h
|
||||
.get(X_AMZ_VERSION_ID)
|
||||
.ok_or_else(|| std::io::Error::other("missing version ID header"))?
|
||||
.to_str()
|
||||
.map_err(|e| std::io::Error::other(format!("invalid version ID header: {e}")))?;
|
||||
self.version_id = version_id.to_string();
|
||||
|
||||
let body_str = String::from_utf8(body_vec)
|
||||
.map_err(|e| std::io::Error::other(format!("invalid UTF-8 body: {e}")))?;
|
||||
let body_str = String::from_utf8(body_vec).map_err(|e| std::io::Error::other(format!("invalid UTF-8 body: {e}")))?;
|
||||
let mut response = match quick_xml::de::from_str::<ObjectAttributesResponse>(&body_str) {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
@@ -175,7 +176,10 @@ impl TransitionClient {
|
||||
}
|
||||
|
||||
let mut headers = HeaderMap::new();
|
||||
headers.insert(X_AMZ_OBJECT_ATTRIBUTES, HeaderValue::from_str(GET_OBJECT_ATTRIBUTES_TAGS).expect("valid header value"));
|
||||
headers.insert(
|
||||
X_AMZ_OBJECT_ATTRIBUTES,
|
||||
HeaderValue::from_str(GET_OBJECT_ATTRIBUTES_TAGS).expect("valid header value"),
|
||||
);
|
||||
|
||||
if opts.part_number_marker > 0 {
|
||||
headers.insert(
|
||||
@@ -185,7 +189,10 @@ impl TransitionClient {
|
||||
}
|
||||
|
||||
if opts.max_parts > 0 {
|
||||
headers.insert(X_AMZ_MAX_PARTS, HeaderValue::from_str(&opts.max_parts.to_string()).expect("valid header value"));
|
||||
headers.insert(
|
||||
X_AMZ_MAX_PARTS,
|
||||
HeaderValue::from_str(&opts.max_parts.to_string()).expect("valid header value"),
|
||||
);
|
||||
} else {
|
||||
headers.insert(
|
||||
X_AMZ_MAX_PARTS,
|
||||
@@ -222,9 +229,7 @@ impl TransitionClient {
|
||||
|
||||
let resp_status = resp.status();
|
||||
let h = resp.headers().clone();
|
||||
let has_etag = h.get("ETag")
|
||||
.and_then(|v| v.to_str().ok())
|
||||
.unwrap_or("");
|
||||
let has_etag = h.get("ETag").and_then(|v| v.to_str().ok()).unwrap_or("");
|
||||
if !has_etag.is_empty() {
|
||||
return Err(std::io::Error::other(
|
||||
"get_object_attributes is not supported by the current endpoint version",
|
||||
@@ -241,8 +246,8 @@ impl TransitionClient {
|
||||
}
|
||||
|
||||
if resp_status != http::StatusCode::OK {
|
||||
let err_body = String::from_utf8(body_vec)
|
||||
.map_err(|e| std::io::Error::other(format!("invalid UTF-8 error body: {e}")))?;
|
||||
let err_body =
|
||||
String::from_utf8(body_vec).map_err(|e| std::io::Error::other(format!("invalid UTF-8 error body: {e}")))?;
|
||||
let mut er = match quick_xml::de::from_str::<AccessControlPolicy>(&err_body) {
|
||||
Ok(result) => result,
|
||||
Err(err) => {
|
||||
|
||||
@@ -153,7 +153,10 @@ impl TransitionClient {
|
||||
headers.insert("X-Source-DeleteMarker", HeaderValue::from_str("true").expect("operation should succeed"));
|
||||
}
|
||||
if opts.internal.is_replication_ready_for_delete_marker {
|
||||
headers.insert("X-Check-Replication-Ready", HeaderValue::from_str("true").expect("operation should succeed"));
|
||||
headers.insert(
|
||||
"X-Check-Replication-Ready",
|
||||
HeaderValue::from_str("true").expect("operation should succeed"),
|
||||
);
|
||||
}
|
||||
|
||||
let resp = self
|
||||
|
||||
@@ -2561,7 +2561,9 @@ mod tests {
|
||||
health_check: false,
|
||||
};
|
||||
|
||||
RemoteDisk::new(&endpoint, &disk_option, data_transport).await.expect("operation should succeed")
|
||||
RemoteDisk::new(&endpoint, &disk_option, data_transport)
|
||||
.await
|
||||
.expect("operation should succeed")
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -2697,7 +2699,8 @@ mod tests {
|
||||
};
|
||||
let addr = listener.local_addr().expect("listener local address should be available");
|
||||
|
||||
let url = url::Url::parse(&format!("http://{}:{}/data/rustfs0", addr.ip(), addr.port())).expect("operation should succeed");
|
||||
let url =
|
||||
url::Url::parse(&format!("http://{}:{}/data/rustfs0", addr.ip(), addr.port())).expect("operation should succeed");
|
||||
let endpoint = Endpoint {
|
||||
url,
|
||||
is_local: false,
|
||||
@@ -2808,7 +2811,9 @@ mod tests {
|
||||
health.mark_failure(&endpoint, "test_failure");
|
||||
health.mark_failure(&endpoint, "test_failure");
|
||||
assert_eq!(health.runtime_state(), RuntimeDriveHealthState::Offline);
|
||||
let channel = TonicEndpoint::from_shared(base_addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(base_addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(base_addr.clone(), channel).await;
|
||||
assert!(runtime_sources::test_node_channel_is_cached(&base_addr).await);
|
||||
|
||||
@@ -2854,7 +2859,9 @@ mod tests {
|
||||
|
||||
let copy_task = tokio::spawn(async move {
|
||||
let mut cursor = Cursor::new(payload);
|
||||
copy_stream_with_buffer(&mut cursor, &mut write_half, 4 * 1024).await.expect("operation should succeed");
|
||||
copy_stream_with_buffer(&mut cursor, &mut write_half, 4 * 1024)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
});
|
||||
|
||||
let mut copied = Vec::new();
|
||||
@@ -2890,7 +2897,10 @@ mod tests {
|
||||
|
||||
// Set a disk ID
|
||||
let test_id = Uuid::new_v4();
|
||||
remote_disk.set_disk_id(Some(test_id)).await.expect("operation should succeed");
|
||||
remote_disk
|
||||
.set_disk_id(Some(test_id))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
// Verify the disk ID was set
|
||||
let retrieved_id = remote_disk.get_disk_id().await.expect("operation should succeed");
|
||||
@@ -2923,7 +2933,10 @@ mod tests {
|
||||
assert_eq!(remote_disk.disk_ref().await, endpoint.to_string());
|
||||
|
||||
let disk_id = Uuid::new_v4();
|
||||
remote_disk.set_disk_id(Some(disk_id)).await.expect("operation should succeed");
|
||||
remote_disk
|
||||
.set_disk_id(Some(disk_id))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
assert_eq!(remote_disk.disk_ref().await, disk_id.to_string());
|
||||
}
|
||||
@@ -2935,7 +2948,10 @@ mod tests {
|
||||
let remote_disk = new_remote_disk_with_transport(Arc::new(transport.clone())).await;
|
||||
let expected_disk = remote_disk.disk_ref().await;
|
||||
|
||||
let _reader = remote_disk.read_file_stream("bucket", "object/part.1", 7, 11).await.expect("operation should succeed");
|
||||
let _reader = remote_disk
|
||||
.read_file_stream("bucket", "object/part.1", 7, 11)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let calls = transport.calls();
|
||||
assert_eq!(calls.len(), 1);
|
||||
@@ -2961,7 +2977,10 @@ mod tests {
|
||||
let transport = RecordingInternodeDataTransport::default();
|
||||
let remote_disk = new_remote_disk_with_transport(Arc::new(transport.clone())).await;
|
||||
|
||||
let _reader = remote_disk.read_file_stream("bucket", "object/part.1", 7, 11).await.expect("operation should succeed");
|
||||
let _reader = remote_disk
|
||||
.read_file_stream("bucket", "object/part.1", 7, 11)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let calls = transport.calls();
|
||||
assert_eq!(calls.len(), 1);
|
||||
@@ -2983,7 +3002,10 @@ mod tests {
|
||||
.create_file("orig-bucket", "bucket", "object/part.1", 4096)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
let _appended = remote_disk.append_file("bucket", "object/part.2").await.expect("operation should succeed");
|
||||
let _appended = remote_disk
|
||||
.append_file("bucket", "object/part.2")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let calls = transport.calls();
|
||||
assert_eq!(calls.len(), 2);
|
||||
@@ -3073,7 +3095,10 @@ mod tests {
|
||||
let expected_body = serde_json::to_vec(&opts).expect("operation should succeed");
|
||||
let mut writer = Vec::new();
|
||||
|
||||
remote_disk.walk_dir(opts, &mut writer).await.expect("operation should succeed");
|
||||
remote_disk
|
||||
.walk_dir(opts, &mut writer)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let calls = transport.calls();
|
||||
assert_eq!(calls.len(), 1);
|
||||
@@ -3429,7 +3454,9 @@ mod tests {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let channel = TonicEndpoint::from_shared(addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(addr.clone(), channel).await;
|
||||
assert!(runtime_sources::test_node_channel_is_cached(&addr).await);
|
||||
|
||||
@@ -3473,7 +3500,9 @@ mod tests {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let channel = TonicEndpoint::from_shared(addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(addr.clone(), channel).await;
|
||||
|
||||
let err = remote_disk
|
||||
@@ -3529,7 +3558,9 @@ mod tests {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let channel = TonicEndpoint::from_shared(addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(addr.clone(), channel).await;
|
||||
|
||||
let err = remote_disk
|
||||
@@ -3590,7 +3621,9 @@ mod tests {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let channel = TonicEndpoint::from_shared(addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(addr.clone(), channel).await;
|
||||
|
||||
let err = remote_disk
|
||||
@@ -3643,7 +3676,9 @@ mod tests {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let channel = TonicEndpoint::from_shared(addr.clone()).expect("operation should succeed").connect_lazy();
|
||||
let channel = TonicEndpoint::from_shared(addr.clone())
|
||||
.expect("operation should succeed")
|
||||
.connect_lazy();
|
||||
runtime_sources::cache_test_node_channel(addr.clone(), channel).await;
|
||||
|
||||
let err = remote_disk
|
||||
|
||||
@@ -3884,7 +3884,8 @@ mod test {
|
||||
use tempfile::tempdir;
|
||||
|
||||
let dir = tempdir().expect("operation should succeed");
|
||||
let mut endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let mut endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
endpoint.set_pool_index(0);
|
||||
endpoint.set_set_index(0);
|
||||
endpoint.set_disk_index(0);
|
||||
@@ -3930,7 +3931,9 @@ mod test {
|
||||
let dir = tempdir().expect("operation should succeed");
|
||||
let tmp = LocalDisk::meta_path(dir.path(), RUSTFS_META_TMP_BUCKET);
|
||||
let leftover = tmp.join("leftover").join("data");
|
||||
fs::create_dir_all(leftover.parent().expect("operation should succeed")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(leftover.parent().expect("operation should succeed"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(&leftover, b"temporary").await.expect("operation should succeed");
|
||||
|
||||
LocalDisk::cleanup_tmp_on_startup(dir.path(), Arc::new(AtomicU32::new(0)), Arc::new(Notify::new()))
|
||||
@@ -3949,7 +3952,9 @@ mod test {
|
||||
let tmp = LocalDisk::meta_path(dir.path(), RUSTFS_META_TMP_BUCKET);
|
||||
let stale = tmp.join("stale").join("data");
|
||||
let trash = LocalDisk::meta_path(dir.path(), RUSTFS_META_TMP_DELETED_BUCKET);
|
||||
fs::create_dir_all(stale.parent().expect("operation should succeed")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(stale.parent().expect("operation should succeed"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(&trash).await.expect("operation should succeed");
|
||||
fs::write(&stale, b"temporary").await.expect("operation should succeed");
|
||||
|
||||
@@ -3975,7 +3980,9 @@ mod test {
|
||||
let regular_file = tmp.join("note.txt");
|
||||
let trash = LocalDisk::meta_path(dir.path(), RUSTFS_META_TMP_DELETED_BUCKET);
|
||||
|
||||
fs::create_dir_all(fresh_dir.parent().expect("operation should succeed")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(fresh_dir.parent().expect("operation should succeed"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(&trash).await.expect("operation should succeed");
|
||||
fs::write(&fresh_dir, b"temporary").await.expect("operation should succeed");
|
||||
fs::write(®ular_file, b"keep").await.expect("operation should succeed");
|
||||
@@ -4048,16 +4055,31 @@ mod test {
|
||||
let bucket = "test-bucket";
|
||||
let bucket_dir = dir.path().join(bucket);
|
||||
|
||||
fs::create_dir_all(bucket_dir.join("foo/bar/xyzzy")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("quux/thud")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("asdf")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("foo/bar/xyzzy"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("quux/thud"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("asdf"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
fs::write(bucket_dir.join("foo/bar/xl.meta"), b"meta").await.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("foo/bar/xyzzy/xl.meta"), b"meta").await.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("quux/thud/xl.meta"), b"meta").await.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("asdf/xl.meta"), b"meta").await.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("foo/bar/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("foo/bar/xyzzy/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("quux/thud/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("asdf/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
let (reader, mut writer) = tokio::io::duplex(4096);
|
||||
@@ -4098,13 +4120,19 @@ mod test {
|
||||
let bucket = "test-bucket";
|
||||
let bucket_dir = dir.path().join(bucket);
|
||||
|
||||
fs::create_dir_all(bucket_dir.join("marker/file.txt")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("marker/subdir/file.txt")).await.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("marker/file.txt"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join("marker/subdir/file.txt"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::create_dir_all(bucket_dir.join(format!("marker/subdir{GLOBAL_DIR_SUFFIX}")))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
fs::write(bucket_dir.join("marker/file.txt/xl.meta"), b"meta").await.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("marker/file.txt/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(bucket_dir.join("marker/subdir/file.txt/xl.meta"), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
@@ -4112,7 +4140,8 @@ mod test {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
let (reader, mut writer) = tokio::io::duplex(4096);
|
||||
@@ -4167,10 +4196,13 @@ mod test {
|
||||
] {
|
||||
let object_dir = bucket_dir.join(name);
|
||||
fs::create_dir_all(&object_dir).await.expect("operation should succeed");
|
||||
fs::write(object_dir.join(STORAGE_FORMAT_FILE), b"meta").await.expect("operation should succeed");
|
||||
fs::write(object_dir.join(STORAGE_FORMAT_FILE), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
}
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
async fn scan_names(disk: &LocalDisk, bucket: &str, base_dir: &str, forward_to: &str) -> (Vec<String>, i32) {
|
||||
@@ -4308,7 +4340,9 @@ mod test {
|
||||
}
|
||||
|
||||
let hidden_versioned_dir = bucket_dir.join("shard/aaa-trash-0003");
|
||||
fs::create_dir_all(&hidden_versioned_dir).await.expect("operation should succeed");
|
||||
fs::create_dir_all(&hidden_versioned_dir)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(
|
||||
hidden_versioned_dir.join(STORAGE_FORMAT_FILE),
|
||||
delete_marker_with_old_object_metadata(
|
||||
@@ -4328,7 +4362,8 @@ mod test {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
let (reader, mut writer) = tokio::io::duplex(4096);
|
||||
@@ -4377,14 +4412,22 @@ mod test {
|
||||
fs::create_dir_all(&object_dir).await.expect("operation should succeed");
|
||||
fs::write(&meta_path, b"meta").await.expect("operation should succeed");
|
||||
|
||||
let original_permissions = fs::metadata(&meta_path).await.expect("operation should succeed").permissions();
|
||||
fs::set_permissions(&meta_path, Permissions::from_mode(0o000)).await.expect("operation should succeed");
|
||||
let original_permissions = fs::metadata(&meta_path)
|
||||
.await
|
||||
.expect("operation should succeed")
|
||||
.permissions();
|
||||
fs::set_permissions(&meta_path, Permissions::from_mode(0o000))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
if fs::File::open(&meta_path).await.is_ok() {
|
||||
fs::set_permissions(&meta_path, original_permissions).await.expect("operation should succeed");
|
||||
fs::set_permissions(&meta_path, original_permissions)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
return;
|
||||
}
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
let (_reader, mut writer) = tokio::io::duplex(4096);
|
||||
@@ -4401,7 +4444,9 @@ mod test {
|
||||
.scan_dir("".to_string(), "".to_string(), &opts, &mut out, &mut objs_returned, false, None)
|
||||
.await;
|
||||
|
||||
fs::set_permissions(&meta_path, original_permissions).await.expect("operation should succeed");
|
||||
fs::set_permissions(&meta_path, original_permissions)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
assert!(matches!(result, Err(DiskError::FileAccessDenied)));
|
||||
}
|
||||
@@ -4437,31 +4482,48 @@ mod test {
|
||||
|
||||
fs::create_dir_all(&multipart_base).await.expect("operation should succeed");
|
||||
for uuid in &[UUID_MULTIPART_1, UUID_MULTIPART_2] {
|
||||
fs::create_dir_all(multipart_base.join(uuid)).await.expect("operation should succeed");
|
||||
fs::write(multipart_base.join(uuid).join("part.1"), b"part").await.expect("operation should succeed");
|
||||
fs::create_dir_all(multipart_base.join(uuid))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(multipart_base.join(uuid).join("part.1"), b"part")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
}
|
||||
fs::create_dir_all(obj_base.join(UUID_OBJ)).await.expect("operation should succeed");
|
||||
fs::write(obj_base.join(UUID_OBJ).join("part.1"), b"part").await.expect("operation should succeed");
|
||||
fs::create_dir_all(obj_base.join(UUID_OBJ))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(obj_base.join(UUID_OBJ).join("part.1"), b"part")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
fs::create_dir_all(&dir_in_multipart_base).await.expect("operation should succeed");
|
||||
fs::create_dir_all(&dir_in_multipart_base)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
fs::write(dir_in_multipart_base.join(STORAGE_FORMAT_FILE), b"meta")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let mut fm = FileMeta::default();
|
||||
fm.add_version(create_file_info(VER_ID_1, UUID_MULTIPART_1)).expect("operation should succeed");
|
||||
fm.add_version(create_file_info(VER_ID_2, UUID_MULTIPART_2)).expect("operation should succeed");
|
||||
fs::write(multipart_base.join(STORAGE_FORMAT_FILE), fm.marshal_msg().expect("operation should succeed"))
|
||||
.await
|
||||
fm.add_version(create_file_info(VER_ID_1, UUID_MULTIPART_1))
|
||||
.expect("operation should succeed");
|
||||
fm.add_version(create_file_info(VER_ID_2, UUID_MULTIPART_2))
|
||||
.expect("operation should succeed");
|
||||
fs::write(
|
||||
multipart_base.join(STORAGE_FORMAT_FILE),
|
||||
fm.marshal_msg().expect("operation should succeed"),
|
||||
)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let mut fm = FileMeta::default();
|
||||
fm.add_version(create_file_info(VER_ID_3, UUID_OBJ)).expect("operation should succeed");
|
||||
fm.add_version(create_file_info(VER_ID_3, UUID_OBJ))
|
||||
.expect("operation should succeed");
|
||||
fs::write(obj_base.join(STORAGE_FORMAT_FILE), fm.marshal_msg().expect("operation should succeed"))
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
let (reader, mut writer) = tokio::io::duplex(4096);
|
||||
@@ -4477,7 +4539,10 @@ mod test {
|
||||
)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
MetacacheWriter::new(&mut writer).close().await.expect("operation should succeed");
|
||||
MetacacheWriter::new(&mut writer)
|
||||
.close()
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let mut reader = MetacacheReader::new(reader);
|
||||
let entries = reader.read_all().await.expect("operation should succeed");
|
||||
@@ -4570,7 +4635,9 @@ mod test {
|
||||
|
||||
let disk = LocalDisk::new(&ep, false).await.expect("operation should succeed");
|
||||
|
||||
let tmpp = disk.resolve_abs_path(Path::new(RUSTFS_META_TMP_DELETED_BUCKET)).expect("operation should succeed");
|
||||
let tmpp = disk
|
||||
.resolve_abs_path(Path::new(RUSTFS_META_TMP_DELETED_BUCKET))
|
||||
.expect("operation should succeed");
|
||||
|
||||
println!("ppp :{:?}", &tmpp);
|
||||
|
||||
@@ -4598,7 +4665,9 @@ mod test {
|
||||
|
||||
let disk = LocalDisk::new(&ep, false).await.expect("operation should succeed");
|
||||
|
||||
let tmpp = disk.resolve_abs_path(Path::new(RUSTFS_META_TMP_DELETED_BUCKET)).expect("operation should succeed");
|
||||
let tmpp = disk
|
||||
.resolve_abs_path(Path::new(RUSTFS_META_TMP_DELETED_BUCKET))
|
||||
.expect("operation should succeed");
|
||||
|
||||
println!("ppp :{:?}", &tmpp);
|
||||
|
||||
@@ -4634,7 +4703,9 @@ mod test {
|
||||
assert!(bucket_path.to_string_lossy().contains("test-bucket"));
|
||||
|
||||
// Test object path
|
||||
let object_path = disk.get_object_path("test-bucket", "test-object").expect("operation should succeed");
|
||||
let object_path = disk
|
||||
.get_object_path("test-bucket", "test-object")
|
||||
.expect("operation should succeed");
|
||||
assert!(object_path.to_string_lossy().contains("test-bucket"));
|
||||
assert!(object_path.to_string_lossy().contains("test-object"));
|
||||
|
||||
@@ -4695,7 +4766,10 @@ mod test {
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
let read_data = disk.read_all("test-volume", "test-file.txt").await.expect("operation should succeed");
|
||||
let read_data = disk
|
||||
.read_all("test-volume", "test-file.txt")
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
assert_eq!(read_data, test_data);
|
||||
|
||||
// Test file deletion
|
||||
@@ -4705,7 +4779,9 @@ mod test {
|
||||
undo_write: false,
|
||||
old_data_dir: None,
|
||||
};
|
||||
disk.delete("test-volume", "test-file.txt", delete_opts).await.expect("operation should succeed");
|
||||
disk.delete("test-volume", "test-file.txt", delete_opts)
|
||||
.await
|
||||
.expect("operation should succeed");
|
||||
|
||||
// Clean up
|
||||
disk.delete_volume("test-volume").await.expect("operation should succeed");
|
||||
@@ -4781,7 +4857,8 @@ mod test {
|
||||
use tempfile::tempdir;
|
||||
|
||||
let dir = tempdir().expect("operation should succeed");
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
disk.make_volume("test-volume").await.expect("operation should succeed");
|
||||
@@ -4798,7 +4875,8 @@ mod test {
|
||||
use tempfile::tempdir;
|
||||
|
||||
let dir = tempdir().expect("operation should succeed");
|
||||
let endpoint = Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let endpoint =
|
||||
Endpoint::try_from(dir.path().to_str().expect("operation should succeed")).expect("operation should succeed");
|
||||
let disk = LocalDisk::new(&endpoint, false).await.expect("operation should succeed");
|
||||
|
||||
disk.make_volume("test-volume").await.expect("operation should succeed");
|
||||
|
||||
@@ -429,7 +429,11 @@ impl SetDisks {
|
||||
"find_file_info_in_quorum: inspecting meta"
|
||||
);
|
||||
|
||||
let etag_only = mod_time.is_none() && etag.is_some() && meta.get_etag().is_some_and(|v| &v == etag.as_ref().expect("operation should succeed"));
|
||||
let etag_only = mod_time.is_none()
|
||||
&& etag.is_some()
|
||||
&& meta
|
||||
.get_etag()
|
||||
.is_some_and(|v| &v == etag.as_ref().expect("operation should succeed"));
|
||||
let mod_valid = mod_time == &meta.mod_time;
|
||||
|
||||
if etag_only || mod_valid {
|
||||
|
||||
@@ -549,7 +549,8 @@ impl SetDisks {
|
||||
} else {
|
||||
rename_successes += 1;
|
||||
if parts_metadata[index].is_remote() {
|
||||
let rm_data_dir = parts_metadata[index].data_dir.expect("operation should succeed").to_string();
|
||||
let rm_data_dir =
|
||||
parts_metadata[index].data_dir.expect("operation should succeed").to_string();
|
||||
|
||||
let d_path = Path::new(&encode_dir_object(object)).join(rm_data_dir);
|
||||
|
||||
|
||||
@@ -659,8 +659,8 @@ mod tests {
|
||||
},
|
||||
];
|
||||
|
||||
let (info, idx) =
|
||||
resolve_latest_object_info_candidates(candidates, "bucket", "object", &ObjectOptions::default()).expect("operation should succeed");
|
||||
let (info, idx) = resolve_latest_object_info_candidates(candidates, "bucket", "object", &ObjectOptions::default())
|
||||
.expect("operation should succeed");
|
||||
|
||||
assert_eq!(idx, 1);
|
||||
assert!(info.delete_marker);
|
||||
@@ -681,7 +681,8 @@ mod tests {
|
||||
},
|
||||
];
|
||||
|
||||
let (_, idx) = resolve_latest_object_info_candidates(candidates, "bucket", "object", &ObjectOptions::default()).expect("operation should succeed");
|
||||
let (_, idx) = resolve_latest_object_info_candidates(candidates, "bucket", "object", &ObjectOptions::default())
|
||||
.expect("operation should succeed");
|
||||
|
||||
assert_eq!(idx, 1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user