mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-11-10 22:08:48 +01:00
* vector: expose request metrics and registration-aware health endpoints * vector: report immutable read cache and storage fetch metrics * docs: describe vector engine health, metrics, and maintenance * vector: count canceled requests when their handler is dropped * vector: account for uncached large immutable storage reads * vector: reliably release the stalled credential reader in tests * vector: observe large reads as their streamed body is consumed * vector: bound heartbeats on established master registration streams * test: exercise hardened vector maintenance on Go and Rust volumes * vector: register engines in their configured filer group * vector: make retried index creation preserve compatible datasets * vector: allow registration to advertise a separate address * test: release stalled credential readers without blocking FIFO cleanup * test: allow hardened vector coverage in a named filer group * vector: discover engines in the same filer group as their gateway * vector: fall back when the advertised address is empty * admin: expose vector readiness, maintenance, and management tools (#12520) * s3vectors: share vector discovery with trusted management clients * admin: show vector engine readiness and recent maintenance activity * admin: suggest S3 Vectors IAM actions from the supported operations * admin: manage vector indexes, policies, tags, encryption, and query data * admin: validate SSE-S3 support before creating encrypted vector buckets * admin: discover vector engines in their registration group * admin: probe vector engines concurrently with independent time budgets * admin: verify encryption capability on the remote S3 gateway * admin: defer discovery until after the HTTP server can start * admin: distinguish unknown vector health services from failed engines * admin: count workers that can execute vector index maintenance * admin: allow read-only users to query vectors and inspect tags * vector: scope gateway and admin discovery to the configured filer group * admin: refresh policy state after mutations and serialize policy controls * vector: drain active RPCs before closing replaced discovery connections * vector: respect request cancellation while waiting for discovery * vector: prefer another registered engine after a transport failure * admin: check all masters before reporting no registered vector engines * iam: honor attached vector policies without broadening legacy grants * vector: allow short-lived discovery clients to close their connections * vector: refresh cached master addresses for each discovery lookup * iam: enforce vector bucket tag conditions in attached policies * iam: authorize vector bucket creation with the requested tags * test: exercise vector IAM grants and tag denies on Go and Rust volumes * admin: reject authenticated vector mutations without an admin role * test: run vector IAM assertions before the shared engine is stopped * vector: add native mini startup, shell tools, and a runnable Compose example (#12522) * s3vectors: share vector discovery with trusted management clients * admin: show vector engine readiness and recent maintenance activity * admin: suggest S3 Vectors IAM actions from the supported operations * admin: manage vector indexes, policies, tags, encryption, and query data * admin: validate SSE-S3 support before creating encrypted vector buckets * admin: discover vector engines in their registration group * admin: probe vector engines concurrently with independent time budgets * admin: verify encryption capability on the remote S3 gateway * admin: defer discovery until after the HTTP server can start * admin: distinguish unknown vector health services from failed engines * admin: count workers that can execute vector index maintenance * admin: allow read-only users to query vectors and inspect tags * vector: scope gateway and admin discovery to the configured filer group * admin: refresh policy state after mutations and serialize policy controls * vector: drain active RPCs before closing replaced discovery connections * vector: respect request cancellation while waiting for discovery * vector: prefer another registered engine after a transport failure * admin: check all masters before reporting no registered vector engines * iam: honor attached vector policies without broadening legacy grants * vector: allow short-lived discovery clients to close their connections * vector: refresh cached master addresses for each discovery lookup * iam: enforce vector bucket tag conditions in attached policies * iam: authorize vector bucket creation with the requested tags * test: exercise vector IAM grants and tag denies on Go and Rust volumes * admin: reject authenticated vector mutations without an admin role * test: run vector IAM assertions before the shared engine is stopped * mini: optionally start and supervise the vector engine * mini: bootstrap vector buckets with existing Lance catalog helpers * shell: manage vector buckets, indexes, and vector data * docs: provide a runnable vector and maintenance worker Compose stack * shell: scope vector discovery to the session and close its connections * mini: honor the bind address for vector and metrics listeners * mini: reserve vector ports before assigning gRPC and compatibility listeners * mini: wait for vector storage setup and master registration * mini: create requested vector buckets without requiring the Lance HTTP listener * shell: refresh master addresses during vector discovery * mini: resolve sibling vector executables with platform extensions * vector: preserve uncertain creates and fix mini listener allocation (#12525) * vector: retain catalog records when index creation has an unknown outcome * mini: keep chosen listener ports reserved throughout allocation * mini: resolve hostname binds before starting vector listeners * vector: fix integration test imports and recover interrupted index creation (#12533) * shell: register vector operations from the command package * s3vectors: resume interrupted index initialization safely * mini: exclude disabled WebDAV from listener allocation * s3vectors: retain uncertain creates across refused retries * s3vectors: claim pending indexes before retrying initialization * s3vectors: compare resolved distance metrics during recovery * s3vectors: preserve metadata keys when retrying initialization * s3vectors: verify ownership before initializing new catalog records
123 lines
4.1 KiB
Rust
123 lines
4.1 KiB
Rust
use crate::metrics::Metrics;
|
|
use crate::pb::vector::{self as pb, vector_service_server::VectorService};
|
|
use crate::service::VectorServer;
|
|
use tonic::{Request, Response, Status};
|
|
|
|
pub struct ObservedService {
|
|
pub inner: VectorServer,
|
|
pub metrics: Metrics,
|
|
}
|
|
|
|
#[tonic::async_trait]
|
|
impl VectorService for ObservedService {
|
|
async fn create_index(
|
|
&self,
|
|
request: Request<pb::CreateIndexRequest>,
|
|
) -> Result<Response<pb::CreateIndexResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("CreateIndex");
|
|
let result = self.inner.create_index(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn drop_index(
|
|
&self,
|
|
request: Request<pb::DropIndexRequest>,
|
|
) -> Result<Response<pb::DropIndexResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("DropIndex");
|
|
let result = self.inner.drop_index(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn put_vectors(
|
|
&self,
|
|
request: Request<pb::PutVectorsRequest>,
|
|
) -> Result<Response<pb::PutVectorsResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("PutVectors");
|
|
let result = self.inner.put_vectors(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn get_vectors(
|
|
&self,
|
|
request: Request<pb::GetVectorsRequest>,
|
|
) -> Result<Response<pb::GetVectorsResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("GetVectors");
|
|
let result = self.inner.get_vectors(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn delete_vectors(
|
|
&self,
|
|
request: Request<pb::DeleteVectorsRequest>,
|
|
) -> Result<Response<pb::DeleteVectorsResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("DeleteVectors");
|
|
let result = self.inner.delete_vectors(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn list_vectors(
|
|
&self,
|
|
request: Request<pb::ListVectorsRequest>,
|
|
) -> Result<Response<pb::ListVectorsResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("ListVectors");
|
|
let result = self.inner.list_vectors(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
result
|
|
}
|
|
async fn query_vectors(
|
|
&self,
|
|
request: Request<pb::QueryVectorsRequest>,
|
|
) -> Result<Response<pb::QueryVectorsResponse>, Status> {
|
|
let mut in_flight = self.metrics.start("QueryVectors");
|
|
let result = self.inner.query_vectors(request).await;
|
|
in_flight.complete(result.as_ref().err().map(|e| e.code()));
|
|
if let Ok(response) = &result {
|
|
self.metrics
|
|
.query_results
|
|
.inc_by(response.get_ref().vectors.len() as u64);
|
|
}
|
|
result
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[tokio::test]
|
|
async fn failures_are_counted_and_release_in_flight_requests() {
|
|
let service = ObservedService {
|
|
inner: VectorServer::new(),
|
|
metrics: Metrics::new().unwrap(),
|
|
};
|
|
let response = service
|
|
.query_vectors(Request::new(pb::QueryVectorsRequest::default()))
|
|
.await;
|
|
let code = format!("{:?}", response.unwrap_err().code());
|
|
assert_eq!(
|
|
service
|
|
.metrics
|
|
.requests
|
|
.with_label_values(&["QueryVectors", &code])
|
|
.get(),
|
|
1
|
|
);
|
|
assert_eq!(
|
|
service
|
|
.metrics
|
|
.in_flight
|
|
.with_label_values(&["QueryVectors"])
|
|
.get(),
|
|
0
|
|
);
|
|
assert_eq!(
|
|
service
|
|
.metrics
|
|
.request_seconds
|
|
.with_label_values(&["QueryVectors"])
|
|
.get_sample_count(),
|
|
1
|
|
);
|
|
}
|
|
}
|