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
108 lines
3.4 KiB
Go
108 lines
3.4 KiB
Go
package dash
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
"time"
|
|
|
|
adminplugin "github.com/seaweedfs/seaweedfs/weed/admin/plugin"
|
|
"github.com/seaweedfs/seaweedfs/weed/cluster"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
|
|
"golang.org/x/sync/errgroup"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/health/grpc_health_v1"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
type VectorNode struct {
|
|
Address string `json:"address"`
|
|
Version string `json:"version"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type VectorOperationsData struct {
|
|
Engines []VectorNode `json:"engines"`
|
|
DiscoveryError string `json:"discovery_error,omitempty"`
|
|
MaintenanceWorkers int `json:"maintenance_workers"`
|
|
MaintenanceJobs []adminplugin.TrackedJob `json:"maintenance_jobs"`
|
|
}
|
|
|
|
func (s *AdminServer) getVectorNodesStatus(ctx context.Context) VectorOperationsData {
|
|
data := VectorOperationsData{Engines: []VectorNode{}}
|
|
if s.masterClient == nil {
|
|
data.DiscoveryError = "Master discovery unavailable"
|
|
return data
|
|
}
|
|
var discoveryErr error
|
|
for _, master := range s.masterClient.ListCachedMasters() {
|
|
discoveryCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
conn, err := pb.GrpcDial(discoveryCtx, master.ToGrpcAddress(), false, s.grpcDialOption)
|
|
if err == nil {
|
|
response, callErr := master_pb.NewSeaweedClient(conn).ListClusterNodes(discoveryCtx, s.listClusterNodesRequest(cluster.VectorType))
|
|
_ = conn.Close()
|
|
err = callErr
|
|
if err == nil {
|
|
for _, node := range response.ClusterNodes {
|
|
data.Engines = append(data.Engines, VectorNode{Address: node.Address, Version: node.Version, Status: "Registered"})
|
|
}
|
|
}
|
|
}
|
|
cancel()
|
|
if err != nil {
|
|
discoveryErr = err
|
|
}
|
|
if len(data.Engines) > 0 {
|
|
break
|
|
}
|
|
}
|
|
if len(data.Engines) == 0 && discoveryErr != nil {
|
|
data.DiscoveryError = discoveryErr.Error()
|
|
return data
|
|
}
|
|
var checks errgroup.Group
|
|
checks.SetLimit(8)
|
|
for i := range data.Engines {
|
|
checks.Go(func() error {
|
|
data.Engines[i].Status = vectorNodeStatus(ctx, data.Engines[i].Address, s.grpcDialOption)
|
|
return nil
|
|
})
|
|
}
|
|
_ = checks.Wait()
|
|
sort.Slice(data.Engines, func(i, j int) bool { return data.Engines[i].Address < data.Engines[j].Address })
|
|
return data
|
|
}
|
|
|
|
func vectorNodeStatus(ctx context.Context, address string, dialOption grpc.DialOption) string {
|
|
ctx, cancel := context.WithTimeout(ctx, time.Second)
|
|
defer cancel()
|
|
conn, err := pb.GrpcDial(ctx, address, false, dialOption)
|
|
if err != nil {
|
|
return "Unreachable"
|
|
}
|
|
defer conn.Close()
|
|
response, err := grpc_health_v1.NewHealthClient(conn).Check(ctx, &grpc_health_v1.HealthCheckRequest{Service: "vector_pb.VectorService"})
|
|
if status.Code(err) == codes.Unimplemented || status.Code(err) == codes.NotFound {
|
|
return "Registered (health unavailable)"
|
|
}
|
|
if err != nil {
|
|
return "Unreachable"
|
|
}
|
|
if response.Status == grpc_health_v1.HealthCheckResponse_SERVING {
|
|
return "Ready"
|
|
}
|
|
return "Not ready"
|
|
}
|
|
|
|
func (s *AdminServer) GetVectorOperationsData(ctx context.Context) VectorOperationsData {
|
|
data := s.getVectorNodesStatus(ctx)
|
|
for _, worker := range s.GetPluginWorkers() {
|
|
if capability := worker.Capabilities["lance_vector_index"]; capability != nil && capability.CanExecute {
|
|
data.MaintenanceWorkers++
|
|
}
|
|
}
|
|
data.MaintenanceJobs = s.ListPluginJobs("lance_vector_index", "", 5)
|
|
return data
|
|
}
|