use std::sync::Arc;
use query_planning::error::Result;
#[cfg(any(test, feature = "test-hooks"))]
use crate::runtime::query_service::admission::QueryAdmissionWaiter;
use crate::runtime::{
backend_core::{GpuResourcePermit, ObservationCompletionDispatcher},
backend_lifecycle::ObservationPermit,
query_service::{
handle::QueryHandle,
service::{QueryService, api::QueryAdmissionRequest, transaction::AdmissionTransactionProbe},
},
};
impl QueryService {
#[cfg(test)]
pub(crate) fn admit_query(&self) -> Result<QueryHandle> {
self.admit_query_with_request(QueryAdmissionRequest::test_attempt())
}
#[cfg(any(test, feature = "test-hooks"))]
pub fn admit_query_with_request(&self, request: QueryAdmissionRequest) -> Result<QueryHandle> {
self.enqueue_admission_with_request_and_permits(request, None, None, None, None)?.admit_blocking()
}
#[cfg(test)]
pub(in crate::runtime::query_service) fn admit_query_with_probe(
&self,
request: QueryAdmissionRequest,
probe: Arc<AdmissionTransactionProbe>,
) -> Result<QueryHandle> {
self.enqueue_admission_with_request_and_permits(request, None, None, None, Some(probe))?.admit_blocking()
}
#[cfg(any(test, feature = "test-hooks"))]
pub(crate) fn admit_query_with_backend_permits(
&self,
request: QueryAdmissionRequest,
observation_permit: ObservationPermit,
gpu_resource_permit: GpuResourcePermit,
completion_dispatcher: ObservationCompletionDispatcher,
) -> Result<QueryHandle> {
self.enqueue_admission_with_request_and_permits(
request,
Some(observation_permit),
Some(gpu_resource_permit),
Some(completion_dispatcher),
None,
)?
.admit_blocking()
}
#[cfg(test)]
pub(crate) fn enqueue_admission(&self) -> Result<QueryAdmissionWaiter> {
self.enqueue_admission_with_request(QueryAdmissionRequest::test_attempt())
}
#[cfg(test)]
pub(crate) async fn admit_async(&self) -> Result<QueryHandle> {
self.admit_async_with_request(QueryAdmissionRequest::test_attempt()).await
}
#[cfg(test)]
pub(crate) async fn admit_async_with_request(&self, request: QueryAdmissionRequest) -> Result<QueryHandle> {
self.admit_async_with_request_and_permits(request, None, None, None, None).await
}
#[cfg(test)]
pub(in crate::runtime::query_service) async fn admit_async_with_probe(
&self,
request: QueryAdmissionRequest,
probe: Arc<AdmissionTransactionProbe>,
) -> Result<QueryHandle> {
self.admit_async_with_request_and_permits(request, None, None, None, Some(probe)).await
}
pub(crate) async fn admit_async_with_backend_permits(
&self,
request: QueryAdmissionRequest,
observation_permit: ObservationPermit,
gpu_resource_permit: GpuResourcePermit,
completion_dispatcher: ObservationCompletionDispatcher,
) -> Result<QueryHandle> {
self.admit_async_with_request_and_permits(
request,
Some(observation_permit),
Some(gpu_resource_permit),
Some(completion_dispatcher),
None,
)
.await
}
async fn admit_async_with_request_and_permits(
&self,
request: QueryAdmissionRequest,
observation_permit: Option<ObservationPermit>,
gpu_resource_permit: Option<GpuResourcePermit>,
completion_dispatcher: Option<ObservationCompletionDispatcher>,
probe: Option<Arc<AdmissionTransactionProbe>>,
) -> Result<QueryHandle> {
#[cfg(any(test, feature = "test-hooks"))]
let (request, test_attempt) = request.split_test_attempt();
let mut waiter =
self.inner.admission.enqueue(request, observation_permit, gpu_resource_permit, completion_dispatcher)?;
let placed = waiter.place_async().await?;
let handle = self.commit_placed_admission_async(placed, probe).await?;
#[cfg(any(test, feature = "test-hooks"))]
handle.own_test_attempt(test_attempt);
Ok(handle)
}
#[cfg(test)]
pub(crate) fn enqueue_admission_with_request(
&self,
request: QueryAdmissionRequest,
) -> Result<QueryAdmissionWaiter> {
self.enqueue_admission_with_request_and_permits(request, None, None, None, None)
}
#[cfg(any(test, feature = "test-hooks"))]
pub(crate) fn enqueue_admission_with_backend_permits(
&self,
request: QueryAdmissionRequest,
observation_permit: ObservationPermit,
gpu_resource_permit: GpuResourcePermit,
completion_dispatcher: ObservationCompletionDispatcher,
) -> Result<QueryAdmissionWaiter> {
self.enqueue_admission_with_request_and_permits(
request,
Some(observation_permit),
Some(gpu_resource_permit),
Some(completion_dispatcher),
None,
)
}
#[cfg(any(test, feature = "test-hooks"))]
fn enqueue_admission_with_request_and_permits(
&self,
request: QueryAdmissionRequest,
observation_permit: Option<ObservationPermit>,
gpu_resource_permit: Option<GpuResourcePermit>,
completion_dispatcher: Option<ObservationCompletionDispatcher>,
probe: Option<Arc<AdmissionTransactionProbe>>,
) -> Result<QueryAdmissionWaiter> {
let (request, test_attempt) = request.split_test_attempt();
let waiter =
self.inner.admission.enqueue(request, observation_permit, gpu_resource_permit, completion_dispatcher)?;
Ok(QueryAdmissionWaiter { service: self.clone(), waiter, test_attempt, probe })
}
}