Fixed a runtime panic in SessionManager::update_metrics() caused by
calling blocking_read() within an async context. Changed to use
try_read() to avoid blocking the tokio runtime.
Verified all P2.1 acceptance criteria:
- GET /health returns 200 immediately (Meilisearch-compatible)
- GET /_miroir/ready returns 503 until covering quorum exists
- GET /_miroir/topology returns plan §10 JSON shape
- Two listeners: :7700 (client API) and :9090 (metrics)
- SIGTERM triggers graceful shutdown with request draining
All endpoints already implemented:
- /health (unauthenticated liveness probe)
- /version (Meilisearch version from healthy node)
- /_miroir/ready (readiness probe)
- /_miroir/topology (cluster state)
- /_miroir/shards (shard→node mapping)
- /_miroir/metrics (admin-key-gated Prometheus metrics)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Redis TaskStore implementation in crates/miroir-core/src/task_store/redis.rs
was already complete. This commit updates the beads tracking files to reflect
that the work was done in a previous iteration.
The Redis backend implements all 14 tables from plan §4:
- tasks, node_settings_version, aliases, sessions, idempotency_cache
- jobs, leader_lease, canaries, canary_runs, cdc_cursors
- tenant_map, rollover_policies, search_ui_config, admin_sessions
Plus extras from plan §4 footnotes:
- search_ui_scoped_key with observation tracking
- rate limiting for searchui and adminlogin
- CDC overflow buffer with bounded byte budget
- Pub/Sub for admin session revocation
Acceptance tests included:
- test_redis_lease_race: verifies exactly one pod wins
- test_redis_memory_budget: 10k tasks + 1k sessions + 1k idempotency
- test_redis_pubsub_session_invalidation: <100ms propagation
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Load Config (file + env + CLI args overlay) via MiroirConfig::load()
- Initialize tracing with JSON-to-stdout format (plan §10)
- Start two axum listeners: :7700 (client API) + :9090 (metrics, unauthenticated)
- Signal handlers for graceful shutdown (SIGTERM → drain → exit)
- GET /health returns {"status":"available"} immediately (Meilisearch-compatible)
- GET /version returns Meilisearch version from healthy node (60s TTL cache)
- GET /_miroir/ready returns 503 during startup, 200 once covering quorum reachable
- GET /_miroir/topology returns cluster state per plan §10 JSON shape
- GET /_miroir/shards returns shard → node mapping table
- GET /_miroir/metrics returns admin-key-gated Prometheus metrics
- Background health checker promotes nodes to Active when reachable
- UnifiedState bundles AuthState, Metrics, and admin_endpoints::AppState
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>