Skip to content

Commit a0a0ec3

Browse files
de-shnikhilsinhaparseable
andauthoredJan 28, 2025··
refactor: parts of hottier (#1022)
--------- Co-authored-by: Nikhil Sinha <[email protected]>
1 parent 12c507c commit a0a0ec3

File tree

9 files changed

+364
-346
lines changed

9 files changed

+364
-346
lines changed
 

‎src/handlers/http/logstream.rs

+28-49
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ pub async fn get_stream_info(stream_name: Path<String>) -> Result<impl Responder
586586

587587
pub async fn put_stream_hot_tier(
588588
stream_name: Path<String>,
589-
Json(json): Json<Value>,
589+
Json(mut hottier): Json<StreamHotTier>,
590590
) -> Result<impl Responder, StreamError> {
591591
let stream_name = stream_name.into_inner();
592592
if !STREAM_INFO.stream_exists(&stream_name) {
@@ -609,35 +609,28 @@ pub async fn put_stream_hot_tier(
609609
status: StatusCode::BAD_REQUEST,
610610
});
611611
}
612-
if CONFIG.options.hot_tier_storage_path.is_none() {
613-
return Err(StreamError::HotTierNotEnabled(stream_name));
614-
}
615-
616-
let mut hottier: StreamHotTier = match serde_json::from_value(json) {
617-
Ok(hottier) => hottier,
618-
Err(err) => return Err(StreamError::InvalidHotTierConfig(err)),
619-
};
620612

621613
validator::hot_tier(&hottier.size.to_string())?;
622614

623615
STREAM_INFO.set_hot_tier(&stream_name, true)?;
624-
if let Some(hot_tier_manager) = HotTierManager::global() {
625-
let existing_hot_tier_used_size = hot_tier_manager
626-
.validate_hot_tier_size(&stream_name, &hottier.size)
627-
.await?;
628-
hottier.used_size = existing_hot_tier_used_size.to_string();
629-
hottier.available_size = hottier.size.to_string();
630-
hottier.version = Some(CURRENT_HOT_TIER_VERSION.to_string());
631-
hot_tier_manager
632-
.put_hot_tier(&stream_name, &mut hottier)
633-
.await?;
634-
let storage = CONFIG.storage().get_object_store();
635-
let mut stream_metadata = storage.get_object_store_format(&stream_name).await?;
636-
stream_metadata.hot_tier_enabled = Some(true);
637-
storage
638-
.put_stream_manifest(&stream_name, &stream_metadata)
639-
.await?;
640-
}
616+
let Some(hot_tier_manager) = HotTierManager::global() else {
617+
return Err(StreamError::HotTierNotEnabled(stream_name));
618+
};
619+
let existing_hot_tier_used_size = hot_tier_manager
620+
.validate_hot_tier_size(&stream_name, hottier.size)
621+
.await?;
622+
hottier.used_size = existing_hot_tier_used_size;
623+
hottier.available_size = hottier.size;
624+
hottier.version = Some(CURRENT_HOT_TIER_VERSION.to_string());
625+
hot_tier_manager
626+
.put_hot_tier(&stream_name, &mut hottier)
627+
.await?;
628+
let storage = CONFIG.storage().get_object_store();
629+
let mut stream_metadata = storage.get_object_store_format(&stream_name).await?;
630+
stream_metadata.hot_tier_enabled = true;
631+
storage
632+
.put_stream_manifest(&stream_name, &stream_metadata)
633+
.await?;
641634

642635
Ok((
643636
format!("hot tier set for stream {stream_name}"),
@@ -662,22 +655,12 @@ pub async fn get_stream_hot_tier(stream_name: Path<String>) -> Result<impl Respo
662655
}
663656
}
664657

665-
if CONFIG.options.hot_tier_storage_path.is_none() {
658+
let Some(hot_tier_manager) = HotTierManager::global() else {
666659
return Err(StreamError::HotTierNotEnabled(stream_name));
667-
}
660+
};
661+
let meta = hot_tier_manager.get_hot_tier(&stream_name).await?;
668662

669-
if let Some(hot_tier_manager) = HotTierManager::global() {
670-
let mut hot_tier = hot_tier_manager.get_hot_tier(&stream_name).await?;
671-
hot_tier.size = format!("{} {}", hot_tier.size, "Bytes");
672-
hot_tier.used_size = format!("{} Bytes", hot_tier.used_size);
673-
hot_tier.available_size = format!("{} Bytes", hot_tier.available_size);
674-
Ok((web::Json(hot_tier), StatusCode::OK))
675-
} else {
676-
Err(StreamError::Custom {
677-
msg: format!("hot tier not initialised for stream {}", stream_name),
678-
status: (StatusCode::BAD_REQUEST),
679-
})
680-
}
663+
Ok((web::Json(meta), StatusCode::OK))
681664
}
682665

683666
pub async fn delete_stream_hot_tier(
@@ -699,9 +682,9 @@ pub async fn delete_stream_hot_tier(
699682
}
700683
}
701684

702-
if CONFIG.options.hot_tier_storage_path.is_none() {
685+
let Some(hot_tier_manager) = HotTierManager::global() else {
703686
return Err(StreamError::HotTierNotEnabled(stream_name));
704-
}
687+
};
705688

706689
if STREAM_INFO.stream_type(&stream_name).unwrap() == Some(StreamType::Internal.to_string()) {
707690
return Err(StreamError::Custom {
@@ -710,9 +693,8 @@ pub async fn delete_stream_hot_tier(
710693
});
711694
}
712695

713-
if let Some(hot_tier_manager) = HotTierManager::global() {
714-
hot_tier_manager.delete_hot_tier(&stream_name).await?;
715-
}
696+
hot_tier_manager.delete_hot_tier(&stream_name).await?;
697+
716698
Ok((
717699
format!("hot tier deleted for stream {stream_name}"),
718700
StatusCode::OK,
@@ -821,8 +803,6 @@ pub mod error {
821803
"Hot tier is not enabled at the server config, cannot enable hot tier for stream {0}"
822804
)]
823805
HotTierNotEnabled(String),
824-
#[error("failed to enable hottier due to err: {0}")]
825-
InvalidHotTierConfig(serde_json::Error),
826806
#[error("Hot tier validation failed: {0}")]
827807
HotTierValidation(#[from] HotTierValidationError),
828808
#[error("{0}")]
@@ -859,8 +839,7 @@ pub mod error {
859839
StreamError::Network(err) => {
860840
err.status().unwrap_or(StatusCode::INTERNAL_SERVER_ERROR)
861841
}
862-
StreamError::HotTierNotEnabled(_) => StatusCode::BAD_REQUEST,
863-
StreamError::InvalidHotTierConfig(_) => StatusCode::BAD_REQUEST,
842+
StreamError::HotTierNotEnabled(_) => StatusCode::FORBIDDEN,
864843
StreamError::HotTierValidation(_) => StatusCode::BAD_REQUEST,
865844
StreamError::HotTierError(_) => StatusCode::INTERNAL_SERVER_ERROR,
866845
}

0 commit comments

Comments
 (0)
Please sign in to comment.