Skip to content

Commit

Permalink
box warp routes
Browse files Browse the repository at this point in the history
box warp routes to avoid super heavy types.
Performance impact should be okay, since these heavy types
are not cache friendly.

This reduces type complexity significantly, but some really long type chains remain.

I've identified two, but they may be more
1. Boxed or chains
2. Response type chains

We can replace the boxed or chains with a Vec, since they all contain the same
box type now. Such a type doesn't seem to exist in warp yet.

`cargo install --path .`
Compile time before
4m49s
Compile time now
4m14s

Tool to list heavy functions:
`
CARGO_PROFILE_RELEASE_LTO=fat cargo llvm-lines --release --bin quickwit > llvm_lines
`
Size down from 32MB to 22MB

addresses #5539
  • Loading branch information
PSeitz committed Nov 5, 2024
1 parent ee362fc commit 7f76b61
Show file tree
Hide file tree
Showing 16 changed files with 73 additions and 24 deletions.
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/cluster_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ pub fn cluster_handler(
.and(extract_format_from_qs())
.map(into_rest_api_response)
.recover(recover_fn)
.boxed()
}

#[utoipa::path(
Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/delete_task_api/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ pub fn delete_task_api_handlers(
get_delete_tasks_handler(metastore.clone())
.or(post_delete_tasks_handler(metastore.clone()))
.recover(recover_fn)
.boxed()
}

pub fn get_delete_tasks_handler(
Expand Down
2 changes: 1 addition & 1 deletion quickwit/quickwit-serve/src/developer_api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ pub(crate) fn developer_api_routes(
warp::path!("api" / "developer" / ..)
.and(
debug_handler(cluster.clone())
.or(log_level_handler(env_filter_reload_fn.clone()))
.or(log_level_handler(env_filter_reload_fn.clone()).boxed())
.or(pprof_handlers()),
)
.recover(recover_fn)
Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/elasticsearch_api/bulk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ pub fn es_compat_index_bulk_handler(
.and(extract_format_from_qs())
.map(make_elastic_api_response)
.recover(recover_fn)
.boxed()
}

async fn elastic_ingest_bulk(
Expand Down
3 changes: 3 additions & 0 deletions quickwit/quickwit-serve/src/elasticsearch_api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ pub fn elastic_api_handlers(
ingest_service.clone(),
ingest_router.clone(),
))
.boxed()
.or(es_compat_index_bulk_handler(ingest_service, ingest_router))
.or(es_compat_index_search_handler(search_service.clone()))
.or(es_compat_index_count_handler(search_service.clone()))
Expand All @@ -75,13 +76,15 @@ pub fn elastic_api_handlers(
.or(es_compat_index_field_capabilities_handler(
search_service.clone(),
))
.boxed()
.or(es_compat_index_stats_handler(metastore.clone()))
.or(es_compat_delete_index_handler(index_service))
.or(es_compat_stats_handler(metastore.clone()))
.or(es_compat_index_cat_indices_handler(metastore.clone()))
.or(es_compat_cat_indices_handler(metastore.clone()))
.or(es_compat_resolve_index_handler(metastore.clone()))
.recover(recover_fn)
.boxed()
// Register newly created handlers here.
}

Expand Down
11 changes: 11 additions & 0 deletions quickwit/quickwit-serve/src/elasticsearch_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ pub fn es_compat_cluster_info_handler(
}))
},
)
.boxed()
}

/// GET or POST _elastic/_search
Expand Down Expand Up @@ -135,6 +136,7 @@ pub fn es_compat_delete_index_handler(
.and(with_arg(index_service))
.then(es_compat_delete_index)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.boxed()
}

