diff --git a/crates/ecstore/src/bucket/bucket_target_sys.rs b/crates/ecstore/src/bucket/bucket_target_sys.rs index f5ac0c013..74bf96d7f 100644 --- a/crates/ecstore/src/bucket/bucket_target_sys.rs +++ b/crates/ecstore/src/bucket/bucket_target_sys.rs @@ -866,7 +866,7 @@ impl BucketTargetSys { return Some(cli); } - // TODO: spawn a task to reload the target + // TODO(backlog): spawn an async task to proactively reload the replication target if self.is_reloading_target(bucket, arn).await { return None; } diff --git a/crates/ecstore/src/cluster/rpc/peer_s3_client.rs b/crates/ecstore/src/cluster/rpc/peer_s3_client.rs index d44651dce..72db2062c 100644 --- a/crates/ecstore/src/cluster/rpc/peer_s3_client.rs +++ b/crates/ecstore/src/cluster/rpc/peer_s3_client.rs @@ -454,7 +454,7 @@ impl S3PeerSys { } } topology_complete &= bucket_map.values().all(|count| *count >= quorum); - // TODO: MRF + // TODO(backlog): integrate MRF backlog stats into scanner bucket listing } let mut buckets: Vec = result_map.into_values().collect(); diff --git a/crates/ecstore/src/cluster/rpc/remote_disk.rs b/crates/ecstore/src/cluster/rpc/remote_disk.rs index ed8772f53..efb1b4d8d 100644 --- a/crates/ecstore/src/cluster/rpc/remote_disk.rs +++ b/crates/ecstore/src/cluster/rpc/remote_disk.rs @@ -2406,7 +2406,7 @@ impl DiskAPI for RemoteDisk { return errors; } - // TODO: use Error not string + // TODO(backlog): replace string errors with typed `StorageError` variants let result = self .execute_with_timeout( diff --git a/crates/ecstore/src/core/sets.rs b/crates/ecstore/src/core/sets.rs index 1d1bcedeb..3acf1a705 100644 --- a/crates/ecstore/src/core/sets.rs +++ b/crates/ecstore/src/core/sets.rs @@ -249,7 +249,7 @@ impl Sets { self.connect_disks().await; - // TODO: config interval + // TODO(backlog): make monitor_and_connect interval configurable instead of hardcoded 15s let mut interval = tokio::time::interval(Duration::from_secs(15)); loop { tokio::select! { diff --git a/crates/ecstore/src/disk/local.rs b/crates/ecstore/src/disk/local.rs index 0a9b11ef1..2d7270cff 100644 --- a/crates/ecstore/src/disk/local.rs +++ b/crates/ecstore/src/disk/local.rs @@ -5215,8 +5215,8 @@ impl LocalDisk { let cache = Cache::new(update_fn, Duration::from_secs(1), Opts::default()); - // TODO: DIRECT support - // TODD: DiskInfo + // TODO(backlog): add O_DIRECT I/O support for performance-critical paths + // TODO(backlog): populate DiskInfo in constructor let mut disk = Self { root: root.clone(), publication_root, @@ -5751,7 +5751,7 @@ impl LocalDisk { // return Ok(()); - // TODO: async notifications for disk space checks and trash cleanup + // TODO(backlog): make disk space checks and trash cleanup event-driven instead of poll-based let trash_path = self.io_get_object_path(RUSTFS_META_TMP_DELETED_BUCKET, Uuid::new_v4().to_string().as_str())?; // if let Some(parent) = trash_path.parent() { @@ -5997,7 +5997,7 @@ impl LocalDisk { #[hotpath::measure(impl_type = "LocalDisk")] async fn read_all_data(&self, volume: &str, volume_dir: impl AsRef, file_path: impl AsRef) -> Result> { - // TODO: timeout support + // TODO(backlog): add configurable timeout for read_all_data operations let (data, _) = self.read_all_data_with_dmtime(volume, volume_dir, file_path).await?; Ok(data) } @@ -6674,7 +6674,7 @@ impl LocalDisk { return Ok(()); } - // TODO: add lock + // TODO(backlog): add directory listing lock to prevent concurrent enumeration let stall = opts.stall_timeout_duration(); @@ -8796,7 +8796,7 @@ impl DiskAPI for LocalDisk { Ok(entries) } - // FIXME: TODO: io.writer TODO cancel + // TODO(backlog): support io.writer cancellation and early termination in walk_dir #[tracing::instrument(level = "trace", skip_all)] async fn walk_dir(&self, opts: WalkDirOptions, wr: &mut W) -> Result<()> { self.wait_for_startup_cleanup().await; @@ -9880,7 +9880,7 @@ impl DiskAPI for LocalDisk { ); return Err(e); } - // TODO: health check + // TODO(backlog): add post-setup disk health verification } Ok(()) } diff --git a/crates/ecstore/src/layout/endpoints.rs b/crates/ecstore/src/layout/endpoints.rs index 1f1a9bdd1..3212e3822 100644 --- a/crates/ecstore/src/layout/endpoints.rs +++ b/crates/ecstore/src/layout/endpoints.rs @@ -249,7 +249,7 @@ impl PoolEndpointList { endpoint.set_set_index(0); endpoint.set_disk_index(0); - // TODO Check for cross device mounts if any. + // TODO(backlog): check for cross-device mounts in single-drive setup return Ok(Self { inner: vec![Endpoints::from(vec![endpoint])], @@ -264,7 +264,7 @@ impl PoolEndpointList { // Convert args to endpoints let mut eps = Endpoints::try_from(set_layout.as_slice())?; - // TODO Check for cross device mounts if any. + // TODO(backlog): check for cross-device mounts in multi-pool setup for (disk_idx, ep) in eps.as_mut().iter_mut().enumerate() { ep.set_pool_index(pool_idx); diff --git a/crates/ecstore/src/object_api/types.rs b/crates/ecstore/src/object_api/types.rs index 3df802115..1bbff7a7f 100644 --- a/crates/ecstore/src/object_api/types.rs +++ b/crates/ecstore/src/object_api/types.rs @@ -1091,7 +1091,7 @@ impl ObjectInfo { } }; - // TODO:VersionPurgeStatus + // TODO(backlog): handle VersionPurgeStatus in object listing let versioned = vcfg.clone().map(|v| v.0.versioned(&entry.name)).unwrap_or_default(); objects.push(ObjectInfo::from_file_info(&fi, bucket, &entry.name, versioned)); diff --git a/crates/ecstore/src/set_disk/ops/multipart.rs b/crates/ecstore/src/set_disk/ops/multipart.rs index 0f418fa7f..6af71db17 100644 --- a/crates/ecstore/src/set_disk/ops/multipart.rs +++ b/crates/ecstore/src/set_disk/ops/multipart.rs @@ -1575,7 +1575,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks { let parts_metadata = vec![fi.clone(); disks.len()]; if !user_defined.contains_key("content-type") { - // TODO: get content-type + // TODO(backlog): detect content-type from part data when header is missing } if let Some(sc) = user_defined.get(AMZ_STORAGE_CLASS) @@ -1971,7 +1971,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks { return Err(Error::InvalidPart(p.part_num, ext_part.etag.clone(), p.etag.clone().unwrap_or_default())); } - // TODO: crypto + // TODO(backlog): integrate encryption verification during complete multipart if (i < uploaded_parts.len() - 1) && !(opts.data_movement && ext_part.actual_size < 0) diff --git a/crates/ecstore/src/set_disk/ops/object.rs b/crates/ecstore/src/set_disk/ops/object.rs index 9ba7f8da7..cb8f70766 100644 --- a/crates/ecstore/src/set_disk/ops/object.rs +++ b/crates/ecstore/src/set_disk/ops/object.rs @@ -6161,7 +6161,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks { join_all(rollback_futures).await; - // TODO: add_partial + // TODO(backlog): support partial object deletion for multi-part objects if let Some(api) = opts.tier_delete_journal_api.as_ref() { for (idx, je) in persisted_journal_entries { @@ -6371,7 +6371,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks { } } - // TODO: Lifecycle + // TODO(backlog): integrate lifecycle evaluation before object deletion let mut version_found = true; // delete_object_version below derives its own majority quorum from the @@ -6465,7 +6465,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks { mark_deleted: mark_delete, mod_time: Some(mod_time), replication_state_internal: opts.delete_replication.as_ref().map(replication_state_to_filemeta), - ..Default::default() // TODO: Transition + ..Default::default() // TODO(backlog): populate transition state on delete markers }; fi.set_tier_free_version_id(&find_vid.to_string()); diff --git a/crates/ecstore/src/store/bucket.rs b/crates/ecstore/src/store/bucket.rs index 1fac01899..77cdbc954 100644 --- a/crates/ecstore/src/store/bucket.rs +++ b/crates/ecstore/src/store/bucket.rs @@ -601,7 +601,7 @@ impl ECStore { #[instrument(skip(self))] pub(super) async fn handle_list_bucket(&self, opts: &BucketOptions) -> Result> { - // TODO: opts.cached + // TODO(backlog): support cached bucket listing via opts.cached let mut buckets = self.peer_sys.list_bucket(opts).await?; diff --git a/crates/ecstore/src/store/list_objects.rs b/crates/ecstore/src/store/list_objects.rs index 558bb7c94..0d8d238f9 100644 --- a/crates/ecstore/src/store/list_objects.rs +++ b/crates/ecstore/src/store/list_objects.rs @@ -4673,7 +4673,7 @@ async fn gather_results( entry.name = entry.name.replace("\\", "/"); } - // TODO: rx.recv() + // TODO(backlog): integrate rx.recv() for incremental listing results if let Some(marker) = &opts.marker && ((!opts.include_marker && &entry.name <= marker) || (opts.include_marker && &entry.name < marker)) @@ -4703,7 +4703,7 @@ async fn gather_results( continue; } - // TODO: Lifecycle + // TODO(backlog): integrate lifecycle evaluation during object listing entries.push(Some(entry)); candidate_entries += 1; diff --git a/crates/ecstore/src/store/multipart.rs b/crates/ecstore/src/store/multipart.rs index 3d460d4d5..2c0b18b2a 100644 --- a/crates/ecstore/src/store/multipart.rs +++ b/crates/ecstore/src/store/multipart.rs @@ -332,7 +332,7 @@ impl ECStore { let expected_incarnation_id = opts.expected_bucket_incarnation_id; if request.prefix.is_empty() { - // TODO: return from cache + // TODO(backlog): return cached multipart listing when prefix is empty } if self.single_pool() { @@ -610,7 +610,7 @@ impl ECStore { let (opts, _bucket_lifecycle_guard) = self.guard_multipart_bucket_incarnation(bucket, opts).await?; let opts = &opts; - // TODO: defer DeleteUploadID + // TODO(backlog): defer DeleteUploadID to background for faster abort response if self.single_pool() { return self.pools[0].abort_multipart_upload(bucket, object, upload_id, opts).await; diff --git a/crates/ecstore/src/store/rebalance.rs b/crates/ecstore/src/store/rebalance.rs index 79e3abf91..7d7c1d91e 100644 --- a/crates/ecstore/src/store/rebalance.rs +++ b/crates/ecstore/src/store/rebalance.rs @@ -385,7 +385,7 @@ impl ECStore { } pub(super) async fn is_suspended(&self, idx: usize) -> bool { - // TODO: LOCK + // TODO(backlog): acquire pool metadata lock for consistent suspension check let pool_meta = self.pool_meta.read().await;