Phase6
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
-- Phase 6: Multi-node scheduling, start queue, node capacity
|
||||
|
||||
CREATE TYPE "StartQueueStatus" AS ENUM ('QUEUED', 'DISPATCHED', 'CANCELLED', 'EXPIRED');
|
||||
|
||||
ALTER TYPE "GameServerStatus" ADD VALUE IF NOT EXISTS 'QUEUED';
|
||||
ALTER TYPE "GameServerStatus" ADD VALUE IF NOT EXISTS 'UNKNOWN';
|
||||
|
||||
ALTER TABLE "game_nodes"
|
||||
ADD COLUMN IF NOT EXISTS "maxRamMb" INTEGER NOT NULL DEFAULT 16384,
|
||||
ADD COLUMN IF NOT EXISTS "platformRamMb" INTEGER NOT NULL DEFAULT 2048,
|
||||
ADD COLUMN IF NOT EXISTS "drainRequestedAt" TIMESTAMPTZ(3);
|
||||
|
||||
CREATE TABLE "server_start_queue" (
|
||||
"id" TEXT NOT NULL,
|
||||
"serverId" TEXT NOT NULL,
|
||||
"nodeId" TEXT NOT NULL,
|
||||
"status" "StartQueueStatus" NOT NULL DEFAULT 'QUEUED',
|
||||
"priority" INTEGER NOT NULL DEFAULT 0,
|
||||
"correlationId" TEXT,
|
||||
"requestedAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"expiresAt" TIMESTAMPTZ(3),
|
||||
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "server_start_queue_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "server_start_queue_serverId_key" ON "server_start_queue"("serverId");
|
||||
CREATE INDEX "server_start_queue_status_priority_requestedAt_idx" ON "server_start_queue"("status", "priority", "requestedAt");
|
||||
CREATE INDEX "server_start_queue_nodeId_idx" ON "server_start_queue"("nodeId");
|
||||
|
||||
ALTER TABLE "server_start_queue"
|
||||
ADD CONSTRAINT "server_start_queue_serverId_fkey"
|
||||
FOREIGN KEY ("serverId") REFERENCES "game_servers"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE "server_start_queue"
|
||||
ADD CONSTRAINT "server_start_queue_nodeId_fkey"
|
||||
FOREIGN KEY ("nodeId") REFERENCES "game_nodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -34,11 +34,13 @@ enum GameServerStatus {
|
||||
PROVISIONING
|
||||
INSTALLING
|
||||
STOPPED
|
||||
QUEUED
|
||||
STARTING
|
||||
RUNNING
|
||||
STOPPING
|
||||
BACKING_UP
|
||||
RESTORING
|
||||
UNKNOWN
|
||||
ERROR
|
||||
DELETING
|
||||
DELETED
|
||||
@@ -57,6 +59,13 @@ enum AllocationStatus {
|
||||
RELEASED
|
||||
}
|
||||
|
||||
enum StartQueueStatus {
|
||||
QUEUED
|
||||
DISPATCHED
|
||||
CANCELLED
|
||||
EXPIRED
|
||||
}
|
||||
|
||||
enum JobStatus {
|
||||
PENDING
|
||||
RUNNING
|
||||
@@ -282,6 +291,7 @@ model GameServer {
|
||||
backupSchedule BackupSchedule?
|
||||
worldUploads WorldUpload[]
|
||||
installedAddons InstalledAddon[]
|
||||
startQueueEntry ServerStartQueueEntry?
|
||||
|
||||
@@index([userId])
|
||||
@@index([nodeId])
|
||||
@@ -333,18 +343,22 @@ model GameNode {
|
||||
hostname String
|
||||
status GameNodeStatus @default(OFFLINE)
|
||||
maxServers Int @default(10)
|
||||
maxRamMb Int @default(16384)
|
||||
platformRamMb Int @default(2048)
|
||||
activeServers Int @default(0)
|
||||
lastHeartbeatAt DateTime? @db.Timestamptz(3)
|
||||
agentVersion String?
|
||||
enrollmentTokenHash String?
|
||||
enrolledAt DateTime? @db.Timestamptz(3)
|
||||
drainRequestedAt DateTime? @db.Timestamptz(3)
|
||||
metadata Json?
|
||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||
|
||||
gameServers GameServer[]
|
||||
heartbeats GameNodeHeartbeat[]
|
||||
allocations GameServerAllocation[]
|
||||
gameServers GameServer[]
|
||||
heartbeats GameNodeHeartbeat[]
|
||||
allocations GameServerAllocation[]
|
||||
startQueueEntries ServerStartQueueEntry[]
|
||||
|
||||
@@map("game_nodes")
|
||||
}
|
||||
@@ -362,6 +376,26 @@ model GameNodeHeartbeat {
|
||||
@@map("game_node_heartbeats")
|
||||
}
|
||||
|
||||
model ServerStartQueueEntry {
|
||||
id String @id @default(uuid())
|
||||
serverId String @unique
|
||||
nodeId String
|
||||
status StartQueueStatus @default(QUEUED)
|
||||
priority Int @default(0)
|
||||
correlationId String?
|
||||
requestedAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
expiresAt DateTime? @db.Timestamptz(3)
|
||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||
|
||||
server GameServer @relation(fields: [serverId], references: [id], onDelete: Cascade)
|
||||
node GameNode @relation(fields: [nodeId], references: [id])
|
||||
|
||||
@@index([status, priority, requestedAt])
|
||||
@@index([nodeId])
|
||||
@@map("server_start_queue")
|
||||
}
|
||||
|
||||
model Plan {
|
||||
id String @id @default(uuid())
|
||||
name String @unique
|
||||
|
||||
Reference in New Issue
Block a user