/// GET _elastic/_stats
Expand All @@ -146,6 +148,7 @@ pub fn es_compat_stats_handler(
.then(es_compat_stats)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// GET _elastic/{index}/_stats
Expand All @@ -157,6 +160,7 @@ pub fn es_compat_index_stats_handler(
.then(es_compat_index_stats)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// GET _elastic/_cat/indices
Expand All @@ -168,6 +172,7 @@ pub fn es_compat_cat_indices_handler(
.then(es_compat_cat_indices)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// GET _elastic/_cat/indices/{index}
Expand All @@ -179,6 +184,7 @@ pub fn es_compat_index_cat_indices_handler(
.then(es_compat_index_cat_indices)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// GET _elastic/_resolve/index/{index}
Expand All @@ -189,6 +195,7 @@ pub fn es_compat_resolve_index_handler(
.and(with_arg(metastore_service))
.then(es_compat_resolve_index)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.boxed()
}

/// GET or POST _elastic/{index}/_search
Expand All @@ -200,6 +207,7 @@ pub fn es_compat_index_search_handler(
.then(es_compat_index_search)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// GET or POST _elastic/{index}/_count
Expand All @@ -211,6 +219,7 @@ pub fn es_compat_index_count_handler(
.then(es_compat_index_count)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

/// POST _elastic/_msearch
Expand All @@ -228,6 +237,7 @@ pub fn es_compat_index_multi_search_handler(
RestApiResponse::new(&result, status_code, BodyFormat::default())
})
.recover(recover_fn)
.boxed()
}

/// GET or POST _elastic/_search/scroll
Expand All @@ -239,6 +249,7 @@ pub fn es_compat_scroll_handler(
.then(es_scroll)
.map(|result| make_elastic_api_response(result, BodyFormat::default()))
.recover(recover_fn)
.boxed()
}

fn build_request_for_es_api(
Expand Down
34 changes: 18 additions & 16 deletions quickwit/quickwit-serve/src/index_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,27 +90,29 @@ pub fn index_management_handlers(
) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
// Indexes handlers.
get_index_metadata_handler(index_service.metastore())
.or(list_indexes_metadata_handler(index_service.metastore()))
.or(create_index_handler(index_service.clone(), node_config))
.or(update_index_handler(index_service.metastore()))
.or(clear_index_handler(index_service.clone()))
.or(delete_index_handler(index_service.clone()))
.boxed()
.or(list_indexes_metadata_handler(index_service.metastore()).boxed())
.or(create_index_handler(index_service.clone(), node_config).boxed())
.or(update_index_handler(index_service.metastore()).boxed())
.or(clear_index_handler(index_service.clone()).boxed())
.or(delete_index_handler(index_service.clone()).boxed())
// Splits handlers
.or(list_splits_handler(index_service.metastore()))
.or(describe_index_handler(index_service.metastore()))
.or(mark_splits_for_deletion_handler(index_service.metastore()))
.or(list_splits_handler(index_service.metastore()).boxed())
.or(describe_index_handler(index_service.metastore()).boxed())
.or(mark_splits_for_deletion_handler(index_service.metastore()).boxed())
// Sources handlers.
.or(reset_source_checkpoint_handler(index_service.metastore()))
.or(toggle_source_handler(index_service.metastore()))
.or(create_source_handler(index_service.clone()))
.or(get_source_handler(index_service.metastore()))
.or(delete_source_handler(index_service.metastore()))
.or(get_source_shards_handler(index_service.metastore()))
.or(reset_source_checkpoint_handler(index_service.metastore()).boxed())
.or(toggle_source_handler(index_service.metastore()).boxed())
.or(create_source_handler(index_service.clone()).boxed())
.or(get_source_handler(index_service.metastore()).boxed())
.or(delete_source_handler(index_service.metastore()).boxed())
.or(get_source_shards_handler(index_service.metastore()).boxed())
// Tokenizer handlers.
.or(analyze_request_handler())
.or(analyze_request_handler().boxed())
// Parse query into query AST handler.
.or(parse_query_request_handler())
.or(parse_query_request_handler().boxed())
.recover(recover_fn)
.boxed()
}

fn json_body<T: DeserializeOwned + Send>(
Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/indexing_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,5 @@ pub fn indexing_get_handler(
.and(extract_format_from_qs())
.map(into_rest_api_response)
.recover(recover_fn)
.boxed()
}
4 changes: 4 additions & 0 deletions quickwit/quickwit-serve/src/ingest_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ pub(crate) fn ingest_api_handlers(
ingest_handler(ingest_service.clone(), config.clone())
.or(tail_handler(ingest_service))
.or(ingest_v2_handler(ingest_router, config))
.boxed()
}

fn ingest_filter(
Expand All @@ -96,6 +97,7 @@ fn ingest_handler(
.and(with_arg(ingest_service))
.then(ingest)
.map(|result| into_rest_api_response(result, BodyFormat::default()))
.boxed()
}

fn ingest_v2_filter(
Expand All @@ -121,6 +123,7 @@ fn ingest_v2_handler(
.then(ingest_v2)
.and(with_arg(BodyFormat::default()))
.map(into_rest_api_response)
.boxed()
}

async fn ingest_v2(
Expand Down Expand Up @@ -223,6 +226,7 @@ pub fn tail_handler(
.then(tail_endpoint)
.and(extract_format_from_qs())
.map(into_rest_api_response)
.boxed()
}

fn tail_filter() -> impl Filter<Extract = (String,), Error = Rejection> + Clone {
Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/jaeger_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ pub(crate) fn jaeger_api_handlers(
.or(jaeger_traces_search_handler(jaeger_service_opt.clone()))
.or(jaeger_traces_handler(jaeger_service_opt.clone()))
.recover(recover_fn)
.boxed()
}

fn jaeger_api_path_filter() -> impl Filter<Extract = (Vec<String>,), Error = Rejection> + Clone {
Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/node_info_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub fn node_info_handler(
node_version_handler(build_info, runtime_info)
.or(node_config_handler(config))
.recover(recover_fn)
.boxed()
}

#[utoipa::path(get, tag = "Node Info", path = "/version")]
Expand Down
5 changes: 5 additions & 0 deletions quickwit/quickwit-serve/src/otlp_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ pub(crate) fn otlp_ingest_api_handlers(
.or(otlp_default_traces_handler(otlp_traces_service.clone()).recover(recover_fn))
.or(otlp_logs_handler(otlp_logs_service).recover(recover_fn))
.or(otlp_ingest_traces_handler(otlp_traces_service).recover(recover_fn))
.boxed()
}

/// Open Telemetry REST/Protobuf logs ingest endpoint.
Expand Down Expand Up @@ -91,6 +92,7 @@ pub(crate) fn otlp_default_logs_handler(
)
.and(with_arg(BodyFormat::default()))
.map(into_rest_api_response)
.boxed()
}
/// Open Telemetry REST/Protobuf logs ingest endpoint.
#[utoipa::path(
Expand All @@ -116,6 +118,7 @@ pub(crate) fn otlp_logs_handler(
.then(otlp_ingest_logs)
.and(with_arg(BodyFormat::default()))
.map(into_rest_api_response)
.boxed()
}

/// Open Telemetry REST/Protobuf traces ingest endpoint.
Expand Down Expand Up @@ -151,6 +154,7 @@ pub(crate) fn otlp_default_traces_handler(
)
.and(with_arg(BodyFormat::default()))
.map(into_rest_api_response)
.boxed()
}
/// Open Telemetry REST/Protobuf traces ingest endpoint.
#[utoipa::path(
Expand All @@ -176,6 +180,7 @@ pub(crate) fn otlp_ingest_traces_handler(
.then(otlp_ingest_traces)
.and(with_arg(BodyFormat::default()))
.map(into_rest_api_response)
.boxed()
}

#[derive(Debug, Clone, thiserror::Error, Serialize)]
Expand Down
28 changes: 22 additions & 6 deletions quickwit/quickwit-serve/src/rest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,33 +145,38 @@ pub(crate) async fn start_rest_server(
let api_doc = warp::path("openapi.json")
.and(warp::get())
.map(|| warp::reply::json(&crate::openapi::build_docs()))
.recover(recover_fn);
.recover(recover_fn)
.boxed();

// `/health/*` routes.
let health_check_routes = health_check_handlers(
quickwit_services.cluster.clone(),
quickwit_services.indexing_service_opt.clone(),
quickwit_services.janitor_service_opt.clone(),
);
)
.boxed();

// `/metrics` route.
let metrics_routes = warp::path("metrics")
.and(warp::get())
.map(metrics_handler)
.recover(recover_fn);
.recover(recover_fn)
.boxed();

// `/api/developer/*` route.
let developer_routes = developer_api_routes(
quickwit_services.cluster.clone(),
quickwit_services.env_filter_reload_fn.clone(),
);
)
.boxed();
// `/api/v1/*` routes.
let api_v1_root_route = api_v1_routes(quickwit_services.clone());

let redirect_root_to_ui_route = warp::path::end()
.and(warp::get())
.map(|| redirect(http::Uri::from_static("/ui/search")))
.recover(recover_fn);
.recover(recover_fn)
.boxed();

let extra_headers = warp::reply::with::headers(
quickwit_services
Expand Down Expand Up @@ -243,6 +248,7 @@ fn search_routes(
.or(search_plan_post_handler(search_service.clone()))
.or(search_stream_handler(search_service))
.recover(recover_fn)
.boxed()
}

fn api_v1_routes(
Expand All @@ -259,37 +265,47 @@ fn api_v1_routes(
quickwit_services.index_manager.clone(),
)
.or(cluster_handler(quickwit_services.cluster.clone()))
.boxed()
.or(node_info_handler(
BuildInfo::get(),
RuntimeInfo::get(),
quickwit_services.node_config.clone(),
))
.boxed()
.or(indexing_get_handler(
quickwit_services.indexing_service_opt.clone(),
))
.boxed()
.or(search_routes(quickwit_services.search_service.clone()))
.boxed()
.or(ingest_api_handlers(
quickwit_services.ingest_router_service.clone(),
quickwit_services.ingest_service.clone(),
quickwit_services.node_config.ingest_api_config.clone(),
))
.boxed()
.or(otlp_ingest_api_handlers(
quickwit_services.otlp_logs_service_opt.clone(),
quickwit_services.otlp_traces_service_opt.clone(),
))
.boxed()
.or(index_management_handlers(
quickwit_services.index_manager.clone(),
quickwit_services.node_config.clone(),
))
.boxed()
.or(delete_task_api_handlers(
quickwit_services.metastore_client.clone(),
))
.boxed()
.or(jaeger_api_handlers(
quickwit_services.jaeger_service_opt.clone(),
))
.boxed()
.or(index_template_api_handlers(
quickwit_services.metastore_client.clone(),
)),
))
.boxed(),
)
}

Expand Down
1 change: 1 addition & 0 deletions quickwit/quickwit-serve/src/template_api/rest_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ pub(crate) fn index_template_api_handlers(
.or(delete_index_template_handler(metastore.clone()))
.or(list_index_templates_handler(metastore.clone()))
.recover(recover_fn)
.boxed()
}

fn create_index_template_handler(
Expand Down
Loading

0 comments on commit 7f76b61

Please sign in to comment.