From 16b877be6be486d982111ed3979c36c675ab0a76 Mon Sep 17 00:00:00 2001 From: Chris Dinh Date: Fri, 3 May 2024 14:28:19 -0700 Subject: [PATCH] Add stub handler for Suffix query Summary: This Diff implements a stub handler for handling suffix queries on EdenAPI. The stub handler only returns a static message. It will be implemented in a followup diff Reviewed By: liubov-dmitrieva Differential Revision: D56275449 fbshipit-source-id: 3234d7d1fe48744bde3e0c4c7eead75cbd482075 --- eden/mononoke/edenapi_service/src/handlers.rs | 4 ++ .../src/handlers/suffix_query.rs | 52 +++++++++++++++++++ .../edenapi_service/src/middleware/ods.rs | 2 + .../integration/test-edenapi-suffixquery.t | 27 ++++++++++ 4 files changed, 85 insertions(+) create mode 100644 eden/mononoke/edenapi_service/src/handlers/suffix_query.rs create mode 100644 eden/mononoke/tests/integration/test-edenapi-suffixquery.t diff --git a/eden/mononoke/edenapi_service/src/handlers.rs b/eden/mononoke/edenapi_service/src/handlers.rs index 32b7be0269..4c710891d0 100644 --- a/eden/mononoke/edenapi_service/src/handlers.rs +++ b/eden/mononoke/edenapi_service/src/handlers.rs @@ -73,6 +73,7 @@ mod land; mod lookup; mod pull; mod repos; +mod suffix_query; mod trees; pub(crate) use handler::EdenApiHandler; pub(crate) use handler::HandlerResult; @@ -86,6 +87,7 @@ const REPORTING_LOOP_WAIT: u64 = 5; /// Used to identify the handler for logging and stats collection. #[derive(Copy, Clone)] pub enum EdenApiMethod { + SuffixQuery, Blame, Capabilities, Files2, @@ -123,6 +125,7 @@ pub enum EdenApiMethod { impl fmt::Display for EdenApiMethod { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let name = match self { + Self::SuffixQuery => "suffix_query", Self::Blame => "blame", Self::Capabilities => "capabilities", Self::Files2 => "files2", @@ -443,6 +446,7 @@ pub fn build_router(ctx: ServerContext) -> Router { Handlers::setup::(route); Handlers::setup::(route); Handlers::setup::(route); + Handlers::setup::(route); route.get("/:repo/health_check").to(health_handler); route .get("/:repo/capabilities") diff --git a/eden/mononoke/edenapi_service/src/handlers/suffix_query.rs b/eden/mononoke/edenapi_service/src/handlers/suffix_query.rs new file mode 100644 index 0000000000..2b1a6fe00e --- /dev/null +++ b/eden/mononoke/edenapi_service/src/handlers/suffix_query.rs @@ -0,0 +1,52 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This software may be used and distributed according to the terms of the + * GNU General Public License version 2. + */ + +use std::num::NonZeroU64; + +use async_trait::async_trait; +use edenapi_types::SuffixQueryRequest; +use edenapi_types::SuffixQueryResponse; +use futures::stream; +use futures::StreamExt; +use types::RepoPathBuf; + +use super::handler::EdenApiContext; +use super::EdenApiHandler; +use super::EdenApiMethod; +use super::HandlerResult; + +pub struct SuffixQueryHandler; + +#[async_trait] +impl EdenApiHandler for SuffixQueryHandler { + type Request = SuffixQueryRequest; + type Response = SuffixQueryResponse; + + const HTTP_METHOD: hyper::Method = hyper::Method::POST; + const API_METHOD: EdenApiMethod = EdenApiMethod::SuffixQuery; + const ENDPOINT: &'static str = "/suffix_query"; + + fn sampling_rate(_request: &Self::Request) -> NonZeroU64 { + nonzero_ext::nonzero!(100u64) + } + + async fn handler( + _ectx: EdenApiContext, + _request: Self::Request, + ) -> HandlerResult<'async_trait, Self::Response> { + // Stub function + let result = vec![ + Ok(SuffixQueryResponse { + file_path: RepoPathBuf::new(), + }), + Ok(SuffixQueryResponse { + file_path: RepoPathBuf::new(), + }), + ]; + Ok(stream::iter(result).boxed()) + } +} diff --git a/eden/mononoke/edenapi_service/src/middleware/ods.rs b/eden/mononoke/edenapi_service/src/middleware/ods.rs index 6262ee3490..d821729d28 100644 --- a/eden/mononoke/edenapi_service/src/middleware/ods.rs +++ b/eden/mononoke/edenapi_service/src/middleware/ods.rs @@ -28,6 +28,7 @@ define_stats! { failure_4xx: dynamic_timeseries("{}.failure_4xx", (method: String); Rate, Sum), failure_5xx: dynamic_timeseries("{}.failure_5xx", (method: String); Rate, Sum), response_bytes_sent: dynamic_histogram("{}.response_bytes_sent", (method: String); 1_500_000, 0, 150_000_000, Average, Sum, Count; P 50; P 75; P 95; P 99), + suffix_query_duration_ms: histogram(100, 0, 5000, Average, Sum, Count; P 50; P 75; P 95; P 99), blame_duration_ms: histogram(100, 0, 5000, Average, Sum, Count; P 50; P 75; P 95; P 99), capabilities_duration_ms: histogram(100, 0, 5000, Average, Sum, Count; P 50; P 75; P 95; P 99), files2_duration_ms: histogram(100, 0, 5000, Average, Sum, Count; P 50; P 75; P 95; P 99), @@ -91,6 +92,7 @@ fn log_stats(state: &mut State, status: StatusCode) -> Option<()> { } CloudReferences => STATS::cloud_references_duration_ms.add_value(dur_ms), CloudWorkspace => STATS::cloud_workspace_duration_ms.add_value(dur_ms), + SuffixQuery => STATS::suffix_query_duration_ms.add_value(dur_ms), Blame => STATS::blame_duration_ms.add_value(dur_ms), Capabilities => STATS::capabilities_duration_ms.add_value(dur_ms), Files2 => STATS::files2_duration_ms.add_value(dur_ms), diff --git a/eden/mononoke/tests/integration/test-edenapi-suffixquery.t b/eden/mononoke/tests/integration/test-edenapi-suffixquery.t new file mode 100644 index 0000000000..41f5536793 --- /dev/null +++ b/eden/mononoke/tests/integration/test-edenapi-suffixquery.t @@ -0,0 +1,27 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This software may be used and distributed according to the terms of the +# GNU General Public License found in the LICENSE file in the root +# directory of this source tree. + + $ . "${TEST_FIXTURES}/library.sh" + $ setup_common_config + $ setconfig experimental.edenapi-suffixquery=true + + $ start_and_wait_for_mononoke_server + $ hgmn_init repo + $ cd repo + $ drawdag << EOS + > D # D/bar = zero\nuno\ntwo\n + > | + > C # C/bar = zero\none\ntwo\n (renamed from foo) + > | + > B # B/foo = one\ntwo\n + > | + > A # A/foo = one\n + > EOS + +Test suffix query output: + $ hgedenapi debugapi -e suffix_query -i "{'Hg': 'e9ace545f925b6f62ae34087895fdc950d168e5f'}" -i "['.txt']" + [{"file_path": ""}, + {"file_path": ""}]