feat(httpapi): harden control plane and speed up prefix refresh
Очередь job получила lease и fencing, телеметрия и прогресс deploy сохраняются, ревизия пишет manifest входов. Обновление префиксов не переписывает неизменённый снимок, большие наборы идут через COPY, а устаревшая ревизия не попадает в deploy. Бандл ноды кэшируется, prune и постановка job больше не держат горячий путь. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
924f111e48
commit
f8e0520817
197 files changed
+18655
-1416
No files matched your search
@@ -0,0 +1,12 @@
|
||||
DROP INDEX IF EXISTS idx_job_audit_expired_lease;
|
||||
DROP INDEX IF EXISTS idx_job_audit_claim;
|
||||
ALTER TABLE job_audit DROP COLUMN request_sequence;
|
||||
ALTER TABLE job_audit DROP COLUMN cancel_requested;
|
||||
ALTER TABLE job_audit DROP COLUMN available_at;
|
||||
ALTER TABLE job_audit DROP COLUMN fencing_token;
|
||||
ALTER TABLE job_audit DROP COLUMN attempt;
|
||||
ALTER TABLE job_audit DROP COLUMN lease_until;
|
||||
ALTER TABLE job_audit DROP COLUMN owner_id;
|
||||
ALTER TABLE job_audit DROP COLUMN request_hash;
|
||||
ALTER TABLE job_audit DROP COLUMN request_json;
|
||||
DELETE FROM tenant WHERE id = '00000000-0000-0000-0000-000000000000' AND slug = 'evobgp-system-jobs';
|
||||
@@ -0,0 +1,14 @@
|
||||
ALTER TABLE job_audit ADD COLUMN request_hash TEXT;
|
||||
ALTER TABLE job_audit ADD COLUMN request_sequence INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE job_audit ADD COLUMN request_json TEXT;
|
||||
ALTER TABLE job_audit ADD COLUMN owner_id TEXT;
|
||||
ALTER TABLE job_audit ADD COLUMN lease_until TEXT;
|
||||
ALTER TABLE job_audit ADD COLUMN attempt INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE job_audit ADD COLUMN fencing_token INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE job_audit ADD COLUMN available_at TEXT NOT NULL DEFAULT '1970-01-01T00:00:00Z';
|
||||
ALTER TABLE job_audit ADD COLUMN cancel_requested INTEGER NOT NULL DEFAULT 0;
|
||||
INSERT OR IGNORE INTO tenant (id, name, slug) VALUES ('00000000-0000-0000-0000-000000000000', 'EvoBGP system jobs', 'evobgp-system-jobs');
|
||||
CREATE INDEX idx_job_audit_claim ON job_audit (available_at, created_at) WHERE status = 'queued';
|
||||
CREATE INDEX idx_job_audit_expired_lease ON job_audit (lease_until) WHERE status = 'running';
|
||||
UPDATE job_audit SET owner_id = 'legacy-unfenced', lease_until = strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '+15 minutes'), attempt = 1
|
||||
WHERE status = 'running' AND lease_until IS NULL;
|
||||
@@ -0,0 +1,7 @@
|
||||
DROP TABLE deployment_speaker;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN deployment_job_id;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN deployment_request_sequence;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN deployment_generation;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN delivery_owner;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN delivery_token;
|
||||
ALTER TABLE bgp_speaker DROP COLUMN delivery_until;
|
||||
@@ -0,0 +1,27 @@
|
||||
ALTER TABLE bgp_speaker ADD COLUMN deployment_generation INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE bgp_speaker ADD COLUMN deployment_request_sequence INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE bgp_speaker ADD COLUMN deployment_job_id TEXT;
|
||||
ALTER TABLE bgp_speaker ADD COLUMN delivery_owner TEXT;
|
||||
ALTER TABLE bgp_speaker ADD COLUMN delivery_token INTEGER NOT NULL DEFAULT 0;
|
||||
ALTER TABLE bgp_speaker ADD COLUMN delivery_until TEXT;
|
||||
CREATE TABLE deployment_speaker (
|
||||
job_id TEXT NOT NULL REFERENCES job_audit(id) ON DELETE CASCADE,
|
||||
tenant_id TEXT NOT NULL REFERENCES tenant(id) ON DELETE CASCADE,
|
||||
speaker_id TEXT NOT NULL REFERENCES bgp_speaker(id) ON DELETE CASCADE,
|
||||
revision_id TEXT NOT NULL,
|
||||
generation INTEGER NOT NULL,
|
||||
request_sequence INTEGER NOT NULL,
|
||||
state TEXT NOT NULL,
|
||||
confirmation TEXT NOT NULL DEFAULT '',
|
||||
error_message TEXT NOT NULL DEFAULT '',
|
||||
health_received_at TEXT,
|
||||
health_observation_token INTEGER NOT NULL DEFAULT 0,
|
||||
health_revision_id TEXT NOT NULL DEFAULT '',
|
||||
health_source_at TEXT NOT NULL DEFAULT '',
|
||||
health_error TEXT NOT NULL DEFAULT '',
|
||||
retry_round INTEGER NOT NULL DEFAULT 0,
|
||||
dispatch_attempts INTEGER NOT NULL DEFAULT 0,
|
||||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY(job_id,speaker_id)
|
||||
);
|
||||
CREATE INDEX deployment_speaker_tenant_job ON deployment_speaker(tenant_id,job_id);
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE telemetry_snapshot;
|
||||
@@ -0,0 +1,21 @@
|
||||
CREATE TABLE telemetry_snapshot (
|
||||
tenant_id TEXT NOT NULL REFERENCES tenant(id) ON DELETE CASCADE,
|
||||
target_id TEXT NOT NULL,
|
||||
speaker_id TEXT REFERENCES bgp_speaker(id) ON DELETE SET NULL,
|
||||
kind TEXT NOT NULL CHECK (kind IN ('remote_agent','local_bird')),
|
||||
local_authority TEXT NOT NULL DEFAULT '',
|
||||
config_fingerprint TEXT NOT NULL DEFAULT '',
|
||||
bgp_json TEXT NOT NULL DEFAULT '{}',
|
||||
health_json TEXT NOT NULL DEFAULT '{}',
|
||||
next_poll_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
failure_count INTEGER NOT NULL DEFAULT 0,
|
||||
discovery_cursor INTEGER NOT NULL DEFAULT 0,
|
||||
last_refresh_requested_at TEXT,
|
||||
refresh_pending INTEGER NOT NULL DEFAULT 0,
|
||||
owner_id TEXT,
|
||||
fencing_token INTEGER NOT NULL DEFAULT 0,
|
||||
lease_until TEXT,
|
||||
PRIMARY KEY (tenant_id,target_id)
|
||||
);
|
||||
CREATE INDEX telemetry_snapshot_due ON telemetry_snapshot(next_poll_at) WHERE owner_id IS NULL;
|
||||
CREATE INDEX telemetry_snapshot_speaker ON telemetry_snapshot(speaker_id);
|
||||
@@ -0,0 +1,3 @@
|
||||
DROP TABLE IF EXISTS render_revision_manifest;
|
||||
ALTER TABLE module_prefix_snapshot DROP COLUMN snapshot_version;
|
||||
DROP TABLE IF EXISTS tenant_render_generation;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- SQLite is used for schema parity and local fixtures; the production render
|
||||
-- admission barrier is implemented by the PostgreSQL repository.
|
||||
CREATE TABLE tenant_render_generation (
|
||||
tenant_id TEXT PRIMARY KEY REFERENCES tenant(id) ON DELETE CASCADE,
|
||||
generation INTEGER NOT NULL DEFAULT 1
|
||||
);
|
||||
INSERT INTO tenant_render_generation(tenant_id, generation) SELECT id, 1 FROM tenant;
|
||||
ALTER TABLE module_prefix_snapshot ADD COLUMN snapshot_version INTEGER NOT NULL DEFAULT 0;
|
||||
CREATE TABLE render_revision_manifest (
|
||||
revision_id TEXT PRIMARY KEY REFERENCES config_revision(id) ON DELETE CASCADE,
|
||||
tenant_id TEXT NOT NULL REFERENCES tenant(id) ON DELETE CASCADE,
|
||||
config_generation INTEGER NOT NULL,
|
||||
manifest_json TEXT NOT NULL
|
||||
);
|
||||
Reference in new issue
Block a user