Skip to content

Commit f6742b5

Browse files
authored
fix(cluster): disable forward warehouse request in self-managed cluster (#17176)
* fix(cluster): disable forward warehouse request in self-managed cluster * fix(cluster): disable forward warehouse request in self-managed cluster * fix(cluster): disable forward warehouse request in self-managed cluster * fix(cluster): disable forward warehouse request in self-managed cluster
1 parent 9c56abd commit f6742b5

File tree

5 files changed

+65
-37
lines changed

5 files changed

+65
-37
lines changed

src/query/ee/src/resource_management/resources_management_kubernetes.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ impl KubernetesResourcesManagement {
3232

3333
#[async_trait::async_trait]
3434
impl ResourcesManagement for KubernetesResourcesManagement {
35+
fn support_forward_warehouse_request(&self) -> bool {
36+
false
37+
}
38+
3539
async fn init_node(&self, _: &mut NodeInfo) -> Result<()> {
3640
Err(ErrorCode::Unimplemented(
3741
"Unimplemented kubernetes resources management",

src/query/ee/src/resource_management/resources_management_self_managed.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ impl SelfManagedResourcesManagement {
4141

4242
#[async_trait::async_trait]
4343
impl ResourcesManagement for SelfManagedResourcesManagement {
44+
fn support_forward_warehouse_request(&self) -> bool {
45+
false
46+
}
47+
4448
async fn init_node(&self, node: &mut NodeInfo) -> Result<()> {
4549
let config = GlobalConfig::instance();
4650
node.cluster_id = config.query.cluster_id.clone();

src/query/ee/src/resource_management/resources_management_system.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ impl SystemResourcesManagement {
3838

3939
#[async_trait::async_trait]
4040
impl ResourcesManagement for SystemResourcesManagement {
41+
fn support_forward_warehouse_request(&self) -> bool {
42+
true
43+
}
44+
4145
async fn init_node(&self, node: &mut NodeInfo) -> Result<()> {
4246
let config = GlobalConfig::instance();
4347
assert!(config.query.cluster_id.is_empty());

src/query/ee_features/resources_management/src/resources_management.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ use databend_common_meta_types::NodeType;
2626

2727
#[async_trait::async_trait]
2828
pub trait ResourcesManagement: Sync + Send + 'static {
29+
fn support_forward_warehouse_request(&self) -> bool;
30+
2931
async fn init_node(&self, node: &mut NodeInfo) -> Result<()>;
3032

3133
async fn create_warehouse(&self, name: String, nodes: Vec<SelectedNode>) -> Result<()>;
@@ -77,6 +79,10 @@ pub struct DummyResourcesManagement;
7779

7880
#[async_trait::async_trait]
7981
impl ResourcesManagement for DummyResourcesManagement {
82+
fn support_forward_warehouse_request(&self) -> bool {
83+
false
84+
}
85+
8086
async fn init_node(&self, node: &mut NodeInfo) -> Result<()> {
8187
let config = GlobalConfig::instance();
8288
node.cluster_id = config.query.cluster_id.clone();

src/query/service/src/servers/http/middleware/session.rs

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use std::collections::HashMap;
1616
use std::sync::Arc;
1717

18+
use databend_common_base::base::GlobalInstance;
1819
use databend_common_base::headers::HEADER_DEDUPLICATE_LABEL;
1920
use databend_common_base::headers::HEADER_NODE_ID;
2021
use databend_common_base::headers::HEADER_QUERY_ID;
@@ -30,6 +31,7 @@ use databend_common_exception::Result;
3031
use databend_common_meta_app::principal::user_token::TokenType;
3132
use databend_common_meta_app::tenant::Tenant;
3233
use databend_common_meta_types::NodeInfo;
34+
use databend_enterprise_resources_management::ResourcesManagement;
3335
use fastrace::func_name;
3436
use headers::authorization::Basic;
3537
use headers::authorization::Bearer;
@@ -537,46 +539,54 @@ impl<E: Endpoint> Endpoint for HTTPSessionEndpoint<E> {
537539
};
538540
}
539541
} else if let Some(warehouse) = headers.get(HEADER_WAREHOUSE) {
540-
req.headers_mut().remove(HEADER_WAREHOUSE);
541-
542-
let warehouse = warehouse
543-
.to_str()
544-
.map_err(|e| {
545-
HttpErrorCode::bad_request(ErrorCode::BadArguments(format!(
546-
"Invalid Header ({HEADER_WAREHOUSE}: {warehouse:?}): {e}"
547-
)))
548-
})?
549-
.to_string();
550-
551-
let cluster_discovery = ClusterDiscovery::instance();
552-
553-
let forward_node = cluster_discovery.find_node_by_warehouse(&warehouse).await;
554-
555-
match forward_node {
556-
Err(error) => {
557-
return Err(HttpErrorCode::server_error(error).into());
558-
}
559-
Ok(None) => {
560-
let msg = format!("Not find the '{}' warehouse; it is possible that all nodes of the warehouse have gone offline. Please exit the client and reconnect, or use `use warehouse <new_warehouse>`", warehouse);
561-
warn!("{}", msg);
562-
return Err(Error::from(HttpErrorCode::bad_request(
563-
ErrorCode::UnknownWarehouse(msg),
564-
)));
565-
}
566-
Ok(Some(node)) => {
567-
let local_id = GlobalConfig::instance().query.node_id.clone();
568-
if node.id != local_id {
569-
log::info!(
570-
"forwarding /v1{} from {} to warehouse {}({})",
571-
req.uri(),
572-
local_id,
573-
warehouse,
574-
node.id
575-
);
576-
return forward_request(req, node).await;
542+
let resources_management = GlobalInstance::get::<Arc<dyn ResourcesManagement>>();
543+
if resources_management.support_forward_warehouse_request() {
544+
req.headers_mut().remove(HEADER_WAREHOUSE);
545+
546+
let warehouse = warehouse
547+
.to_str()
548+
.map_err(|e| {
549+
HttpErrorCode::bad_request(ErrorCode::BadArguments(format!(
550+
"Invalid value for header ({HEADER_WAREHOUSE}: {warehouse:?}): {e}"
551+
)))
552+
})?
553+
.to_string();
554+
555+
let cluster_discovery = ClusterDiscovery::instance();
556+
557+
let forward_node = cluster_discovery.find_node_by_warehouse(&warehouse).await;
558+
559+
match forward_node {
560+
Err(error) => {
561+
return Err(HttpErrorCode::server_error(
562+
error.add_message_back("(while in warehouse request forward)"),
563+
)
564+
.into());
565+
}
566+
Ok(None) => {
567+
let msg = format!("Not find the '{}' warehouse; it is possible that all nodes of the warehouse have gone offline. Please exit the client and reconnect, or use `use warehouse <new_warehouse>`", warehouse);
568+
warn!("{}", msg);
569+
return Err(Error::from(HttpErrorCode::bad_request(
570+
ErrorCode::UnknownWarehouse(msg),
571+
)));
572+
}
573+
Ok(Some(node)) => {
574+
let local_id = GlobalConfig::instance().query.node_id.clone();
575+
if node.id != local_id {
576+
log::info!(
577+
"forwarding /v1{} from {} to warehouse {}({})",
578+
req.uri(),
579+
local_id,
580+
warehouse,
581+
node.id
582+
);
583+
return forward_request(req, node).await;
584+
}
577585
}
578586
}
579587
}
588+
589+
log::warn!("Ignore header ({HEADER_WAREHOUSE}: {warehouse:?})");
580590
}
581591
}
582592

0 commit comments

Comments
 (0)