munin/internal/store/speicher.go

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.
// Kapazitaet beschreibt, wie viele Datenbankverbindungen Munin belegen darf.
// Die Rechnung dahinter steht bei PruefeKapazitaet (speicher_postgres.go).
type Kapazitaet struct {
Begrenzt bool // false: keine gemeinsame Grenze (SQLite)
Erlaubt int // max_connections des Servers
Reserve int // bleibt frei für psql, pg_dump, Superuser
JeWorkspace int // so viele belegt ein geöffneter Workspace höchstens
Fest 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 Kapazitaet) MaxWorkspaces() int {
if !k.Begrenzt || k.JeWorkspace == 0 {
return 0
}
return (k.Erlaubt - k.Reserve - k.Fest) / k.JeWorkspace
}
type Speicher 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
// PruefeKapazitaet meldet einen Fehler, wenn anzahl Workspaces mehr
// Verbindungen bräuchten, als die Datenbank erlaubt. Bei SQLite gibt es
// diese Grenze nicht.
PruefeKapazitaet(ctx context.Context, anzahl int) error
// Kapazitaet beschreibt die Grenze der Datenbankverbindungen — für die
// Systemseite. Bei SQLite gibt es keine (Begrenzt = false).
Kapazitaet(ctx context.Context) (Kapazitaet, error)
// Ort 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.
Ort(workspaceID string) string
// Hinweise nennt Auffälligkeiten des Speichers, die den Betrieb nicht
// verhindern, aber behoben werden sollten — für die Systemseite. Leer,
// wenn alles in Ordnung ist.
Hinweise() []string
// Beschreibung sagt für das Startprotokoll, wo die Daten liegen — ohne
// Passwort.
Beschreibung() 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
}