munin/internal/store/backend.go
2026-10-19 10:13:56 +02:00

79 lines
3.1 KiB
Go

package store
import "context"
// Speicher entscheidet, WO die Daten liegen: in SQLite-Dateien oder in einer
// PostgreSQL-Datenbank (AUSBAUSTUFEN.md 4.10).
//
// main.go wählt beim Start anhand von DB_DRIVER genau einen Speicher aus und
// reicht ihn weiter. Alles danach — ControlStore, Store, Suchindex, Handler —
// weiß nicht und muss nicht wissen, welcher es ist.
//
// # Wie die beiden Speicher die Daten aufteilen
//
// SQLite PostgreSQL
// Kontroll-Datenbank <DATA_DIR>/control.db Schema munin_control
// je Workspace workspaces/<id>.db Schema munin_ws_<id>
//
// In beiden Fällen bekommt jeder Workspace seinen eigenen, abgeschotteten
// Bereich mit denselben Tabellen.
// Capacity beschreibt, wie viele Datenbankverbindungen Munin belegen darf.
// Die Rechnung dahinter steht bei CheckCapacity (backend_postgres.go).
type Capacity struct {
Limited bool // false: keine gemeinsame Grenze (SQLite)
Allowed int // max_connections des Servers
Reserve int // bleibt frei für psql, pg_dump, Superuser
PerWorkspace int // so viele belegt ein geöffneter Workspace höchstens
Fixed int // Kontroll-Datenbank und Verwaltungsverbindung
}
// MaxWorkspaces ist die Zahl der Workspaces, die mit dieser Grenze höchstens
// gleichzeitig geöffnet sein können.
func (k Capacity) MaxWorkspaces() int {
if !k.Limited || k.PerWorkspace == 0 {
return 0
}
return (k.Allowed - k.Reserve - k.Fixed) / k.PerWorkspace
}
type Backend interface {
// OpenControl öffnet die Kontroll-Datenbank und bringt ihr Schema auf den
// aktuellen Stand.
OpenControl() (*ControlStore, error)
// OpenWorkspace öffnet den Bereich eines Workspace. Gibt es ihn noch
// nicht, wird er angelegt.
OpenWorkspace(workspaceID string) (*Store, error)
// DeleteWorkspace entfernt den Bereich eines Workspace unwiderruflich.
// Der Store dazu muss vorher geschlossen sein (siehe workspace.Manager).
DeleteWorkspace(workspaceID string) error
// CheckCapacity meldet einen Fehler, wenn anzahl Workspaces mehr
// Verbindungen bräuchten, als die Datenbank erlaubt. Bei SQLite gibt es
// diese Grenze nicht.
CheckCapacity(ctx context.Context, count int) error
// Capacity beschreibt die Grenze der Datenbankverbindungen — für die
// Systemseite. Bei SQLite gibt es keine (Begrenzt = false).
Capacity(ctx context.Context) (Capacity, error)
// Location nennt, wo die Daten eines Workspace liegen: den Schemanamen
// (PostgreSQL) bzw. die Datei (SQLite). Für die Workspace-Übersicht des
// Plattform-Admins, damit sich ein Workspace in der Datenbank wiederfinden
// lässt.
Location(workspaceID string) string
// Hints nennt Auffälligkeiten des Speichers, die den Betrieb nicht
// verhindern, aber behoben werden sollten — für die Systemseite. Leer,
// wenn alles in Ordnung ist.
Hints() []string
// Description sagt für das Startprotokoll, wo die Daten liegen — ohne
// Passwort.
Description() string
// Close gibt alles frei, was der Speicher selbst offen hält (nicht die
// geöffneten Stores — die schließt ihr jeweiliger Besitzer).
Close() error
}